方向梯度直方图#

方向梯度直方图 (HOG) 特征描述符在物体检测中很流行 [1]

在下面的示例中,我们计算了 HOG 描述符 并显示了一个可视化。

算法概述#

通过以下步骤计算方向梯度直方图 (HOG):

  1. (可选)全局图像归一化

  2. 计算 x 和 y 方向的梯度图像

  3. 计算梯度直方图

  4. 跨块归一化

  5. 展平为特征向量

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

第二阶段计算一阶图像梯度。这些捕获轮廓、轮廓和一些纹理信息,同时提供进一步的抗照明变化能力。使用局部主导颜色通道,这在很大程度上提供了颜色不变性。变体方法还可以包括二阶图像导数,它们充当原始条形检测器——一个有用的特征,用于捕获例如自行车中的条形结构和人类中的肢体。

第三阶段旨在生成对局部图像内容敏感,同时对姿势或外观的小变化保持不变的编码。采用的方法以与 SIFT [2] 特征相同的方式在局部汇集梯度方向信息。图像窗口被划分为小的空间区域,称为“单元格”。对于每个单元格,我们累积单元格中所有像素的梯度或边缘方向的局部一维直方图。此组合的单元格级一维直方图形成了基本的“方向直方图”表示。每个方向直方图将梯度角度范围划分为固定数量的预定 bin。单元格中像素的梯度幅度用于投票到方向直方图中。

第四阶段计算归一化,该归一化获取单元格的局部组,并在传递到下一阶段之前对其整体响应进行对比度归一化。归一化引入了更好的照明、阴影和边缘对比度不变性。它是通过累积我们称为“块”的单元格局部组的局部直方图“能量”的度量来执行的。结果用于归一化块中的每个单元格。通常每个单独的单元格在多个块之间共享,但其归一化依赖于块,因此是不同的。因此,单元格在最终输出向量中以不同的归一化形式出现多次。这可能看起来是冗余的,但它提高了性能。我们将归一化的块描述符称为方向梯度直方图 (HOG) 描述符。

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

参考文献#

Input image, Histogram of Oriented Gradients
import matplotlib.pyplot as plt

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


image = data.astronaut()

fd, hog_image = hog(
    image,
    orientations=8,
    pixels_per_cell=(16, 16),
    cells_per_block=(1, 1),
    visualize=True,
    channel_axis=-1,
)

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

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

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

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

脚本的总运行时间:(0 分 0.508 秒)

由 Sphinx-Gallery 生成的图库