SIFT
检测尺度空间极值
1) 构建尺度空间
SIFT 算法通过构建尺度空间(Scale Space)来解决特征点在不同尺度下不一致的问题。 尺度空间的构建基于高斯函数对图像进行平滑处理,其定义为:
\[ L(x, y, \sigma) = G(x, y, \sigma) * I(x, y) \]
其中,\( I(x, y) \) 表示输入图像, \( G(x, y, \sigma) \) 为尺度参数为 \( \sigma \) 的二维高斯函数, \( * \) 表示卷积运算。高斯函数的表达式为:
\[ G(x, y, \sigma) = \frac{1}{2\pi\sigma^2} \exp\!\left( -\frac{x^2 + y^2}{2\sigma^2} \right) \]
通过逐步增大 \( \sigma \),对图像进行多尺度高斯平滑, 可以模拟同一物体在不同观察距离下的成像效果, 从而在尺度维度上建立连续的图像表示。 基于该尺度空间表示, SIFT 能够在不同尺度层级上检测局部结构显著且稳定的关键点, 为后续的尺度不变特征点检测与描述提供理论基础。

上图展示了同一图像在不同尺度下的表示效果。随着尺度参数 \( \sigma \) 的增大,图像经过高斯平滑后逐渐变得模糊,细节信息被逐步抑制, 仅保留较大尺度的结构特征。这一过程可视为模拟不同观察距离下的成像:近距离能观察到细小纹理,远距离更突出整体轮廓。 因此,通过在多个尺度上同时分析图像,SIFT 能够避免特征点仅在单一分辨率下有效的问题,从而提升尺度变化下的稳定性。
为了在覆盖大尺度范围的同时保持计算效率,SIFT 通常将尺度空间按多个 Octave 进行组织。 每个 Octave 内包含若干尺度层(Scale),相邻尺度层通过逐步增大 \( \sigma \) 获得; 当尺度增加到一定程度后,对图像进行下采样并进入下一 Octave,从而在更粗的分辨率上继续构建尺度空间。

上图给出了 SIFT 中尺度空间的典型金字塔结构示意。尺度空间按照多个 Octave 进行组织,每个 Octave 内包含若干尺度层(Scale), 相邻尺度层之间通过逐步增大高斯核的尺度参数 \( \sigma \) 获得。当尺度增加到一定程度后,图像会下采样并进入下一 Octave, 以更粗的分辨率继续覆盖更大的尺度范围。SIFT 正是在这一三维尺度空间 \((x, y, \sigma)\) 中,通过检测空间与尺度维度上的局部极值点来确定关键点, 使得所选特征在位置和尺度上均具有良好的稳定性。
2) DoG 极值检测
在尺度空间中检测关键点,本质上是寻找在空间与尺度维度上均具有显著变化的局部极值点。 从尺度空间理论的角度出发,理想的极值检测算子是高斯拉普拉斯算子 (Laplacian of Gaussian, LoG),其定义为对尺度空间函数进行二阶空间导数:
\[ \mathrm{LoG}(x, y, \sigma) = \nabla^2 \bigl( G(x, y, \sigma) * I(x, y) \bigr) \]
LoG 算子能够在不同尺度下有效检测图像中的斑点(blob)和角点结构, 并且其极值位置在尺度空间中具有良好的理论稳定性。 然而,直接计算 LoG 需要在每一个尺度上进行高斯平滑与二阶导数运算, 计算代价较高,不利于实际工程应用。
为了在保证检测效果的同时显著降低计算复杂度, SIFT 采用相邻尺度高斯平滑图像之差(Difference of Gaussian, DoG) 来近似 LoG 算子。DoG 的定义为:
\[ \mathrm{DoG}(x, y, \sigma) = L(x, y, k\sigma) – L(x, y, \sigma) \]
其中,\( L(x, y, \sigma) \) 表示尺度空间中的高斯平滑图像, \( k \) 为相邻尺度之间的固定比例因子。 DoG 通过对相邻尺度的高斯模糊图像作差, 能够高效地突出在该尺度范围内变化最为显著的局部结构。
在尺度空间理论中,可以证明 DoG 是尺度归一化 LoG 的一种近似形式:
\[ \mathrm{DoG}(x, y, \sigma) \approx (k – 1)\,\sigma^2\,\mathrm{LoG}(x, y, \sigma) \]
因此,DoG 在尺度空间中所检测到的极值点位置 与 LoG 的极值点在实践中具有高度一致性。 相比直接计算 LoG,DoG 仅依赖于高斯平滑与减法运算, 计算效率更高,数值稳定性更好, 是 SIFT 在工程实现中对尺度空间极值检测的合理近似选择。

