HOG特徵提取 matlab
阿新 • • 發佈:2019-01-03
網上有很多大神寫的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特徵放到分類器中進行訓練了。