SIFT(Scale-Invariant Feature Transform)是一种用于图像特征检测和匹配的算法,由 David Lowe 在 1999 年提出,并在 2004 年发表完整论文。它可以在 不同尺度、旋转、光照变化的情况下保持稳定,常用于目标检测、图像拼接、物体识别等任务。
SIFT 算法的 4 个主要步骤
SIFT 主要包括 关键点检测、关键点定位、方向分配、特征描述符生成 四个步骤。
1. 关键点检测(尺度空间极值检测)
目标:在不同尺度下寻找稳定的关键点。
• 由于图像中的目标可能具有不同的尺寸,为了检测所有尺度的关键点,SIFT 使用 高斯金字塔 来构造 尺度空间。
• 通过对图像进行 不同尺度的模糊处理(高斯模糊),然后计算 差分高斯(DoG, Difference of Gaussian),找到图像在不同尺度上的关键点。
步骤:
- 构造高斯金字塔:
• 先对图像进行不同 σ(标准差)的高斯模糊。
• 下采样(每次降采样 2 倍)形成不同的尺度空间。
- 计算 DoG(差分高斯):
• DoG = 高斯模糊后图像的相邻尺度之差
• DoG 可以突出关键的边缘和特征点。
- 寻找极值点:
• 在 空间(x, y)和尺度(σ) 方向上寻找局部极值点(最大值或最小值)。
• 这意味着在 当前点的 26 个邻域点(前后 3 个尺度 × 3×3 邻域)中,该点是最突出的。
🔍 关键点:DoG 在局部极值处的点,即可能的特征点。
2. 关键点精确定位
目标:消除不稳定的特征点(如边缘点、噪声点),提高关键点的鲁棒性。
- 去除低对比度点
• 低对比度点容易受噪声干扰,因此使用 泰勒展开近似 来求解关键点的精确位置,并去掉低对比度点(|DoG 值| 低于设定阈值)。
- 去除边缘响应
• 关键点可能出现在边缘,但边缘特征容易变化且不稳定。
• 通过 Hessian 矩阵的特征值分析 计算主曲率,并剔除边缘响应点。
🔍 最终留下的是在不同尺度上稳定的关键点。
3. 方向分配
目标:确保特征点在旋转变化下仍能正确匹配。
• 在关键点附近计算 梯度直方图,确定主要方向,以实现旋转不变性。
- 计算关键点邻域的 梯度方向和幅值:
其中 是高斯模糊后的图像。
- 计算 梯度方向直方图(分成 36 个方向)。
• 直方图峰值对应的方向被赋予该关键点。
🔍 关键点的方向分配后,使其具有旋转不变性。
4. 生成 SIFT 特征描述符
目标:构造一个 128 维的特征向量,使其对光照、尺度、旋转变化具有鲁棒性。
以关键点为中心,取 16×16 的邻域窗口,分成 4×4=16 个子区域。
计算每个子区域内的 8 个方向梯度直方图(8 个方向 × 16 个区域 = 128 维)。
归一化,确保特征向量对光照变化不敏感。
🔍 最终每个关键点都有一个 128 维的特征向量,便于后续匹配。
SIFT 特征匹配
有了 SIFT 关键点和 128 维描述符后,可以进行 特征匹配,常见的方法有:
- 暴力匹配(BFMatcher):
• 直接计算 欧式距离(L2 范数),找到最近邻匹配。
- FLANN(快速近似最近邻搜索):
• 适用于大规模匹配,搜索速度更快。
- KNN 近邻匹配 + Lowe’s 比值测试:
• 取两个最近的匹配点,若 最佳匹配的距离 < 0.75 × 次佳匹配的距离,则认为是正确匹配点。
SIFT 的特点
优点
✅ 尺度不变性:可以检测不同大小的目标。
✅ 旋转不变性:关键点有方向分配,不受旋转影响。
✅ 光照鲁棒性:特征基于梯度,不受亮度影响。
✅ 特征稳定:在噪声和遮挡情况下仍能匹配目标。
缺点
❌ 计算量大:SIFT 计算较慢,不适用于实时处理。
❌ 对仿射变换的鲁棒性一般:在剧烈的透视变换下匹配效果下降。
❌ 专利问题(2004 年至 2020 年):SIFT 曾受专利保护,直到 2020 年才进入公有领域。
SIFT 适用场景
✅ 图像拼接:计算两张图像之间的重叠区域(如全景图拼接)。
✅ 目标检测:在大图中找到模板匹配的目标物体。
✅ 机器人导航:检测环境中的关键特征进行定位。
✅ 医学影像分析:如 CT、MRI 图像配准。
如果实时性要求高,可以用 ORB(Oriented FAST and Rotated BRIEF) 代替 SIFT,计算更快,但精度略低。
总结
| 步骤 | 关键操作 | 作用 |
|---|---|---|
| 1. 关键点检测 | DoG + 高斯金字塔 | 选择尺度空间中的显著点 |
| 2. 关键点精确定位 | 去除低对比度点和边缘点 | 只保留稳定的关键点 |
| 3. 方向分配 | 计算梯度直方图 | 让特征点具有旋转不变性 |
| 4. 特征描述符 | 128 维梯度直方图 | 用于特征匹配 |
🔹 SIFT 能在不同尺度、旋转、光照变化下稳定匹配特征点,但计算量较大,不适用于实时应用。
💬 评论