上图展示了 DoG 的构建过程。左侧为同一 Octave 内不同尺度的高斯平滑图像, 右侧为相邻尺度图像作差得到的 DoG 图像。 SIFT 在 DoG 尺度空间中,对每一个像素点与其在空间和尺度维度上的邻域进行比较, 若该点同时为极大值或极小值,则被选为潜在关键点。
3) 去除干扰
在 DoG 尺度空间中检测到的极值点并不一定都是稳定且有意义的关键点。 为了提高特征点的可靠性,SIFT 对初步检测到的极值点进行进一步筛选, 主要从两个方面去除干扰点:较小的极值点以及边缘噪声点。
较小的极值
部分极值点虽然在 DoG 尺度空间中满足局部极值条件, 但其响应值较小,往往来源于噪声或弱纹理区域, 对后续匹配与几何估计的贡献有限。 因此,SIFT 首先通过对 DoG 极值的幅值进行阈值化, 直接剔除响应过弱的极值点,以降低噪声对关键点检测的影响。
另一方面,由于 DoG 尺度空间是离散采样的, 直接将离散采样点作为极值位置往往存在定位误差。 为了获得更加精确的关键点位置与响应值, SIFT 在极值点邻域内对 DoG 函数进行三维二次函数拟合, 该过程可以通过对 DoG 函数进行泰勒二次展开来实现。
\[ D(\mathbf{x}) \approx D + \frac{\partial D}{\partial \mathbf{x}}^T \mathbf{x} + \frac{1}{2}\mathbf{x}^T \frac{\partial^2 D}{\partial \mathbf{x}^2} \mathbf{x} \]
其中 \( \mathbf{x} = (x, y, \sigma)^T \) 表示相对于采样点的偏移量, \( \frac{\partial D}{\partial \mathbf{x}} \) 为一阶导数, \( \frac{\partial^2 D}{\partial \mathbf{x}^2} \) 为 Hessian 矩阵。 通过对该二次函数求极值, 可以获得关键点在空间与尺度维度上的亚像素、亚尺度位置, 同时估计其精确的响应值。
若拟合得到的极值响应仍然低于设定阈值, 则认为该关键点不具有足够的稳定性, 从而将其作为较小极值点予以剔除。
边缘噪声
另一类常见的干扰来源于边缘结构。 在 DoG 尺度空间中,位于边缘上的点往往在垂直于边缘的方向变化剧烈, 而沿边缘方向变化较为平缓, 从而在数值上形成局部极值。 然而,这类点通常位于“山脊”状结构上, 并非独立的 blob 中心,定位稳定性较差。

