课程小结——SIFT特征提取

来源:互联网 发布:网络贷款无力偿还 编辑:程序博客网 时间:2024/06/06 08:30

      尺度不变特征变换匹配算法(Scale Invariant Feature Transform , SIFT),SIFT算法是用来提取图像局部特征的经典算法,SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

优点

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持       一定程度的稳定性。
2. 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量。
4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求。
5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

缺点

1. 实时性不够高。
2. 对边缘光滑的目标无法准确提取特征点,对圆更是无能为力。
3. 对模糊的图像,检测出的特征点过少。
主要应用

1. 目标的旋转、缩放、平移
2. 图像仿射/投影变换
3. 光照影响
4. 目标遮挡
5. 杂物场景
6. 噪声
    典型应用于物体识别、机器人定位与导航、图像拼接、三维建模、手势识别、视频跟踪、笔记鉴定、指纹与人脸识别、犯罪现场特征提取......

算法步骤

1. 构建DOG尺度空间
            尺度空间:在视觉信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得不同尺度下的视觉处理信息,然后综合这些信息以深入地挖掘图像的本质特征。尺度空间的生成目的是模拟图像数据多尺度特征。

       尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。大尺度对应图像的概貌特征,小尺度对应图像的细节特征。所以对不同尺度的图像检测关键点,最终得到的sift特征点具有尺度不变性。尺度空间是客观存在的,我们使用高斯卷积的形式来表现尺度空间。

       高斯模糊:尺度空间的生成需要使用高斯模糊来实现,Lindeberg等人已经证明高斯卷积核是实现尺度变换的唯一线性核。高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。

       对图像做卷积运算可以看做是加权求和的过程,把使用到的图像区域中的每个元素分别与卷积核的每个对应位置的元素相乘,所有乘积之和作为区域中心的像素值。可以看出高斯模板是圆对称的,且卷积的结果使原始像素值有最大的权重,距离中心越远的相邻像素值权重也越小。

       

                   

                  

       

       其中I(x,y)是图像区域,G(x,y,σ)是尺度可变高斯函数,x,y是空间坐标,σ大小决定图像的平滑程度。

        

          构造高斯金字塔:金字塔是图像多尺度的表示形式,传统的金字塔中,每一层都是由上一层降采样得到,也就是长宽都隔一行(列)采样,最终得到原图的1/4。而为了得到DOG图像,要先构造高斯金字塔,高斯金字塔就是在传统金字塔的基础上,对每一层用不同的参数σ做高斯模糊,使得每一层金字塔有多张高斯模糊图像,这样一组图像是一个octave。octave内的图像大小一样,只是高斯模糊使用的尺度参数不同。

       LOG和DOG: 尺度归一化的高斯拉普拉斯函数的极大值和极小值能产生稳定的图像特征。但此处若使用LOG,则后续计算量较大,故使用DOG来代替LOG,用差分代替微分。
       LOG就是对高斯函数做拉普拉斯变换:

                                                                     

       DOG,高斯差分函数(Difference of Gaussian ,简称DOG算子),与尺度归一化的高斯拉普拉斯函数非常近似。利用差分近似代替微分,则有:

                                                         

其中k-1是个常数,并不影响极值点位置的求取。

       构建DOG金字塔:为了有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间(DOG scale-space)。利用不同尺度的高斯差分核与图像卷积生成。

                                     

       在检测极值点前对原始图像进行的高斯平滑以致图像丢失高频信息,所以原始论文中建议在建立尺度空间之前对原始图像的长宽扩展一倍,以保留原始图像信息,增加特征点数量。

       对于一幅图像,建立其在不同尺度scale下的图像,也称为octave,这是为了scale-invariant,也就是在任何尺度都能有对应的特征点。下图中右侧的DOG就是我们构建的尺度空间。

                                             

       尺度scale的所有取值:  i是octave的序号,s是每组的层数(一般是3-5层),这个一般由图像size决定。

       假设s=3,也就是每个塔里有3层,则k=2^(1/s)=2^(1/3),那么按照上图可得Gauss Space和DoG space 分别有3个(s个)和2个(s-1个)分量,在DoG space中,1st-octave两项分别是σ,kσ; 2nd-octave两项分别是2σ,2kσ;......


2. 关键点搜索和定位

       为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。下图中将叉号点要比较的26个点都标为了绿色。

                                                                

