亲们,今天小编把剩下的一篇博文在这里重新发表。这两天,小编很勤奋呢!天气转凉,亲们要多注意保暖哦!

原文如下:

前段时间,写了一篇《matlab Hog特征提取浅析》,当时只是完成了对Hog特征提取方法的简单原理分析。最近,我深入地研究了Hog特征的提取方法,并运用积分直方图对其加速。为了便于以后运用,特将这一过程中的构思,方法,问题一一记录下来。

相关资料:

提取Hog特征的方法是先把窗口图像分割成cell,再把cell分割成block。然后提取block中各像素点的方向梯度合成直方图,最后把这些block的直方图组合起来就得到了图像的Hog特征。

下面具体说一下我的编程思路。

主程序(Main.m):

在主程序中,我遍历了指定文件夹下(“E:\HOG\HogSamples\”)的指定后缀名(*.bmp)的文件。并将遍历得到的图像作为窗口图像传递给了ExtrHogFeature函数。ExtrHogFeature函数就是我编写的,用来提取Hog特征的函数。

ExtrHogFeature函数:

在ExtrHogFeature函数中:

1. 参数意义:

(1) .imgFile:输入的窗口图像文件。

(2).cellStep:cell的步长,即一个cell有多少个像素。理论上,cell的宽和高是可以不一样的,但是在实际编写程序时,这么做没有多大的意义,单纯增加代码量。所以,我只设置一个cellStep,默认cell是正方形。同理,下面的blockStep和overlap也是这样。

(3).blockStep:block的步长,即一个block有多少个cell。注意:不是有多少个像素,是有多少个cell。

(4).overlap:重叠数目。即后(下)一个block与前(上)一个block有几列(行)cell重叠。

(5).angle:只能是两个值,180或者360。

(6).binNum:积分直方图的区域数量。

2.判断输入参数是否正确。

(1).判断参数的数量。参数的数量只能是两种,1个或者6个。如果是1个,对除imgFile之外的其他参数进行默认赋值。

(2).判断overlap是否正确。因为overlap表示两个block之间的重叠数量。所以,overlap不能大于或者等于blockStep。

(3).判断angle是否正确。angle只能是180或360。

3.判断图像的维数,并进行灰度化。这一步对应着相关资料1中的“标准化gamma空间和颜色空间”。从数学原理上看,只是对图像矩阵进行了开方。为了简化计算,对窗口图像进行灰度化。

4.校正窗口图像的宽和高。在提取图像特征时,我一直秉持“不能减少图像的特征”的原则,即不能对图像进行裁剪。因为原始图像的宽和高,不一定能生成整数量的cell,更不一定能生成整数量的block。所以,需要利用双线性插值对原始图像进行校正(即缩放),使能生成整数量的block。

举个例子:ExtrHogFeature(testImg,3,4,2,180,9),其中testImg是宽和高均为20个像素的测试窗口图像。cellStep=3,cellNum_W(每行cell的个数)=20/3=6.6,取cellNum_W =ceil(20/3)=7。

设blockNum_W是每一行block的数量,满足下列公式:

(blockStep - overlap) * (blockNum_W - 1) + blockStep >= cellNum_W   ①

取满足公式的最小整数。即:

blockNum_W = floor((cellNum_W - blockStep) / (blockStep - overlap)) + 1   ②

由①式计算得出,blockNum_W>=2.5,所以(也可由②式得)blockNum_W=3。cellNum_W=(4-2)*(3-1)+4=8。所以,经过校正后的图像corrImg的宽corrW=8*3=24个像素。corrH计算同理。

根据corrW和corrH,对原始图像进行双线性插值的缩放。双线性插值的函数BiliInter在本篇的末尾。因为不是本篇的主要内容,且易于理解,所以不做额外的讲解。

5.计算每个像素的方向梯度。水平模板fx=[-1,0,1],垂直模板fy=fx’。 为了计算corrImg的4条边上的方向梯度,要将4条边翻转。同双线性插值一样,翻转图像的函数FlipImg也在本篇的末尾。

注意:atan和atan2的区别。atan(y/x)根据正切值y/x求出对应的角度,是2象限的反正切。atan2(y,x)的取值不仅取决于y/x的正切值,还取决于(x,y)落于哪个象限,是4象限的反正切。所以,当angle=180的时候,经过atan计算小于0的值是在-pi/2~0之间,需要+pi,把反正切值校正到pi/2~pi。当angle=360的时候,经过atan2计算小于0的值是在-pi~0之间,需要+2pi,把反正切值校正到pi~2pi。

Axy中可能会出现0/0=Nan的情况,造成程序中止。所以,要有Axy(isnan(Axy)) = 0。

6. 计算原始窗口图像的积分直方图inteHist。我是根据相关资料2,编写整理的代码。将资料中的2维的积分图计算方法做了适当的修改,应用到3维的积分直方图计算。

7. 利用积分直方图,计算窗口图像的每个block的积分直方图,把这些block的直方图组合起来就得到了图像的Hog特征。并归一化到0~1000的范围内。

BiliInter函数:

FlipImg函数:

Limage在github上的链接:。