本书《OpenCV 2.4.9源码解析——SIFT》深入剖析了OpenCV库中SIFT算法的实现细节,适合计算机视觉开发者阅读参考。
### OpenCV 2.4.9 源码分析——SIFT
#### SIFT算法概述
SIFT(尺度不变特征变换)是一种在计算机视觉领域广泛应用的局部特征检测与描述方法,最早由David Lowe于1999年提出,并在其后进行了进一步完善。由于其强大的鲁棒性和可区分性,该算法被广泛应用于目标识别、自动导航、图像拼接、三维建模、手势识别及视频跟踪等多个领域。
然而需要指出的是,SIFT算法在美国获得了专利保护,且由加拿大不列颠哥伦比亚大学持有此专利权,这意味着未经许可不得随意使用该技术。
#### SIFT 算法特点
- **局部特征**:SIFT 特征基于图像的局部信息提取。
- **尺度不变性**:在不同尺度下保持一致性的特性点检测能力。
- **旋转不变性**:不受图像旋转影响,确保识别一致性。
- **亮度鲁棒性**:对光照变化具有良好的抗干扰性能。
- **稳定性**:特征点能够抵抗视角改变和噪声的一定程度的影响。
- **可区分性**:即使在低概率不匹配的情况下也能正确识别目标。
#### SIFT 算法的四个阶段
##### 1. 尺度空间极值检测
该阶段的目标是在所有可能尺度与位置上找到潜在特征点。为此,采用了一种名为高斯差分(DoG, Difference of Gaussians)的方法来确定具有旋转不变性的特征点。
**尺度空间的概念**:在现实世界中,物体通常只在其特定的尺寸范围内有意义;例如,在宇宙尺度下一杯水可能变得毫无意义。因此为了模拟这种多尺度性质引入了“尺度空间”的概念,即一系列经过不同程度高斯模糊处理后的图像集合。
**高斯模糊**:这是一种线性滤波器技术,用于平滑图像并去除不必要的细节信息。它是创建尺度空间的核心工具之一,因为只有使用高斯函数才能生成连续的尺度空间。
**尺度空间函数**:通过将原始图像与不同宽度的高斯核进行卷积运算得到:
\[ L(x,y,\sigma) = G(x,y,\sigma) * I(x, y) \]
其中 \(G(x,y,\sigma)\) 为高斯函数,具体形式如下所示:
\[ G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}} \]
**尺度空间的构建**:实际应用中初始图像的尺度被设定为0.5。由较小尺寸生成较大尺寸可以通过以下公式来实现:
\[ L(x,y,\sigma_2) = G(x,y,(\sigma_2-\sigma_1)^2)*L(x,y,\sigma_1), \quad \sigma_ 2 >\sigma _1 \]
其中 \(G((x,y),(\sigma^2 - \mu^2))\) 是调整后的高斯函数。
**特征点检测**:利用拉普拉斯算子(LoG)或近似的高斯差分算子来识别不同尺度下的图像关键点,通过寻找局部极大值和极小值得到候选的特征位置与规模。
##### 2. 特征点定位
在初步筛选出的候选特征上进行进一步精确定位。这一过程包括对附近像素拟合以提高精确度。
##### 3. 方向角度确定
为每个检测到的关键点分配一个或多个方向,通过计算周围区域梯度来实现这一点。这样可以确保关键点在旋转方面保持不变性。
##### 4. 特征描述符构建
最后,在定位好特征点的位置、尺度和方向后,接下来的任务是生成一种稳定且区分性强的描述方式。SIFT算法通过测量邻近像素的图像梯度来实现这一点,并最终形成一个鲁棒性和可区别的特征向量。
总的来说,SIFT 算法提供了一个完整的框架用于检测与描述关键点,在不同场景下仍能保持一致性,这使得它成为计算机视觉领域中的重要工具。