尺度空间与 SIFT

核心02-特征与匹配预计 30 分钟SIFT尺度空间DoG特征点

前置知识点

kp-006 角点检测:Harris 与 Shi-Tomasi kp-005 直方图、金字塔与多尺度

一句话定义

尺度空间用一组连续变化 σ 的高斯平滑版本表示同一幅图像,SIFT 在高斯差分(DoG)金字塔中找跨尺度极值点作为关键点,并为其分配方向与 128 维描述子,实现缩放与旋转不变的特征匹配。

为什么重要

真实物体在不同距离下成像大小不同,「同一特征跨尺度可再认」是匹配问题的分水岭;SIFT(1999 提出,2004 定稿)用一套完整工程把这一性质做实,支撑了此后十年的拼接、重建与识别,其「尺度空间 + 主方向 + 邻域描述子」的三段式结构至今仍是特征设计的范本。

直观类比

看一张合影,走近看能认出眼镜框上的螺丝(细节尺度),退远三步仍能认出那是同一副眼镜(轮廓尺度);SIFT 就是在所有「观察距离」上同时扫描,只有那些在任何距离都最显眼的位置才被记为关键点,并且记下「我是在哪个距离被认出来的」。

前置知识

kp-006(Harris 与尺度缺陷);kp-005(高斯/拉普拉斯金字塔)。

核心概念

原理与机制

流程四步:构建 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 点中最大或最小

图示

组内逐级平滑:σ 递增 相邻层相减 → DoG 在 (x, y, σ) 联合空间取极值 → 关键点自带尺度标签 按主方向旋转后提取描述子 同一物理结构在不同尺度层各有一次极值响应

实例与案例

全景拼接 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)

常见误区

与其他知识点的关系

kp-008 在 SIFT 基础上讲二值描述子与匹配准则;kp-009 处理匹配中的外点;kp-023 的模板跟踪可视为只在单一尺度做匹配的退化情形。

自测题

  1. 为什么用 DoG 而不是直接用 LoG 找极值?

答案要点:相邻高斯尺度相减近似高斯二阶导(LoG),但只需逐级做卷积减法,计算远便宜且可用金字塔复用。

  1. SIFT 的旋转不变来自哪一步?

答案要点:为关键点分配主方向,并把提取描述子的邻域旋转到主方向对齐。

  1. 128 维怎么来的?

答案要点:关键点邻域划分 4×4 子块,每块统计 8 个方向的梯度直方图,4×4×8 = 128。

延伸阅读

相关知识点

kp-005 直方图、金字塔与多尺度kp-023 单目标跟踪:相关滤波与 Siamese