了解了SIFT算子之后,来看看HOG算子吧~其实仔细看看,会发现HOG和SIFT特征感觉像是孪生兄弟呢~当然,即便如此,两者之间仍是有较为明显的差别,那就来看看吧~
HOG——Histogram Orientated Graphic(方向梯度直方图)
通过计算和统计图像局部区域的梯度方向直方图来构成特征(类似于SIFT中8个方向梯度直方图统计)。
在这儿参考了一篇写得比较详细的博客Hog描述子。
先来说说Hog描述子形成的整体流程:
对整幅图像用b*b大小的blocks窗口进行滑动,则整幅图像有s个blocks,其中s=((m-b)/stride+1)*((n-b)/stride+1);另外,对于两blocks重叠的cells单元,进行对比度归一化,能有效第去除光照的影响以提高精确度。每个blocks划分成c个cells,每个cells包含若干个像素点,针对每个cells,计算其中每个像素的梯度方向及幅值,并统计出该cell中的方向梯度直方图(按一定权重,此处权重的选择可根据L2,L1范式等确定),确定直方图所包含的bins的个数b,最后针对每个block进行特征归一化,以消除因光照,阴影和边缘变化等的影响,最后整张图可由一个s*c*b的高维向量组成,至此便完成了HoG描述子的生成。
需要注意的是:在形成描述子的过程中有几个超参数需要注意,首先是整张图片划分成多少个blocks,每个blocks划分成多少个cells比较合适,另外对cells进行直方图统计时,选取多少个bins较为适宜,这些均是根据不同需求所需进行设计的参数选择。若blocks取得太大,则归一化的效果被削弱使得错误率提升,若取得太小,则相邻blocks间有用的信息可能被过滤掉了。
HoG描述子最初的应用是用于行人检测,根据研究者大量的实验得出在针对行人检测时,选择的blocks大小为3*3个单元格,cells数为6*6,bins数为将0~180度角度无方向划分成9个bins。并且因为针对行人检测,需要有较明显的边缘信息,故在预处理时没有对其进行高斯平滑,但是在处理时,因为需要计算梯度信息,对于噪点的处理经常需要考虑到进行平滑操作,故需针对具体问题进行具体分析。
在这儿想进行说明的是HoG描述子与SIFT描述子之间的区别:
可以看到,HoG与SIFT均进行了梯度方向直方图的统计操作,但不同的是,其针对的进行统计的对象不同,HoG进行统计归一化是局部区域的block,而SIFT在进行统计之前需要确定特征点,再取特征点周围一定范围进行直方图统计。
由产生过程可知,HoG不具有尺度和旋转不变性。
效果展示:
*R-HOG指的是block选用的是矩形,C-HOG指block选用的是圆形。
HoG+SVM进行行人检测是比较成熟的方法,另外opencv中也有相应的实现函数接口。