一句话定义
尺度空间用一组连续变化 σ 的高斯平滑版本表示同一幅图像,SIFT 在高斯差分(DoG)金字塔中找跨尺度极值点作为关键点,并为其分配方向与 128 维描述子,实现缩放与旋转不变的特征匹配。
为什么重要
真实物体在不同距离下成像大小不同,「同一特征跨尺度可再认」是匹配问题的分水岭;SIFT(1999 提出,2004 定稿)用一套完整工程把这一性质做实,支撑了此后十年的拼接、重建与识别,其「尺度空间 + 主方向 + 邻域描述子」的三段式结构至今仍是特征设计的范本。
直观类比
看一张合影,走近看能认出眼镜框上的螺丝(细节尺度),退远三步仍能认出那是同一副眼镜(轮廓尺度);SIFT 就是在所有「观察距离」上同时扫描,只有那些在任何距离都最显眼的位置才被记为关键点,并且记下「我是在哪个距离被认出来的」。
前置知识
kp-006(Harris 与尺度缺陷);kp-005(高斯/拉普拉斯金字塔)。
核心概念
- 尺度空间 L(x, y, σ):原图与高斯核在不同 σ 下卷积的家族,σ 即观察尺度。
- DoG(高斯差分):相邻尺度相减近似高斯偏导(拉普拉斯),用于找斑点状极值。
- 组(Octave)/ 层(Level):组内尺寸减半、σ 倍增,组内若干层保证尺度采样密度。
- 关键点定位:DoG 极值点经泰勒拟合精化,剔除低对比度点与强边缘点(用 Harris 式比值)。
- 主方向:关键点邻域梯度方向直方图的峰值,描述子按主方向旋转对齐,获得旋转不变。
- 128 维描述子:4×4 子区域 × 8 方向梯度直方图,归一化后对亮度线性变化稳健。
原理与机制
流程四步:构建 DoG 金字塔;在每组内比较 26 邻域(同层 8 + 上下层各 9)找极值;亚像素精化并过滤;按主方向旋转提取描述子。尺度不变来自「极值只在 (x, y, σ) 联合空间中被选中」——目标变大时,其极值自动迁移到更大 σ 层,匹配在归一化后的邻域上进行,故与成像尺度解耦。旋转不变来自主方向对齐。亮度鲁棒性来自描述子以梯度而非绝对亮度为原料。工程上每组常取 3–5 层、初始 σ≈1.6,是精度与速度的折中。
公式与模型
L(x, y, σ) = G_σ(x, y) * I(x, y)
D(x, y, σ) = L(x, y, kσ) − L(x, y, σ) (DoG,k ≈ 2^(1/s))
极值条件: D 在 3×3×3 邻域 26 点中最大或最小图示
实例与案例
全景拼接 App:两两图像 SIFT 匹配 + RANSAC 单应(kp-009)即可在手机上毫秒级完成初排。机器人重定位:先离线建 SIFT 地图,运行时对单帧匹配求位姿。历史脉络:SIFT 专利 2020 年 3 月到期,此后 OpenCV 默认将其移出 nonfree 模块,工业使用不再有授权顾虑;深度时代 SIFT 仍是 SLAM/拼接中「免训练、可解释」的默认选项。
import cv2
sift = cv2.SIFT_create(nfeatures=2000)
kps, desc = sift.detectAndCompute(gray, None) # desc 形状 (N, 128) float32
bf = cv2.BFMatcher()
matches = bf.knnMatch(desc1, desc2, k=2) # 配 ratio test 用(见 kp-008)常见误区
- σ 与核尺寸混为一谈:σ 是平滑尺度参数,核尺寸通常取 6σ 左右的奇数。
- 以为 SIFT 描述子天然尺度不变:不变性来自「在关键点自身尺度上提取」这一设计,若在错误尺度取邻域,128 维向量毫无意义。
- 组数层数乱设:层数(每组的尺度采样数)少于 3 会漏检大量极值,常见取 3–5。
- 在强重复纹理上盲信匹配:瓷砖、栅栏会产生大量「正确但歧义」的匹配,需 ratio test 与 RANSAC 双保险。
与其他知识点的关系
kp-008 在 SIFT 基础上讲二值描述子与匹配准则;kp-009 处理匹配中的外点;kp-023 的模板跟踪可视为只在单一尺度做匹配的退化情形。
自测题
- 为什么用 DoG 而不是直接用 LoG 找极值?
答案要点:相邻高斯尺度相减近似高斯二阶导(LoG),但只需逐级做卷积减法,计算远便宜且可用金字塔复用。
- SIFT 的旋转不变来自哪一步?
答案要点:为关键点分配主方向,并把提取描述子的邻域旋转到主方向对齐。
- 128 维怎么来的?
答案要点:关键点邻域划分 4×4 子块,每块统计 8 个方向的梯度直方图,4×4×8 = 128。
延伸阅读
- Lowe 2004《Distinctive Image Features from Scale-Invariant Keypoints》
- kp-009 看匹配结果如何被清洗为可靠几何