1. 程式人生 > >HOG特徵提取 matlab

HOG特徵提取 matlab

網上有很多大神寫的hog的原理,這裡就不介紹了,本文主要用matlab實現求影象的hog特徵,主要參考了
http://blog.csdn.net/dulingtingzi/article/details/51488060
http://blog.csdn.net/hujingshuang/article/details/47337707/
感謝博主。
求hog特徵的主要步驟如下:
1、灰度化;
2、gamma校正;
3、求每個畫素的梯度和方向;
4、劃分cell(8*8pixel/cell),根據幅值和方向求取每個cell的梯度直方圖;
5、組合block(2*2cell/block),將這4個cell的梯度直方圖連在一起作為該block的特徵向量;
6、將所有的block的特徵向量組合起來,即為該影象的hog特徵向量。

程式碼如下:

clear;clc;

img=imread('C:\Users\Administrator\Desktop\lena.jpg');

% 1、%灰度化
img=rgb2gray(img);
img=double(img);

step=8;      %step*step個畫素作為一個cell
[m1 n1]=size(img);
%改變影象尺寸為step的最近整數倍
img=imresize(img,[floor(m1/step)*step,floor(n1/step)*step],'nearest');
[m n]=size(img);

% 2、%伽馬校正
img=sqrt
(img); % 3、求梯度和方向 fy=[-1 0 1]; %定義豎直模板 fx=fy'; %定義水平模板 Iy=imfilter(img,fy,'replicate'); %豎直梯度 Ix=imfilter(img,fx,'replicate'); %水平梯度 Ied=sqrt(Ix.^2+Iy.^2); %梯度值 Iphase=Iy./Ix; %邊緣斜率,有些為inf,-inf,nan,其中nan需要再處理一下 the=atan(Iphase)*180/3.14159; %求梯度角度 for
i=1:m for j=1:n if(Ix(i,j)>=0&Iy(i,j)>=0) %第一象限 the(i,j)=the(i,j); elseif(Ix(i,j)<=0&Iy(i,j)>=0) %第二象限 the(i,j)=the(i,j)+180; elseif(Ix(i,j)<=0&Iy(i,j)<=0) %第三象限 the(i,j)=the(i,j)+180; elseif(Ix(i,j)>=0&Iy(i,j)<=0) %第四象限 the(i,j)=the(i,j)+360; end if isnan(the(i,j))==1 %0/0會得到nan,如果畫素是nan,重設為0 the(i,j)=0; end end end the=the+0.000001; %防止角度為0 % 4、劃分cell,求cell的直方圖( 1 cell = 8*8 pixel ) clear i j; %下面是求cell step=8; %step*step個畫素作為一個cell orient=9; %方向直方圖的方向個數 jiao=360/orient; %每個方向包含的角度數 Cell=cell(1,1); %所有的角度直方圖,cell是可以動態增加的,所以先設了一個 ii=1; jj=1; for i=1:step:m ii=1; for j=1:step:n Hist1(1:orient)=0; for p=1:step for q=1:step %梯度方向直方圖 Hist1(ceil(the(i+p-1,j+q-1)/jiao))=Hist1(ceil(the(i+p-1,j+q-1)/jiao))+Ied(i+p-1,j+q-1); end end Cell{ii,jj}=Hist1; %放入Cell中 ii=ii+1; end jj=jj+1; end % 5、劃分block,求block的特徵值,使用重疊方式( 1 block = 2*2 cell ) clear m n i j; [m n]=size(Cell); feature=cell(1,(m-1)*(n-1)); for i=1:m-1 for j=1:n-1 block=[]; block=[Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)']; block=block./sum(block); %歸一化 feature{(i-1)*(n-1)+j}=block; end end % 6、影象的HOG特徵值 [m n]=size(feature); l=2*2*orient; featureVec=zeros(1,n*l); for i=1:n featureVec((i-1)*l+1:i*l)=feature{i}(:); end

hog特徵值的維數計算如下:
影象大小為256*256,8*8pixel/cell,9bin/cell(將360度劃分為9個區域),2*2cell/block,採用重疊(overlape)方式求block的特徵向量,則有32*32個block,每個block的梯度直方圖為9*2*2個,總維數大小為(32-1)*(32-1)*9*2*2=34596。
然後就可以將該hog特徵放到分類器中進行訓練了。