Histogram of oriented gradients 简称 HoG, 是计算机视觉和图像处理领域一种非常重要的特征,被广泛地应用于物体检测,人脸检测,人脸表情检测等。
HoG 最早是在2005 年的CVPR 上由 Navneet Dalal 和 Bill Triggs 提出来的。HoG 的算法很简单,对于物体的特征表示却非常有效。简单而高效,这大概也是其从被提出来之后,就被CV界广泛使用的原因所在。
下面简单介绍一下HoG 的算法:
首先是计算梯度:
我们知道图像上一点,在水平方向和垂直方向都存在梯度,假设其水平方向上的梯度为 Gx , 垂直方向上的梯度为 Gy , 我们可以从下面的表达式计算其梯度:
接下来,要计算该点的orientation,首先计算梯度形成的正切角,
一般来说 K=9 , 那么 Δ=20 , Ori 的范围就是 0-8, 图像上每一个点都有一个正切角 θ , 并且可以得到每个像素点的orientation, 可以对这些orientation 做统计,就能得到一个histogram, 即直方图。所以称为 Histogram of oriented gradients.
我们可以看到,如果 K 定了的话,那么 histogram 的长度也就定了。如果在整张图像上都用这一个histogram 来统计,那么不管图像的尺寸多大,最终的histogram还是长度为K。很显然,这不是我们希望看到的,这样必然会丢失很多信息。所以就有block representation.
block representation, 简单来说,就是将图像进行分块, 将图像分成一块一块,每一块都可以用一个histogram 做统计,然后将每一块的histogram 连起来,形成一个长的的histogram。block representation 也是局部特征提取最常用到的一种方式。
图像分块,也有两种方式,一种是overlap,一种是non-overlap,也就是说块与块之间有重叠,或者没有重叠。在计算HoG的时候,一般都会选择overlap 的分块方式。
MATLAB 中已经集成了HoG 的函数,可以直接调用库函数计算HoG. 这个函数的调用形式如下:
[f1, visualization]=extractHOGFeatures(I)
其中 I 是输入的图像, f1 就是计算得到的HoG 特征,是一个高维的histogram, visualization 是将HoG 进行可视化的一个 object 变量。
这个函数的输入变量有很多,除了输入图像I 之外,还有一些其它的变量, 一般都会采用默认的缺省值。
下面逐一介绍这些缺省变量:
cellsize: [8 ,8], 这是计算HoG的最小块了,每个 8×8 的 cell 都可以得到一个histogram。
Blocksize: [2, 2], 这是说明一个block 含有多少个cell,[2 2] 意味着一个block 含有 2×2 个cell。
BlockOverlap: 这是说明block 之间重叠部分的大小,以cell的个数来表示,默认值是一半的cell都有重叠。
NumBins: 就是上面提到的K,默认值为9。
UseSignedOrientation: 就是上面提到的角度的取值范围,默认为无符号的角度范围,即 0∘−180∘
所以说,采用默认值计算,虽然一个cell 的histogram的长度只有9,但是一个block 有4 个 cell,那么一个block 的histogram 的长度变成了36,对于一张尺寸为 64×64 的图像来说,采用overlap 的分块方式,将有 49 个block,所以最终 HoG 的长度是 36×64=1764 . 图像尺寸越大,HoG 的长度也会随之增长。不过总得来说,HoG 还算是一种简洁紧凑的特征。比起Gabor,LBP,SIFT 来说,算是比较经济实惠,性价比很高的了。
最后给出一个例子:
参考来源
https://en.wikipedia.org/wiki/Histogram_of_oriented_gradientsDalal N, Triggs B. Histograms of oriented gradients for human detection[C]//Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on. IEEE, 2005, 1: 886-893.