本文不详细介绍HOG的原理,主要介绍HOG提取人脸特征的具体操作过程,程序采用matlab编写:
参考博客:http://blog.csdn.net/hujingshuang/article/details/47337707/(C++)
简单说一下思路:我们要提取整个人脸的hog特征,可以将人脸分成很多个block,通过提取block的hog特征,然后将所有的block的hog特征串联即可得到人脸特征,同理,要提取每个block的hog特征,我们又可以将block划分成多个cell,通过提取cell的hog特征,最后再通过串联组成block的cell的hog特征,即可获取block特征。
到底什么是hog特征,顾名思义,就是梯度方向直方图,你只要知道提取出的hog特征可以很好地表征行人目标的外形轮廓,至于整个原理,可以搜搜网上的资料。
1. 对输入图像求灰度图像并对其进行归一化:
我采用的是Gamma校正法对输入图像进行颜色空间的标准化(归一化);
目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰
我们假设输入的图像大小是M*N个像素,M代表图像宽度,N代表图像高度;比如一副图片220*310=68200个像素大小,即该图片由68200个点组成
2.计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰
我们可以分别用一个与图片等大小的矩阵来表征图片上每个像素点的梯度值和方向
梯度值的求法:1.可以用matlab自带的函数gradient。
[GradientX,GradientY]=gradient(G); %G表示经过上诉步骤处理后的图像矩阵,大小同样为M*N,矩阵的每个位置的值就代表像素点的值
2. 也可以用卷积运算求梯度
kx=[-1 0 1]; %水平方向梯度算子
ky=[-1 0 1]';%垂直方向梯度算子
grad_x=conv2(G,kx,'valid'); %水平方向梯度
grad_y=conv2(G,ky,'valid'); %垂直方向梯度
Gr=sqrt(grad_x.^2+grad_y.^2); %计算出了每个像素点的梯度值
方向的求法:
YX=grad_y./grad_x;
if angle==180
grad_angle= ((atan(YX)+(pi/2))*180)./pi;
elseif angle==360
grad_angle= ((atan2(grad_y,grad_x)+pi).*180)./pi;
end
3.将图像划分成小cells,提取每个cell的hog特征
% orient bin
bin_angle=angle/bin_num;
grad_orient=ceil(grad_angle./bin_angle);