原文链接: http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html

Histogram of Oriented Gradients

方向梯度直方图特征描述子在目标检测中经常用到,在接下来的实例中,我将计算HOG描述子并将其可视化。

算法说明

HOG特征计算步骤

  1. (可选)全局图像归一化
  2. 计算x和y方向的梯度图像
  3. 计算梯度直方图
  4. 跨区块正规化
  5. 展平为一个特征向量

每步详细步骤

  • 第一阶段应用可选的全局图像归一化均衡,旨在减少光线的影响。实际上,使用gamma(幂定律)压缩,计算每个颜色通道的平方根或对数。图像纹理强度通常与局部表面光线成比例,因此这种压缩有助于减少局部阴影和照明变化的影响。

  • 第二阶段计算一阶图像梯度。这将捕获轮廓,侧影和一些纹理信息,同时提供对光线变化更强的抵抗性。使用局部主导色彩通道,在很大程度上提供了色彩不变性。变体方法还可以包括作为primitive bar detectors的二阶图像衍生物 - 用于捕获的有用特征。例如:像自行车结构和人类四肢的bar。

  • 第三阶段旨在产生对局部图像内容敏感的编码,同时对抵抗姿态或外观的小变化保持抵抗性。采用的方法与SIFT特征相同的方式在本地集中方向梯度信息。图像窗口分为小空间区域,称为“cell”。对于每个cell,我们在cell中的累计所有像素上的局部1-D梯度或边缘方向直方图。这种组合的cell级1-D直方图形成基本的“方向直方图”表示。每个方向直方图将梯度角范围分为固定数量的预定bins。cell中的像素的梯度大小用于投影到方向直方图中。

  • 第四阶段计算标准化,在进入下一阶段之前,将局部的cell群和对比度归一化其总体反应。 归一化引入更好的照度,阴影和边缘对比度的不变性。 通过在本地称为“block”的cell的本地组上累积局部直方图“能量”的度量来执行。 结果用于标准化块中的每个单元格。 通常,每个单独的单元在多个块之间共享,但是其标准化是块依赖的,因此是不同的。 因此,细胞在具有不同归一化的最终输出向量中出现多次。 这似乎是多余的,但它提高了性能。 我们将归一化块描述符称为定向梯度(HOG)直方图描述符。

  • 最后一步将覆盖检测窗口的块的密集重叠网格的所有块的HOG描述符收集到用于窗口分类器的组合特征向量中。

代码与结果

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

from skimage.feature import hog
from skimage import data, color, exposure

image = mpimg.imread('astronaut.png')
fd, hog_image = hog(image[:,:,2], orientations=8, pixels_per_cell=(16, 16),
cells_per_block=(4,4), visualise=True)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8), sharex=True, sharey=True)

ax1.axis('off')
ax1.imshow(image, cmap=plt.cm.gray)
ax1.set_title('Input image')
ax1.set_adjustable('box-forced')

#Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02))

ax2.axis('off')
ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray)
ax2.set_title('Histogram of Oriented Gradients')
ax1.set_adjustable('box-forced')
plt.show()

结果

result