注意
转到末尾下载完整的示例代码。或通过 Binder 在浏览器中运行此示例
方向梯度直方图#
方向梯度直方图 (HOG) 特征描述符在对象检测中很受欢迎 [1]。
在以下示例中,我们计算 HOG 描述符 并显示可视化。
算法概述#
计算方向梯度直方图 (HOG) 的方法如下:
(可选)全局图像归一化
计算 x 和 y 中的梯度图像
计算梯度直方图
跨块归一化
展平为特征向量
第一阶段应用可选的全局图像归一化均衡,旨在减少光照影响。在实践中,我们使用伽玛(幂律)压缩,计算每个颜色通道的平方根或对数。图像纹理强度通常与局部表面光照成正比,因此这种压缩有助于减少局部阴影和光照变化的影响。
第二阶段计算一阶图像梯度。这些捕获轮廓、剪影和一些纹理信息,同时提供进一步的抗光照变化能力。使用局部主导颜色通道,这在很大程度上提供了颜色不变性。变体方法还可以包括二阶图像导数,它们充当原始条检测器——对于捕获自行车中的条状结构和人类肢体等很有用的特征。
第三阶段旨在生成一种对局部图像内容敏感的编码,同时保持对姿势或外观的微小变化的抵抗力。所采用的方法以与 SIFT [2] 特征相同的方式在局部池化梯度方向信息。图像窗口被划分为称为“单元”的小空间区域。对于每个单元,我们在单元中的所有像素上累积梯度或边缘方向的局部一维直方图。这个组合的单元级一维直方图形成基本的“方向直方图”表示。每个方向直方图将梯度角度范围划分为固定数量的预定 bin。单元中像素的梯度幅度用于投票到方向直方图中。
第四阶段计算归一化,它采用局部单元组,并在传递到下一阶段之前对它们的整体响应进行对比度归一化。归一化引入了对光照、阴影和边缘对比度的更好不变性。它通过在称为“块”的局部单元组上累积局部直方图“能量”的度量来执行。结果用于归一化块中的每个单元。通常,每个单独的单元在多个块之间共享,但其归一化是块相关的,因此不同。因此,该单元在最终输出向量中多次出现,并具有不同的归一化。这可能看起来是多余的,但它提高了性能。我们将归一化的块描述符称为方向梯度直方图 (HOG) 描述符。
最后一步将覆盖检测窗口的密集重叠块网格的所有块中的 HOG 描述符收集到组合的特征向量中,以用于窗口分类器。
参考文献#
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.677 秒)