SIFT(尺度不变特征变换,Scale‐Invariant Feature Transform)是在计算机视觉领域中检测和描述图像中局部特征的算法,该算法于 1999 年被 David Lowe 提出,并于 2004 年进行了补充和完善。
用 SIFT 算法所检测到的特征是局部的,而且该特征对于图像的尺度和旋转能够保持不变性。同时,这些特征对于亮度变化具有很强的鲁棒性,对于噪声和视角的微小变化也能保持一定的稳定性。 SIFT 特征还具有很强的可区分性,它们很容易被提取出来,并且即使在低概率的不匹配情况下也能够正确的识别出目标来。因此鲁棒性和可区分性是 SIFT 算法最主要的特点。
算法描述
SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。
日常的应用中,多数情况是给出一幅包含物体的参考图像,然后在另外一幅同样含有该物体的图像中实现它们的匹配。两幅图像中的物体一般只是旋转和缩放的关系,加上图像的亮度及对比度的不同,这些就是最常见的情形。基于这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。首先在形状上物体既有旋转又有缩小放大的变化,如何找到这样的对应点呢?于是他们的想法是首先找到图像中的一些“稳定点”,这些点是一些十分突出的点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有相互对应的匹配点,正是基于这样合理的假设,SIFT算法的基础是稳定点。
整个算法分为以下几个步骤:
1关键点检测、2关键点描述、3关键点匹配、4消除错配点
1关键点检测
1.1建立尺度空间
SIFT算法找稳定点的方法是找灰度图的局部最值,由于数字图像是离散的,想求导和求最值这些操作都是使用滤波器,而滤波器是有尺寸大小的,使用同一尺寸的滤波器对两幅包含有不同尺寸的同一物体的图像求局部最值将有可能出现一方求得最值而另一方却没有的情况,但是容易知道假如物体的尺寸都一致的话它们的局部最值将会相同。SIFT的精妙之处在于采用图像金字塔的方法解决这一问题,我们可以把两幅图像想象成是连续的,分别以它们作为底面作四棱锥,就像金字塔,那么每一个截面与原图像相似,那么两个金字塔中必然会有包含大小一致的物体的无穷个截面,但应用只能是离散的,所以我们只能构造有限层,层数越多当然越好,但处理时间会相应增加,层数太少不行,因为向下采样的截面中可能找不到尺寸大小一致的两个物体的图像。
真实世界的物体只有在一定尺度上才有意义,例如我们能够看到放在桌子上的水杯,但对于整个银河系,这个水杯是不存在的。物体的这种多尺度的本质在自然界中是普遍存在的。尺度空间就是试图在数字图像领域复制这个概念。又比如,对于某幅图像,我们是想看到叶子还是想看到整棵树,如果是树,那么我们就应该有意识的去除图像的细节部分(如叶子、细枝等)。在去除细节部分的过程中,我们一定要确保不能引进新的错误的细节。因此在创建尺度空间的过程中,我们应该对原始图像逐渐的做模糊平滑处理。进行该操作的唯一方法是高斯模糊处理,因为已经被证实,高斯函数是唯一可能的尺度空间核。
1.1 高斯金字塔
高斯金字塔(Gaussian Pyramid):高斯金字塔里有两个概念:组(Octave)和层(Level或Interval),每组里有若干层。
说明:
(1)建立高斯金字塔
根据二维高斯滤波函数,对图像进行高斯滤波:
一幅图像I(x,y),在不同尺度空间下的表示可以由图像与高斯核卷积得到 Gaussian 图像:
其中:(