实现步骤
- 先计算每一个像素点位置上x和y方向上的梯度. 这样在每一个像素点位置上得到一个二维向量, 计算它的方向和模长
- 将图片分为一个个的cell, 如\(8\times 8\). 计算它的HOG: cell内的每个像素都给它的梯度方向所在bin投票, 票的权重是梯度向量的模长.
- 将cell组成一个个block, 例如\(4 \times 4\)个cell一个block. Block与block之间可以重叠. 将block内所有cell的HOG拼成一个一维向量, 然后normalize.
- 将一张图片上的所有block的HOG拼接起来成为一个单独的列向量, 作为图片整体的特征向量.
可以指定的参数
- cell的大小, block的大小与步长
- 计算梯度时: 使用的mask类型, 如\([-1, 0, 1], [-1, 0, 1]^T\)或Sobel mask
- 计算histogram: gradient的方向是在0到180度还是0到360度, bin的数量.
- block normalize的方法
如何从不同大小的图片中提取出相同维度的特征?
通常做法是resize到相同大小
Tips
不需要对输入的图片进行平滑操作
参考
https://www.youtube.com/watch?v=0Zib1YEE4LU
https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients
https://github.com/scikit-image/scikit-image/blob/master/skimage/feature/_hog.py skimage的hog实现, 代码注释很详细.
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_ml/py_svm/py_svm_opencv/py_svm_opencv.html