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 个点。
  • 如果该点是局部最大值或最小值,则认为是候选关键点。

下图展示了比较区域的结构(橙色点为比较对象):

dog

✅ 小技巧:为了减少候选点数量,通常会设置一个阈值,只保留响应值高于该阈值的点。

3.3 为关键点分配方向

为了实现旋转不变性,我们需要为每个关键点分配一个方向(orientation)。

具体做法如下:

  • 以关键点为中心,取一个邻域区域
  • 计算区域内每个像素的梯度幅值和方向
  • 建立一个 36 个 bin 的方向直方图(覆盖 0°~360°)
  • 每个 bin 的值是该方向上梯度幅值的总和
  • 直方图中最大值对应的方向即为该关键点的方向

如下图所示,是一个示例直方图:

Screenshot-2022-07-05-at-1.55.59-PM

3.4 构建特征描述子(Descriptor)

最后一步是为每个关键点生成一个 128 维的特征向量。

具体流程如下:

  • 以关键点为中心,取一个 $16 \times 16$ 的图像块
  • 将该图像块划分为 $4 \times 4$ 的子块(共 16 个)
  • 每个子块统计一个 8-bin 的方向直方图
  • 最终特征向量长度为 $8 \times 4 \times 4 = 128$

如下图所示,展示了特征向量的构建过程:

Screenshot-2022-07-05-at-2.50.56-PM

✅ 小技巧:构建描述子时,通常会对梯度幅值进行加权(如使用高斯权重),以增强中心点的重要性。

4. 总结

本文系统地介绍了 SIFT 算法的四个主要步骤:

  1. 构建尺度空间(Scale-Space)
  2. 使用 DoG 提取关键点
  3. 为关键点分配方向
  4. 构建 128 维特征描述子

SIFT 的核心优势在于其在尺度、旋转和光照变化下的不变性,使其在图像匹配、目标识别等任务中表现出色。尽管近年来深度学习方法在很多任务中取得了更好效果,但 SIFT 作为传统方法的代表,其原理和思想仍值得深入理解与借鉴。


原始标题:Scale-Invariant Feature Transform