1. 概述
本文将深入解析 SIFT(Scale-Invariant Feature Transform)算法。首先介绍其应用场景,然后逐步拆解算法核心流程。
SIFT 是计算机视觉领域中一个经典且鲁棒性极强的特征提取与匹配算法。它能够在不同尺度、旋转和光照变化下保持特征的一致性,广泛应用于目标检测、图像匹配、三维重建等领域。
2. 引入背景
在计算机视觉任务中,关键点检测(keypoint detection)是很多任务的基础。例如在图像分类或图像匹配中,我们需要找到图像中具有显著特征的点,并为其生成描述子(descriptor)。
这些描述子必须具备以下不变性:
- ✅ 尺度不变性(Scale Invariance)
- ✅ 旋转不变性(Rotation Invariance)
- ✅ 光照不变性(Illumination Invariance)
只有具备这些特性,算法才能在不同条件下稳定地识别出相同的特征点。
SIFT 正是为此而设计的:它不仅能检测出关键点,还能为每个点生成一个具有上述不变性的特征向量。
3. 算法流程详解
整个 SIFT 算法可分为以下四个主要步骤:
3.1 构建尺度空间(Scale-Space)
为了在不同尺度下检测特征点,我们需要构建图像的尺度空间。其本质是将原始图像与不同尺度的高斯核(Gaussian kernel)进行卷积。
高斯核定义如下:
$$ G(x, y, \sigma) = \frac{1}{2 \pi \sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} $$
其中:
- $ x, y $ 是像素坐标
- $ \sigma $ 控制高斯核的尺度(即模糊程度)
然后,我们通过卷积得到图像在不同尺度下的表示:
$$ L(x, y, \sigma) = G(x, y, \sigma) * I(x, y) $$
这样我们就得到了一个尺度空间,它包含图像在不同模糊程度下的多个版本。
⚠️ 踩坑提醒:尺度空间构建过程中,通常不是逐级增加 σ,而是通过“Octave”机制来控制计算复杂度。
3.2 使用 DoG 提取关键点
DoG(Difference of Gaussians)是提取关键点的核心步骤。其思想是:用两个相邻尺度的高斯图像相减,得到差值图像(DoG 图像)。
关键点的提取方式如下:
- 对于每个 DoG 图像中的像素点,比较其与当前尺度的 8 个邻域像素,以及上下两个尺度中对应的 9 个像素,共 26 个点。
- 如果该点是局部最大值或最小值,则认为是候选关键点。
下图展示了比较区域的结构(橙色点为比较对象):
✅ 小技巧:为了减少候选点数量,通常会设置一个阈值,只保留响应值高于该阈值的点。
3.3 为关键点分配方向
为了实现旋转不变性,我们需要为每个关键点分配一个方向(orientation)。
具体做法如下:
- 以关键点为中心,取一个邻域区域
- 计算区域内每个像素的梯度幅值和方向
- 建立一个 36 个 bin 的方向直方图(覆盖 0°~360°)
- 每个 bin 的值是该方向上梯度幅值的总和
- 直方图中最大值对应的方向即为该关键点的方向
如下图所示,是一个示例直方图:
3.4 构建特征描述子(Descriptor)
最后一步是为每个关键点生成一个 128 维的特征向量。
具体流程如下:
- 以关键点为中心,取一个 $16 \times 16$ 的图像块
- 将该图像块划分为 $4 \times 4$ 的子块(共 16 个)
- 每个子块统计一个 8-bin 的方向直方图
- 最终特征向量长度为 $8 \times 4 \times 4 = 128$
如下图所示,展示了特征向量的构建过程:
✅ 小技巧:构建描述子时,通常会对梯度幅值进行加权(如使用高斯权重),以增强中心点的重要性。
4. 总结
本文系统地介绍了 SIFT 算法的四个主要步骤:
- 构建尺度空间(Scale-Space)
- 使用 DoG 提取关键点
- 为关键点分配方向
- 构建 128 维特征描述子
SIFT 的核心优势在于其在尺度、旋转和光照变化下的不变性,使其在图像匹配、目标识别等任务中表现出色。尽管近年来深度学习方法在很多任务中取得了更好效果,但 SIFT 作为传统方法的代表,其原理和思想仍值得深入理解与借鉴。