SIFT
Scale-Invariant Feature Transform
SIFT(尺度不变特征变换)是计算机视觉领域中一种非常重要的局部特征提取算法。它能够在图像中检测和描述具有尺度不变性、旋转不变性、亮度变化不变性以及对部分视角变化和噪声具有鲁棒性的局部特征点(关键点)。SIFT特征因其独特性和鲁棒性,在图像匹配、物体识别等任务中取得了巨大成功。
核心思想:在不同尺度空间寻找稳定点
SIFT的核心思想是模拟人类视觉系统对物体识别的鲁棒性。无论物体大小、旋转角度、光照强弱如何变化,我们都能识别出它。SIFT通过在尺度空间 (Scale Space) 中寻找图像的极值点,并为这些点构建具有不变性的描述符来实现这一目标。
算法流程
SIFT算法主要分为四个阶段:
1. 尺度空间极值检测 (Scale-space Extrema Detection)
- 目的: 在不同尺度(即不同模糊程度)的图像中寻找潜在的兴趣点。
- 方法: 使用高斯差分 (Difference of Gaussians, DoG) 函数来近似拉普拉斯高斯(LoG)算子。DoG图像是通过将同一图像在不同尺度(不同标准差的高斯滤波)下进行高斯模糊,然后将两张模糊图像相减得到的。
- 过程: 构建高斯金字塔,然后在金字塔的每一层(不同尺度)和相邻层之间进行DoG操作,并在DoG图像中寻找局部极值点(即潜在的关键点)。
2. 关键点定位 (Keypoint Localization)
- 目的: 精确确定上一步检测到的潜在关键点的位置、尺度和主方向。
- 方法: 对DoG函数进行泰勒展开,通过拟合三维二次函数来精确确定关键点的亚像素位置、亚尺度位置,并去除低对比度点和边缘响应点(这些点不稳定)。
3. 方向分配 (Orientation Assignment)
- 目的: 为每个关键点分配一个或多个主方向,以实现旋转不变性。
- 方法: 在关键点周围的邻域内,计算每个像素的梯度幅值和方向。然后,构建一个方向直方图,直方图的峰值方向被认为是该关键点的主方向。如果存在多个峰值(如90%峰值),则为该关键点分配多个主方向,从而生成多个具有相同位置和尺度的关键点,但方向不同。
4. 关键点描述 (Keypoint Descriptor)
- 目的: 为每个关键点构建一个独特的、对光照和视角变化具有鲁棒性的特征向量。
- 方法: 以关键点为中心,以其尺度为半径,取一个16x16的邻域。将这个邻域划分为4x4的子区域。在每个子区域内,计算8个方向的梯度方向直方图。最终,将这16个子区域的直方图拼接成一个128维的特征向量。为了对光照变化具有鲁棒性,这个向量会被归一化。
优缺点分析
| 优点 (Pros) | 缺点 (Cons) |
|---|---|
| 尺度不变性:能在不同大小的图像中检测到相同的特征点。 | 计算量大:算法复杂,计算成本高,实时性差。 |
| 旋转不变性:通过方向分配,对图像旋转不敏感。 | 专利问题:SIFT算法曾受专利保护,限制了其在商业应用中的广泛使用(现已过期)。 |
| 对光照变化鲁棒:通过归一化描述符,对亮度变化不敏感。 | 对仿射变换不完全不变:对于较大的视角变化,性能会下降。 |
| 独特性强:每个关键点描述符都具有高度独特性,适合精确匹配。 |
应用领域
SIFT特征因其卓越的性能,在深度学习兴起之前,是计算机视觉领域许多任务的基石:
- 图像匹配与拼接: 用于识别不同图像中的相同物体或场景,实现全景图像拼接。
- 物体识别与检索: 在图像库中识别或检索特定物体。
- 三维重建: 从多张二维图像中重建物体的三维模型。
- 机器人导航与SLAM: 用于识别环境中的路标点。