Scale-Invariant Feature Transform (SIFT)
尺度不变特征变换(SIFT)是一种经典算法,可检测关键点并生成在缩放和旋转下保持稳定的 128 维描述符。
尺度不变特征变换(SIFT)是一种经典的计算机视觉算法,可在图像中检测独特的局部关键点,并用一个 128 维向量描述每个关键点;图像缩放或旋转时,该向量基本保持不变。匹配这些描述符可以让软件关联从不同距离和角度拍摄的同一场景的两张照片,这也是将重叠照片拼接成全景图的方式。SIFT 是一种人工设计的特征提取方法,不同于卷积神经网络学习得到的特征图。
起源与核心思想#
不列颠哥伦比亚大学的 David Lowe 在 1999 年 ICCV 论文《基于局部尺度不变特征的目标识别》中介绍了 SIFT,并在 2004 年发表于《国际计算机视觉杂志》的论文《从尺度不变关键点提取独特图像特征》中作了完整阐述。SIFT 特征具有尺度和旋转不变性,并且在相当大范围的仿射畸变、3D 视角变化、噪声和光照变化下都能稳健匹配。该方法曾获专利,专利于 2020 年到期。OpenCV在 4.4.0 版本中将 SIFT 从 contrib 仓库移入主库。
物体在照片中的尺寸并不固定,因此检测器必须在各种尺寸下寻找结构。SIFT 通过反复以逐渐增强的程度应用高斯模糊,并按称为八度的组进行下采样,从而构建尺度空间。
SIFT 的工作原理#
该算法分为四个阶段:
- 尺度空间极值检测:相邻模糊层级之间的差异(高斯差分)可以近似充当斑点检测器。如果一个像素在空间和尺度上都比其 26 个邻居更大或更小,它就会成为候选点。
- 关键点定位:将候选点细化到亚像素精度。对比度较低的点以及位于边缘上的点会被丢弃,因为它们不稳定。
- 方向分配:统计每个关键点周围局部梯度方向的直方图,以确定主方向;之后的所有测量都相对于该方向进行。这使算法具有旋转不变性。
- 描述符构建:将邻域划分为 4 x 4 网格,每个单元格包含一个 8 个区间的梯度直方图。这样共得到 4 x 4 x 8 = 128 个值,并对其进行归一化以降低对光照的敏感度。
通过欧氏距离比较描述符。Lowe 比率检验仅在最佳邻居明显比次佳邻居更近时才保留匹配。使用k 近邻搜索并设定 k = 2,即可获得这两个距离。
import cv2
from ultralytics.utils import ASSETS
# Load a sample image in grayscale and a half-size copy
img = cv2.imread(str(ASSETS / "bus.jpg"), cv2.IMREAD_GRAYSCALE)
small = cv2.resize(img, None, fx=0.5, fy=0.5)
# Detect keypoints and compute 128-dimensional descriptors
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img, None)
kp2, des2 = sift.detectAndCompute(small, None)
# Match half-size descriptors to full-size ones, then apply Lowe's ratio test
pairs = cv2.BFMatcher().knnMatch(des2, des1, k=2)
good = [m for m, n in pairs if m.distance < 0.8 * n.distance]
print(f"{len(good)} of {len(kp2)} half-size keypoints matched at full size")输出的计数表示在半尺寸图像中找到的关键点有多少能在全尺寸图像中再次识别出来,这体现了尺度不变性。
应用场景#
SIFT 成为几何视觉任务中的默认局部特征:
- 全景图拼接:Brown 和 Lowe 的自动全景图拼接方法(IJCV 2007)会匹配重叠照片之间的 SIFT 特征,并估计单应性来对齐照片;这种对齐步骤称为图像配准。
- 3D 重建:Photo Tourism(Snavely、Seitz 和 Szeliski,2006)会匹配游客照片中的 SIFT 特征,并利用极线几何恢复相机姿态和稀疏的3D 结构。
- 机器人定位:Se、Lowe 和 Little(2001)使用 SIFT 地标进行移动机器人定位与建图,这是现代视觉 SLAM的前身。
- 实例识别:Lowe 在 2004 年的论文中展示了如何在杂乱且部分遮挡的场景中,仅凭 3 个匹配特征识别出一辆玩具火车和一只青蛙。
在 Ultralytics YOLO 目标跟踪中,BoT-SORT 会补偿帧间的相机运动;在跟踪器配置中设置 gmc_method: sift,即可使用 SIFT 匹配来估算相机运动,而非使用默认的稀疏光流。
SIFT 与相关方法的比较#
SIFT 能够在不同视图中匹配同一物理点,因此适用于对应关系和几何分析。目标检测则会预测物体的类别和位置。模板匹配会滑动固定图块,遇到尺度或旋转变化时就会失效。
与 ORB 相比,SIFT 速度较慢。ORB 是 Rublee 等人在 2011 年提出的一种二进制描述符,旨在作为 SIFT 和 SURF 的替代方案。SIFT 在无纹理表面以及视角变化非常大时也表现不佳;对于类别级识别,学习型模型在很大程度上已经取代了它。
在 Lowe 2004 年的测试中,对于具有随机尺度和旋转变化、30 度深度旋转及 2% 噪声的图像,与 40,000 个关键点进行匹配时,剔除距离比高于 0.8 的匹配可消除 90% 的错误匹配,同时丢弃不到 5% 的正确匹配。