对于理想的 blob 结构,其在各个方向上的变化趋势应当相对均衡; 而边缘点则表现为在不同方向上的变化幅度存在显著差异。 在二维 DoG 曲面中,这种方向性变化可以通过 Hessian 矩阵进行刻画。 对于 DoG 函数 \( D(x, y) \),其 Hessian 矩阵定义为:
\[ H = \begin{bmatrix} D_{xx} & D_{xy} \\ D_{xy} & D_{yy} \end{bmatrix} \]
Hessian 矩阵的特征值对应函数在两个正交主方向上的曲率大小。 当两个特征值大小相近时,说明该点更可能是一个独立的 blob; 而当二者相差较大时,则表明该点位于边缘结构上。 因此,可以通过主曲率比值来判定极值点是否为边缘噪声。
实际实现中,为避免显式计算特征值, SIFT 使用 Hessian 矩阵的迹与行列式构造判别条件:
\[ \frac{(\mathrm{Tr}(H))^2}{\det(H)} < \frac{(r+1)^2}{r} \]
其中 \( r \) 为允许的主曲率比阈值。 通过该约束,可以有效剔除边缘响应过强但定位不稳定的极值点, 保留在空间与尺度上均具有良好稳定性的关键点。
关键点的表示
在 DoG 尺度空间中完成极值检测与关键点精定位后, 已经获得了一组稳定的关键点。 接下来的问题是:如何对这些关键点进行统一且鲁棒的表示, 以便在不同图像之间进行匹配。
SIFT 使用一个三元组来表示每一个关键点, 即关键点的位置、尺度以及方向:
\[ \mathbf{k} = (x, y, \sigma, \theta) \]
其中 \( (x, y) \) 表示关键点在图像中的空间位置, \( \sigma \) 表示关键点所在的尺度, \( \theta \) 表示关键点的主方向。 位置与尺度由 DoG 极值检测与精定位阶段确定, 而方向的引入是为了使后续构建的特征描述子具有旋转不变性。
关键点方向的计算基于其所在尺度空间图像 \( L(x, y, \sigma) \) 中的局部梯度信息。 对于尺度为 \( \sigma \) 的图像, 在关键点邻域内任一点 \( (x, y) \), 其梯度幅值和方向分别定义为:
\[ m(x, y) = \sqrt{ \left( L(x+1, y) – L(x-1, y) \right)^2 + \left( L(x, y+1) – L(x, y-1) \right)^2 } \]
\[ \theta(x, y) = \tan^{-1} \left( \frac{L(x, y+1) – L(x, y-1)} {L(x+1, y) – L(x-1, y)} \right) \]
可以看出,样本点的方向本质上由该尺度图像上的梯度方向决定。
关键点的主方向并非由单一像素决定, 而是由其邻域内一组样本点的梯度统计结果共同确定。 具体而言,在关键点邻域内, 对所有样本点计算其梯度幅值与方向, 并将方向范围 \( [0^\circ, 360^\circ) \) 划分为若干个方向区间(bins)。
在 SIFT 原论文中, 将一周划分为 36 个方向区间, 即每个 bin 覆盖 \( 10^\circ \)。 每个样本点的梯度幅值在加入对应方向 bin 之前, 需要乘以一个以关键点为中心的高斯权重, 以降低远离关键点样本对方向估计的影响。
\[ w(x, y) = \exp\!\left( -\frac{x^2 + y^2}{2 (1.5\sigma)^2} \right) \]
其中高斯权重函数的尺度与关键点所在尺度 \( \sigma \) 成正比, 根据高斯分布的性质, 关键点邻域的统计半径通常设置为约 \( 3\sigma \), 以覆盖主要能量区域。
对加权后的梯度方向进行统计后, 可以得到一个长度为 36 的方向直方图。 其中幅值最大的 bin 所对应的方向 被选为该关键点的主方向 \( \theta \)。
此外,若方向直方图中存在其他局部峰值, 且其幅值超过最大峰值的 0.8 倍, 则会在同一位置与尺度处创建多个关键点, 这些关键点共享相同的空间位置和尺度, 但具有不同的方向。 这种策略能够增强对复杂局部结构的描述能力, 并提升特征匹配的鲁棒性。
局部描述子
1) 构建
局部特征描述子的构建基于关键点邻域内的局部结构信息。 在 SIFT 中,以关键点为中心选取一个固定大小的邻域区域 (论文中为边长 16 的正方形区域), 并将该区域划分为若干个子区域 (通常为 \(4 \times 4\))。 在每个子区域内统计一个方向直方图, 直方图的长度一般设为 8, 从而每个子区域对应一个 8 维向量。 将所有子区域的方向直方图串联, 即得到一个长度为 \(4 \times 4 \times 8 = 128\) 的局部特征描述子。

