HoG

时间:2021-05-14 23:57:39

实现步骤

  1. 先计算每一个像素点位置上x和y方向上的梯度. 这样在每一个像素点位置上得到一个二维向量, 计算它的方向和模长
  2. 将图片分为一个个的cell, 如\(8\times 8\). 计算它的HOG: cell内的每个像素都给它的梯度方向所在bin投票, 票的权重是梯度向量的模长.
  3. 将cell组成一个个block, 例如\(4 \times 4\)个cell一个block. Block与block之间可以重叠. 将block内所有cell的HOG拼成一个一维向量, 然后normalize.
  4. 将一张图片上的所有block的HOG拼接起来成为一个单独的列向量, 作为图片整体的特征向量.

    HoG

可以指定的参数

  1. cell的大小, block的大小与步长
  2. 计算梯度时: 使用的mask类型, 如\([-1, 0, 1], [-1, 0, 1]^T\)或Sobel mask
  3. 计算histogram: gradient的方向是在0到180度还是0到360度, bin的数量.
  4. 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