备注
转到末尾 以下载完整的示例代码。或者通过 Binder 在浏览器中运行此示例。
方向梯度直方图#
方向梯度直方图 (HOG) 特征描述符在物体检测中非常流行 [1]。
在下面的例子中,我们计算 HOG 描述符 并显示可视化结果。
算法概述#
通过计算方向梯度直方图 (HOG)
(可选)全局图像归一化
计算x和y方向的梯度图像
计算梯度直方图
跨块标准化
展平为特征向量
第一阶段应用一个可选的全局图像归一化均衡,旨在减少光照效果的影响。实际上,我们使用伽马(幂律)压缩,计算每个颜色通道的平方根或对数。图像纹理强度通常与局部表面光照成正比,因此这种压缩有助于减少局部阴影和光照变化的影响。
第二阶段计算一阶图像梯度。这些捕捉轮廓、剪影和一些纹理信息,同时提供进一步的抗光照变化能力。使用局部主导的颜色通道,这在很大程度上提供了颜色不变性。变体方法也可能包括二阶图像导数,这些导数作为原始的条形检测器——对于捕捉例如自行车中的条形结构和人体中的肢体等有用特征。
第三阶段旨在生成一种编码,该编码对局部图像内容敏感,同时对姿态或外观的小变化具有抵抗力。采用的方法与SIFT [2] 特征一样,在局部池化梯度方向信息。图像窗口被划分为小的空间区域,称为“单元格”。对于每个单元格,我们在单元格内的所有像素上累积梯度或边缘方向的局部1-D直方图。这种组合的单元格级1-D直方图形成了基本的“方向直方图”表示。每个方向直方图将梯度角度范围划分为固定数量的预定箱。单元格中像素的梯度幅度用于投票进入方向直方图。
第四阶段计算归一化,该阶段将局部细胞组的整体响应进行对比度归一化,然后再传递到下一阶段。归一化引入了对光照、阴影和边缘对比度的更好不变性。它通过在称为“块”的局部细胞组上累积局部直方图“能量”的度量来执行。结果用于归一化块中的每个细胞。通常,每个单独的细胞在几个块之间共享,但其归一化是块依赖的,因此不同。因此,细胞在最终输出向量中出现几次,具有不同的归一化。这可能看起来冗余,但它提高了性能。我们将归一化的块描述符称为方向梯度直方图(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.198 秒)