为了使描述子具有旋转不变性, 在构建描述子之前, 需要对关键点邻域进行方向对齐。 对于同一物理区域, 若仅因视角变化而发生旋转, 直接在原始图像坐标系下统计方向直方图, 将导致描述子差异较大。 因此,SIFT 将关键点的主方向统一对齐到固定方向 (通常对齐到图像的 \(x\) 轴方向), 再在对齐后的坐标系中进行描述子构建, 从而消除旋转带来的影响。
对齐后的邻域仍需按照固定的网格规则划分子区域, 然而由于旋转操作, 像素点通常不会恰好落在规则网格中心。 为了保证描述子的平滑性与稳定性, SIFT 采用双线性插值的方法, 将每个旋转后的样本点的梯度贡献 分配到其邻近的网格点上。 该过程同时在空间位置和方向维度上进行插值, 以避免量化误差对描述子的影响。

在方向维度上, 样本点的梯度方向同样需要进行插值分配。 例如,当方向直方图长度为 8 时, 每个 bin 覆盖 \(45^\circ\), 若样本点的方向位于两个方向 bin 之间, 则其梯度幅值按比例分配到相邻的两个方向 bin 中。 最终,每个子区域的方向直方图 综合反映了该区域内局部结构的方向分布特征。
在区域大小与权重选择方面, 描述子构建所采用的邻域尺度 与关键点方向计算阶段保持一致, 即邻域大小与关键点所在尺度 \( \sigma \) 成正比。 同时,引入以关键点为中心的高斯权重, 使靠近关键点的样本具有更高权重, 以提升描述子对局部结构的敏感性并抑制边缘噪声。 通过上述设计, SIFT 描述子在尺度变化与旋转变化下 仍能保持良好的稳定性与判别能力。
2) 去除光照影响
在实际成像过程中,非线性光照变化或相机饱和效应 可能导致局部区域中某些方向的梯度幅值异常增大, 从而削弱方向分布本身的判别能力。 为了降低光照变化对描述子的影响, SIFT 在描述子构建完成后对其进行归一化处理。
具体而言,首先对特征描述子向量进行 \( L_2 \) 归一化, 然后对其中大于阈值(通常取 0.2)的分量进行截断, 以抑制由局部强光照或饱和区域引起的过大梯度响应。 随后,再次对截断后的描述子进行 \( L_2 \) 归一化, 得到最终的特征描述子。
通过上述两次归一化与截断操作, 可以有效降低光照变化对梯度幅值的影响, 使描述子更加关注梯度方向的相对分布特征, 从而提升特征在不同光照条件下的稳定性与判别性。
SURF
Fast-Hessian Detector 尺度空间生成
在 SURF 中,尺度空间的构建不再依赖于逐层高斯平滑与下采样, 而是基于 Fast-Hessian Detector 对不同尺度下图像结构进行直接响应计算。 其核心思想是利用 Hessian 矩阵刻画图像局部二阶变化特性, 并通过对高斯二阶导数的近似实现高效的尺度空间分析。
对于图像中任一点 \( (x, y) \),在尺度 \( \sigma \) 下的 Hessian 矩阵定义为:
\[ H(x, y, \sigma) = \begin{bmatrix} L_{xx}(x, y, \sigma) & L_{xy}(x, y, \sigma) \\ L_{xy}(x, y, \sigma) & L_{yy}(x, y, \sigma) \end{bmatrix} \]
其中 \( L_{xx}, L_{yy}, L_{xy} \) 表示尺度空间图像 在对应方向上的二阶偏导数。 Hessian 矩阵的行列式能够反映该点在两个主方向上的局部变化强度, 因而适合用于斑点(blob)结构的检测。
与 SIFT 中通过缩放图像构建尺度空间不同, SURF 采用在同一分辨率图像上改变滤波器尺寸的方式来实现尺度变化。 即通过增大盒式滤波器的尺寸来模拟不同尺度下的响应, 从而避免重复对图像进行模糊与下采样操作。 这种方法使尺度空间的生成更加高效且易于实现。