同一组的相邻尺度之间进行寻找:

                                         

       因为首尾两张图都只有一个相邻图,无法进行极值比较(因为极值定义中,极值点是连续的)。为了满足尺度变化连续性,要在octave每一组的顶层再生成3幅图像,则高斯金字塔有S+3幅图像,而DOG金字塔有S+2幅图像。

       关于尺度变化连续性:(参考材料:http://blog.csdn.net/abcjennifer/article/details/7639681)
       假设s=3,也就是每个塔里有3层,则k=2^(1/s)=2^(1/3),那么按照上图可得Gauss Space和DoG space 分别有3个(s个)和2个(s-1个)分量,在DoG space中,1st-octave两项分别是σ,kσ; 2nd-octave两项分别是2σ,2kσ;......由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得形成σ,kσ,k^2*σ,k^3*σ,k^4*σ,这样就可以选择DoG space中的中间三项kσ,k^2*σ,k^3*σ(只有左右都有才能有极值),那么下一octave中(由上一层降采样获得)所得三项即为2kσ,2k^2*σ,2k^3*σ,其首项2kσ=2^(4/3)。刚好与上一octave末项k^3*σ=2^(3/3)尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。


       关键点精确定位:以上极值点的搜索是在离散空间进行搜索的,由下图可以看到,在离散空间找到的极值点不一定是真正意义上的极值点。可以通过对尺度空间DoG函数进行曲线拟合寻找极值点来减小这种误差。

                                           

       利用DoG函数在尺度空间的Taylor展开式:

                                                                  

       则极值点为:

                                                                             

       删除边缘效应:除了DoG响应较低的点,还有一些响应较强的点也不是稳定的特征点。DoG对图像中的边缘有较强的响应值,所以落在图像边缘的点也不是稳定的特征点。

       边缘效应的删除能够更进一步的得到稳定的特征点。因为一个物体的边缘在不同的图像中或者在同一副图像中都可能会有变化。E.g. 一个正方形,在一幅图像中可以是两条水平线以及两条垂直的线组成,而在另一幅图像中,可以是有角度的旋转,类似于普通菱形。而其实它们都是同一个图像,如果利用边缘去做识别的话,因为4条边完全不一样,那就有可能识别错误。所以我们需要将这些边缘特征尽可能的删除,留下最具代表性的角上的点。在SIFT中,DOG算子近似拉普拉斯算子,对边缘都有很强的检测效果,那当然需要从这些特征点中删除哪些是具有强边缘效应的点。
       至此,我们得到了关键点的位置信息和尺度信息(x,y,σ)。

3. 方向赋值

       梯度直方图:为了实现图像的旋转不变性,需要根据检测到的关键点的局部图像结构为特征点方向赋值。

       方向直方图的核心是统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
       在上一步,精确定位关键点后,可以得到该特征点的尺度值σ,根据这一尺度值,得到最接近这一尺度值的高斯图像:

                                                           

       使用有限差分,计算以关键点为中心,以3×1.5σ为半径的区域内图像梯度的幅角和幅值,公式如下:

                                               

       梯度方向直方图的横轴是梯度方向角,纵轴是剃度方向角对应的梯度幅值累加值。梯度方向直方图将0°~360°的范围分为8个柱,每45°为一个柱。


       高斯平滑:在计算直方图时,每个加入直方图的采样点都使用圆形高斯函数函数进行了加权处理,也就是进行高斯平滑。这主要是因为SIFT算法只考虑了尺度和旋转不变形,没有考虑仿射不变性。通过高斯平滑,可以使关键点附近的梯度幅值有较大权重,从而部分弥补没考虑仿射不变形产生的特征点不稳定。

       

       关键点方向:直方图峰值代表该关键点邻域内图像梯度的主方向,当存在另一个相当于主峰值 80%能量的峰值时,则认为这个方向是该关键点的辅方向。所以一个关键点可能检测得到多个方向,这可以增强匹配的鲁棒性。Lowe的论文指出大概有15%关键点具有多方向,但这些点对匹配的稳定性至为关键。具有多个方向的关键点可以复制成多份,然后将方向值分别赋给复制后的关键点。
       至此,我们得到了关键点的位置、尺度、方向信息(x,y,σ,θ)。h(x,y,θ)是一个三维矩阵,但通常经过矩阵压缩后用一个向量表示。


4. 关键点描述子的生成

       这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点。这样可使关键点有更多的不变特性,提高目标匹配效率。

       描述子采样区域:特征描述子与关键点所在尺度有关,因此对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近划分成d×d个子区域,每个子区域尺寸为mσ个像元(d=4,m=3,σ为尺特征点的尺度值)。考虑到实际计算时需要双线性插值,故计算的图像区域为mσ(d+1),再考虑旋转,则实际计算的图像区域为1.47mσ(d+1)。

       区域坐标旋转:为了使sift特征点具有旋转不变性,要以特征点为中心,在附近邻域内旋转θ角,即旋转为特征点的方向。

                                                              

       旋转后区域内采样点新的坐标为:

                                                                                                                      

       计算采样区域梯度直方图:将旋转后区域划分为d×d个子区域(每个区域间隔为mσ像元),在子区域内计算8个方向的梯度直方图,绘制每个方向梯度方向的累加值,形成一个种子点。与求主方向不同的是,此时,每个子区域梯度方向直方图将0°~360°划分为8个方向区间,每个区间为45°。即每个种子点有8个方向区间的梯度强度信息。
然后对子区域的像素的梯度大小采用mσd/2的高斯加权函数加权。由于存在d×d,即4×4个子区域,所以最终共有4×4×8=128个数据,形成128维SIFT特征矢量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理。


程序实现

       参考链接http://blog.csdn.net/soaringlee_fighting/article/details/52680659

这里MATLAB实现程序时,必须要在MATLAB的安装目录bin的win32下面加上siftwin32.exe,否则会报错。


-------------------------------------------------------------------------------------------------------------------------------------------

References

算法流程参考链接:

http://blog.csdn.net/happyer88/article/details/45817305

主要学习思路和大部分图片来自这里:
http://blog.csdn.net/xiaowei_cqu/article/details/8069548
数学推导:
http://blog.csdn.net/zddblog/article/details/7521424

原创粉丝点击