SIFT算法详解与实现

来源:互联网 发布:强制加微信好友软件 编辑:程序博客网 时间:2024/06/08 17:22

     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)第一组的第一层为原图像,然后将图像做一次高斯平滑(高斯卷积、高斯模糊)高斯平滑里有一个参数σ,在SIFT里作者取1.6;
(2)将σ乘一个比例系数k作为新的平滑因子来平滑第一组第二层得到第三层。
(3)重复若干次,得到L层他们分别对应的平滑参数为:0,σ,kσ,k2σ....。
(4)将最后一幅图像做比例因子为2的降采样得到第二组的第一层,然后对第二组的第一层做参数是σ的高斯平滑,对第二层做kσ的平滑得到第三层.....这里一定注意:每组对应的平滑因子是一样的。而不是像有的资料上说的持续递增。
这样反复形成了O组L层。一般模糊的高斯模板长宽都约为6σ(这里σ为当次的平滑因子,就是可能是kσ,k2σ..)

DoG(Difference of Gaussian)金字塔:他是由高斯金字塔构造出来的,他的第一组第一层是由高斯金字塔的第一组第二层减第一组第一层,他的第一组第二层是由高斯金字塔的第一组第三层减第一组第二层得到,(说的这么繁琐是为了大家能理解的直观点)。每组都这样就生成了DoG金字塔。顺便说一下,DoG金字塔每组图像几乎都是一片黑,但仔细看你能看出轮廓的。

 
说明:
1、在SIFT里高斯金字塔的第一组第一层通常是由一个原图像长宽扩大一倍开始的,这样做是为了可以得到更多的特征点。
2、大家可以发现如果用每组5层的高斯金字塔构造一个DoG金字塔的的话,DoG的每组的层数是4。
3、对于DoG金字塔,特征点的搜索从每组的二层到倒数第二层的(后面说明为什么),所以如果实际用n层那么DoG金字塔应该有n+2层,那么对应的高斯金字塔应该有n+3层。

1)建立高斯金字塔

根据二维高斯滤波函数,对图像进行高斯滤波:

                                        (1) 

一幅图像I(x,y),在不同尺度空间下的表示可以由图像与高斯核卷积得到 Gaussian 图像:

                                       (2)

其中:(x,y)为图像I 上的点,L 表示尺度空间,σ为尺度空间因子。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。σ值越小表示图像被平滑得越大,即分辨率越高。

根据尺度函数来建立高斯金字塔,高斯金字塔的第一阶的第一层是原始图像。高斯金字塔有o阶、s层,在同一阶上的两个相邻层之间的尺度比例为k,例如第1阶第2层的尺度因子为σ,则第1阶第3层的尺度因子为kσ,并且每一阶图像是前一阶图像大小的 1/2 如图1 左边的高斯金字塔。

 

这里写图片描述 

关于尺度空间的理解说明:如图2所示,尺度空间是连续的。在Lowe的论文中,将第0层的初始尺度定为1.6,图片的初始尺度定为0.5. 在检测极值点前对原始图像的高斯  平滑以致图像丢失高频信息,所以Lowe建议在建立尺度空间前首先对原始图像长宽扩展一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。

 


2)建立 DOG 高斯金字塔

在高斯金字塔的基础上,利用同一阶上的两个相邻的两层的尺度空间函数之差得到 DOG高斯金字塔的一层。

DOG的表达式定义为:

                           (3)

由此图 1 可以看出如何由高斯金字塔得到 DOG金字塔。

3)检测极值点

为了检测到DOG空间的局部极值点,每一个采样点要和它所有的相邻点比较。如图3所示,中间的检测点需要与它同层的8个,上层和下层各9个像素点进行比较,以确保在尺度空间和二维图像控件都检测到极值点。如果该检测点为最大值或者最小值,则该点为图像在该尺度下的一个候选关键点。

 


在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度     变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了3 幅图像,高斯金字     塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

 

1.2特征点过滤及精确定位

关键点的选取要经过两步:①它必须去除低对比度和对噪声敏感的候选关键点;②去除边缘点。

1)去除低对比度的点

对局部极值点进行三维二次函数拟合以精确确定特征点的位置和尺度,尺度空间函数D(x,y,σ)的泰勒展开式如公式(4)所示:

 

                             (4)

令上式对x的偏导数等于0,可得极限点位置

 

                                             (5)

把公式(5)代入公式(4)中,可得:

                                      (6)

,该特征点就保留下来,否则丢弃。

2)去除边缘点

一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。主曲率由海森矩阵求出:

                                              (7)

D的主曲率和H的特征值成正比,令α为最大特征值,β为最小特征值,则

                                  8

                              9

令α=αβ,则:

                      10

如果,曲率小于(r+1)2/r,保留该特征点,否则丢弃。

2 关键点描述

2.1 关键点方向分配