为了进一步提升计算速度, SURF 使用盒式滤波器(Box Filter)近似高斯二阶导数, 并结合积分图(Integral Image)实现滤波响应的快速计算。 在此基础上,不同尺度下的 Hessian 行列式响应 共同构成了 Fast-Hessian 尺度空间。 SURF 通过在该尺度空间中寻找局部极值点, 完成关键点的检测与尺度选择。
关键点定位
在 SURF 中,关键点的定位过程与 SIFT 中基于 DoG 的方法存在明显差异。 对于 SIFT 而言,DoG 极值仅反映了不同方向上的变化趋势, 并未直接区分斑点结构与边缘结构, 因此需要在后续阶段借助 Hessian 矩阵的特征值比值 对由边缘产生的不稳定极值点进行剔除。
而在 SURF 中,关键点检测本身即基于 Hessian 矩阵的行列式完成。 Hessian 行列式在两个主方向上同时取得较大响应时, 才会产生显著值, 因而天然抑制了仅在单一方向变化剧烈的边缘响应。 这使得 SURF 在关键点检测阶段 已经在一定程度上完成了对边缘噪声的过滤, 无需再额外引入边缘剔除步骤。
在确定关键点位置时, SURF 同样需要对离散尺度空间中的极值进行精确定位。 由于尺度空间是在空间坐标与尺度维度上离散采样得到的, 直接采用离散极值点作为关键点位置 往往会引入定位误差。 因此,SURF 采用三维线性插值的方法, 在空间坐标与尺度维度上对 Hessian 响应函数进行局部拟合, 从而获得关键点的亚像素级、亚尺度级位置。
通过该精定位过程, 可以进一步提升关键点在不同尺度和视角下的稳定性, 为后续的方向估计与特征描述子构建奠定基础。
主方向估计
为了使特征描述子具有旋转不变性, SURF 同样需要为每一个关键点分配一个主方向。 与 SIFT 基于梯度方向直方图不同, SURF 使用 Haar 小波响应来估计关键点的主方向, 以进一步提升计算效率。
在关键点所在尺度下, 以关键点为中心选取一个圆形邻域, 对邻域内的采样点分别计算在 \(x\) 和 \(y\) 方向上的 Haar 小波响应 \(d_x\) 与 \(d_y\)。 为降低远离关键点区域的干扰, 所有 Haar 响应均乘以以关键点为中心的高斯权重。

将每个采样点的响应表示为二维向量 \((d_x, d_y)\), 并在方向空间中使用一个滑动角度窗口 (通常覆盖 \(60^\circ\) 的范围) 对这些向量进行累加。 使得向量和幅值最大的窗口方向 即被选为该关键点的主方向。
通过这种方式, SURF 能够在保证旋转不变性的同时, 避免构建复杂的方向直方图, 进一步降低了方向估计阶段的计算开销。
特征描述子构建
在确定关键点的位置、尺度和主方向后, SURF 开始构建局部特征描述子。 首先将关键点邻域旋转到其主方向对齐的坐标系中, 以消除旋转对描述子的影响。 随后在对齐后的邻域内提取局部结构信息。
与 SIFT 类似, SURF 将关键点邻域划分为若干个规则子区域, 通常为 \(4 \times 4\) 的网格结构。 在每个子区域内, 统计 Haar 小波响应的分布特征, 而非梯度方向直方图。

具体而言, 对每个子区域计算以下四个统计量: \( \sum d_x \)、\( \sum d_y \)、\( \sum |d_x| \) 和 \( \sum |d_y| \), 分别反映局部区域内水平方向与垂直方向的 强度变化及其能量分布。 因此,每个子区域对应一个 4 维特征向量。
将所有 \(4 \times 4\) 个子区域的特征向量串联, 即可得到一个长度为 \(4 \times 4 \times 4 = 64\) 的 SURF 描述子。 相较于 SIFT 的 128 维描述子, SURF 描述子维度更低, 在保持一定判别能力的同时, 显著降低了存储与匹配的计算成本。
最后,对描述子向量进行归一化处理, 以减弱光照变化对特征幅值的影响, 从而提升描述子在实际应用中的稳定性与鲁棒性。
