尺度不变特征转换(Scale-invariant feature transform,SIFT),是一种图像特征提取与描述算法。SIFT是由David Lowe在1999年所发表,2004年进行了完善与总结。SIFT算法可以处理两幅图像之间发生平移、旋转、尺度变换、光照变化等情况下的特征匹配问题,并能在一定程度上对视角变化、仿射变化也具有稳定的特征匹配能力。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
SIFT算法的特点有:
1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。
一幅图像的SIFT特征向量的生成主要包括5步:尺度空间的生成、尺度空间极值检测、精确确定极值点、关键点方向确定、特征向量生成。
(1)DOG尺度空间生成
我们将图像的尺度空间表示成一个函数L(x,y,sigma),它是由一个变尺度的高斯函数G(x,y,sigma)与图像I(x,y)卷积产生的,即
G(x,y,sigma)则为
(x,y)是空间坐标,是尺度坐标。σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。 SIFT算法建议,在某一个尺度上对斑点的检测,可以通过对两个相邻高斯尺度空间的图像相减,得到一个DOG(Diffrence of Gaussians)的响应值图像D(x,y,sigma)。然后仿照LOG方法,通过对响应值图像D(x,y,sigma)进行非最大值抑制(局部极大搜索),在位置空间和尺度空间中定位斑点,其中
图像金字塔的建立:对于一幅图像I,建立其在不同尺度(scale)的图像,也成为子八度(octave),这是为了scale-invariant,也就是在任何尺度都能够有对应的特征点,第一个子八度的scale为原图大小,后面每个octave为上一个octave降采样的结果,即原图的1/4(长宽分别减半),构成下一个子八度(高一层金字塔)。
使用DOG对LOG近似带来的好处包括:1LOG需要使用两个方向的高斯二阶微分卷积核,而DOG直接使用高斯卷积核,省去了对卷积核的生成的运算量;2DOG保留了各个高斯尺度空间的图像,这样在生成某一空间尺度的特征时,可以直接使用L(x,y,sigma)函数产生的尺度空间图像,而无需再次生成该尺度的图像;3LOG对斑点进行检测较DOH(Determinant of Hessian),Harris和其他店检测方法稳定性更好,抗噪能力更强,而DOG是对LOG的近似和简化,因此,也具备这种能力。
(2)检测极值点
关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图3.4所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
(3)精确确定极值点
离散空间的极值点并不是真正的极值点,图4.1显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。
对于三元子像元插值,x(x,y,sigma)为三维矢量,当x^ (相对于插值中心点的偏移量)在任何方向上的偏移量大于0.5时,意味着插值中心点已经偏移到它的邻近点上,所以这样的点需要剔除,另外当|D(x^)|<0.03时(假设图像的灰度值在0~1.0之间),其响应值过小,这样的点易受到噪声的干扰而变得不稳定,所以也要被剔除。
为了得到稳定的特征点,只是剔除DOG响应值过低的点是不够的,由于DOG对图像中的边缘有比较强的响应值,而一旦特征点落在边缘上,这些点就是不稳定的点。一方面图像边缘上点是很难定位的,具有定位的歧义性;另一方面这样的点很容易受到噪声的干扰而变得不稳定。
一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。
DOG算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵,主曲率通过一个2x2 的Hessian矩阵H求出:
D值可以通过求取近邻点像元的差分得到。H的特征值与D的主曲率成正比例。
表示矩阵H对角线元素之和,表示矩阵H的行列式。假设是α较大的特征值,而是β较小的特征值,令α=γ*β,这样
上述的结果只是与两个特征值得比例有关,而与具体特征值无关。当这两个特征值相等时,(γ+1)^2/γ的值最小,随着γ的增加,(γ+1)^2/γ的值也增加。所以要想检查主曲率的比值小于某一阈值γ,只要检查下列式是否成立:
Lowe在论文中给出γ=10,也就是说,对于主曲率比值大于10的特征点将被删除,否则,这些斑点将被保留。
(4)关键点参数方向确定
为了实现图像旋转的不变性,需要根据检测到的特征点的局部图像结构求得一个方向基准。我们使用图像梯度的方法求取该局部结构的稳定方向。使用有限差分,计算以特征点为中心,以3*1.5sigma为半径的区域内图像梯度的幅角和副值,幅角和福值计算公式如下
在完成关键点的梯度计算后,使用直方图统计邻域内素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱(bins),其中每柱10度。如图5.1所示,直方图的峰值方向代表了关键点的主方向,(为简化,图中只画了八个方向的直方图)。
通过高斯加权,使特征点附近的梯度幅值有较大的权重,这样可以部分弥补因没有仿射不变性而产生的特征点不稳定的问题。在梯度方向直方图中,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值。
(5)特征点特征矢量生成
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
代码:
(1)Lowe的,http://download.csdn.net/detail/xc1499715227/8214649
(2)MATLAB版的,http://download.csdn.net/detail/xc1499715227/8255151