通过尺度不变性求极值点,可以使其具有缩放不变的性质,利用关键点邻域像素的梯度方向分布特性,我们可以为每个关键点指定方向参数方向,从而使描述子对图像旋转具有不变性。

通过求每个极值点的梯度来为极值点赋予方向。


为(x,y)处梯度的模值和方向公式。其中L所用的尺度为每个关键点各自所在的尺度。至此,图像的关键点已经检测完毕,每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。

方向直方图的生成

    确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。

直方图以每10度方向为一个柱,共36个柱,柱所代表的方向为像素点梯度方向,柱的长短代表了梯度幅值。

根据Lowe的建议,直方图统计半径采用3*1.5*σ

在直方图统计时,每相邻三个像素点采用高斯加权,根据Lowe的建议,模板采用[0.25,0.5,0.25],并连续加权两次。


关键点的主方向与辅方向

关键点主方向:极值点周围区域梯度直方图的主峰值,也是特征点方向

关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该关键点的辅方向。

这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有多方向,但这些点对匹配的稳定性至为关键。


直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向

由梯度方向直方图确定主梯度方向



 

方向分配实现步骤

1. 确定计算关键点直方图的高斯函数权重函数参数 ;

2. 生成含有36柱的方向直方图,梯度直方图范围0~360度,其中每10度一个柱。由半径为图像区域生成;

3. 对方向直方图进行两次平滑;

4. 求取关键点方向(可能是多个方向);

5. 对方向直方图的Taylor展开式进行二次曲线拟合,精确关键点方向;

图像的关键点已检测完毕,每个关键点有三个信息:位置、尺度、方向;同时也就使关键点具备平移、缩放、和旋转不变性。

 

2.2 生成特征描述符

描述的目的是在关键点计算后,用一组向量将这个关键点描述出来,这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。用来作为目标匹配的依据,也可使关键点具有更多的不变特性,如光照变化、3D视点变化等。

通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性

下图是一个SIFT描述子事例。其中描述子由2×2×8维向量表征,也即是2×2个8方向的方向直方图组成。左图的种子点由8×8单元组成。每一个小格都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方向,箭头长度代表该像素的幅值。然后在4×4的窗口内计算8个方向的梯度方向直方图。绘制每个梯度方向的累加可形成一个种子点,如右图所示:一个特征点由4个种子点的信息所组成。

 

 

Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优(不变性与独特性)。

 

128维关键点描述子(就是特征描述符)生成步骤

1. 确定计算描述子所需的图像区域描述子梯度方向直方图由关键点所在尺度的模糊图像计算产生。图像区域的半径通过下式计算:

  

2. 将坐标移至关键点主方向


那么旋转角度后新坐标为:


3.在图像半径区域内对每个像素点求其梯度幅值和方向,然后对每个梯度幅值乘以高斯权重参数,生成方向直方图。

 

 

  该点与关键点的列距离

  该点与关键点的行距离

  等于描述子窗口宽度    ×直方图列数(取4)的一半

4.在窗口宽度为2X2的区域内计算8个方向的梯度方向直方图,绘制每个梯度方向的累加值,即可形成一个种子点。然后再在下一个2X2的区域内进行直方图统计,形成下一个种子点,共生成16个种子点。

5.描述子向量元素门限化及门限化后的描述子向量规范化。

描述子向量元素门限化:方向直方图每个方向上梯度幅值限制在一定门限值以下(门限一般取0.2)。

描述子向量元素规范化:

为得到的128描述子向量

为规范化后的向量

 

 

关键点描述子向量的规范化正是可去除满足此模型的光照影响。对于图像灰度值整体漂移 ,图像各点的梯度是邻域像素相减得到,所以也能去除。

3 关键点匹配

分别对模板图(参考图,reference image)和实时图(观测图,observation image)建立关键点描述子集合。目标的识别是通过两点集内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。

模板图中关键点描述子:


实时图中关键点描述子:


任意两描述子相似性度量:

要得到配对的关键点描述子, 需满足:


关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太多,一般都采用一种叫kd树的数据结构来完成搜索。搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最邻近的原图像特征点和次邻近的原图像特征点。

Kd树是一个平衡二叉树



 

关键点匹配并不能标志着算法的结束,因为在匹配的过程中存在着大量的错配点。

 

图中交叉的绿线为错配点

 

4 消除错配点

RANSAC(Random Sample Consensus,随机抽样一致 )是一种鲁棒性的参数估计方法。

RANSAC实质上就是一个反复测试、不断迭代的过程。

RANSAC的基本思想:

首先根据具体问题设计出某个目标函数,然后通过反复提取最小点集估计该函数中参数的初始值,利用这些初始值把所有的数据分为“内点”( inlier )和“外点“(outlier),最后用所有的内点重新计算和估计函数的参数。

 

RANSAC事例


拟合直线:y=kx+b    

 


1 0