Hog特征综述
背景
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。它是一种能够很好地描述图像局部纹理或边缘的方向密度分布的一种特征。Hog特征结合 SVM分类器用于行人检测具有很好效果。
两个概念
像素点梯度与梯度方向
假设图像中像素点(x,y)的像素值为:
用表示水平方向梯度: = -
用 表示垂直方向梯度: = -
(x, y)像素点的梯度幅值跟梯度方向
用表示梯度幅值: = (A)
用表示梯度方向: = (B)
梯度方向直方图
如上面公式(B)所计算得到的梯度方向是在0度~360度之间,为了便于统计,我们将360度(2*PI)根据需要分割成若干个bin。例如:分割成12个bin,每个bin包含30度,如果图像中某个像素点的梯度方向计算为26度,我们就把0~30度这个bin计数加一个权值,如果某个像素点的梯度方向计算为45度,我们就把30~60度这个bin计数加一个权值,这个权值取这个像素点的梯度幅值。依此类推,我们就统计了图像的梯度方向直方图,如下图:
Hog特征实现方法
综述
Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在落在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元(cell)。最后将所有块的特征串联起来就形成了图像中目标的Hog特征。例如,对于64*128的图像而言,每2*2的单元(16*16的像素)构成一个块,每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。
具体步骤
在实际目标检测过程中,除了上面提到的HOG特征提取过程,还包括彩图转灰度,亮度校正等步骤。总结一下,在目标检测中,HOG特征计算主要的步骤:
(1)将输入的彩图转换为灰度图:
目的是方便计算梯度,弱化颜色对梯度的影响,也可以用三通道图像中梯度最大的通道来计算;
(2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化):
目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
(3)用公式(A)、(B)计算单元中每个像素点梯度:
主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
(4)按上述描述将检测窗口划分成很多单元cells(例如6*6像素/cell),将相邻的几个cells组成块(例如3*3个cell/block)。
(5)将梯度投影到单元的梯度方向:
目的是为局部图像区域提供一个编码,
(6)将所有单元格在块上进行归一化:
归一化能够更进一步对光照、阴影和边缘进行压缩,通常,每个单元格由多个不同的块共享,但它的归一化是基于不同块的,所以计算结果也不一样。因此,一个单元格的特征会以不同的结果多次出现在最后的向量中。我们将归一化之后的块描述符就称之为HOG描述符。
(7)收集得到检测窗口块的HOG特征:
该步骤就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。
如下图::
Opencv中Hog特征
opencv中关于hog特征的源码文件是Objdetect.hpp,其中HOGDescriptor结构体表述了Hog特征类。在默认情况下,winSize(64,128)表示检测窗口大小宽64,高128;blockSize(16,16)表示块的大小,宽16,高16;blockStride(8,8)表示块的滑动步长为水平方向8垂直方向8;cellSize(8,8)表示单元的大小,宽8高8;nbins(9)表示将梯度方向的360度划分成9个bins来统计直方图。
如下图形象的表示了opencv中Hog特征的提取方式: