SIFT SURF

news/2024/7/21 4:56:22 标签: 图像处理, 计算机视觉

(本篇BLOG借鉴多篇网络blog的内容,先对各大网友表示感谢)



本BLOG另有两篇特征点检测的文章。

----------------------------------SIFT-------------------------------------------------

sift算法在cv领域的重要性不言而喻,该作者的文章引用率在cv界是No.1.

首先网上有不少文章介绍了sift算法,写得都不错,比如: 

http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html

该博客对sift算法理论做了介绍,且有示意图辅助理解,从该文中可以了解sift算法的大概流程.

http://www.cnblogs.com/linyunzju/archive/2011/06/14/2080950.html

这篇文章对sift算法做了通俗易懂的解释.

http://blog.csdn.net/v_july_v/article/category/795430

这篇博客有教你怎样用c语言一步一步写sift算法。

http://underthehood.blog.51cto.com/2531780/658350

该文也对sift做了详细的介绍,博客的作者还对sift匹配做了讲解。

下面还是简单看下sift算法的理论,具体的内容可以参考上面的几篇文章。


一、Sift描述子形成的步骤

1、 构造高斯差分空间图像。


DoG图像是将相邻尺度空间图像相减得到的。


Sift特征点的检测时在DOG图像上进行的,DOG图像是将相邻尺度空间图像相减得到的。且金字塔的每一层都要构造一个DOG空间图像。默认参数是金字塔4层,即4个octave,每一个octave中有5张不同尺度的图片,不同octave的图片尺寸大小不同,所以每一层中就会得到4幅DOG图像。

高斯金字塔的第1层第1副原图像是将原图像放大2倍且sigma(sigma=1.6)模糊,第2幅图像是k*sigma(k等于根号2)模糊,第3幅是k*k*sigma模糊,后面类推…

     高斯金字塔第2层第1幅图是选择金字塔上一层(这里是第1层)中尺度空间参数为k*k*sigma的那幅图(实际上是2倍的尺度空间)进行降采样(尺寸大小为原来的1/4倍)得到,如果k不等于根号2,那么取原图的2*sigma降采样得到。第2层第2幅图是在本层第一幅图尺度模糊系数增加k倍模糊后的图像,后面类似…

  示意图如下所示:


尺度不变当然是与图片尺寸有关,即图片的尺寸大小变化,但是其检测结果不变。

2、寻找极大极小值点。

  将每个像素点与其所在的那幅图像邻域的8个像素,它所在的向量尺度空间上下2幅图对应位置邻域各9个点,总共26个点进行像素值比较,如果该点是最大或者最小点,则改点就暂时列为特征点。

  其邻图如下:


3、精确定位极值点

子像素级极值点:

由于上面找到的近似极值点落在像素点的位置上,实际上我们在像素点附近如果用空间曲面去拟合的话,很多情况下极值点都不是恰好在像素点上,而是在附近。所以sift算法提出的作者用泰勒展开找到了亚像素级的特征点。这种点更稳定,更具有代表性。

消除对比度低的特征点:

对求出亮度比较低的那些点直接过滤点,程序中的阈值为0.03.

消除边界上的点:

处理方法类似harrs角点,把平坦区域和直线边界上的点去掉,即对于是边界上的点但又不是直角上的点,sift算法是不把这些点作为特征点的。


4、选取特征点主方向

在特征点附近选取一个区域,该区域大小与图图像的尺度有关,尺度越大,区域越大。并对该区域统计36个bin的方向直方图,将直方图中最大bin的那个方向作为该点的主方向,另外大于最大bin80%的方向也可以同时作为主方向。这样的话,由于1个特征点有可能有多个主方向,所以一个特征点有可能有多个128维的描述子。 如下图所示:



5、 构造特征点描述算子。

以特征点为中心,取领域内16*16大小的区域,并把这个区域分成4*4个大小为4*4的小区域,每个小区域内计算加权梯度直方图,该权值分为2部分,其一是该点的梯度大小,其二是该点离特征点的距离(二维高斯的关系),每个小区域直方图分为8个bin,所以一个特征点的维数=4*4*8=128维。示意图如下(该图取的领域为8*8个点,因此描述子向量的维数为32维):



二、Sift特征点匹配过程

 

  由步骤一我们已经获得了图片的特征点向量集合。现在来看看特征点匹配,特征点匹配的一个应用就是物体的识别,比如说我有2张图片A和B,图片的内容相同,只是图片的大小尺寸不同。假设A图片尺寸比较大,且我们已经采用sift算法对图片A和B都进行了检测,获得了它们的特征点集合,现在我们的问题是需要把A和B中相应的特征点给对应连线起来。

  既然是匹配,当然每个特征点向量要相似才能匹配到一起,这里采用的是欧式距离来衡量其相似度。

  对B中的特征点x,去寻找A中最相似的点y,最简单的方法就是拿x与A中所有点进行相似度比较,距离最小的那个为匹配点。但是如果图片中特征点数目很多的话,这样效率会很低。所以我们需要把A中特征点向量集合用一种数据结构来描述,这种描述要有利于x在A中的搜索,即减少时间复杂度。在sift匹配中,这种数据结构采用的是kd-tree。(K-D tree在本BLOG中有详细描述)


----------------------------------SURF-------------------------------------------------

上面简单地介绍了经典的SIFT算法,sift算法比较稳定,检测到的特征点也比较多,其最大的确定是计算复杂度较高。后面有不少学者对其进行了改进,其中比较出名的就是本文要介绍的surf算法,surf的中文意思为快速鲁棒特征。

.

网上有些文章对surf做了介绍,比如:

http://wuzizhang.blog.163.com/blog/static/78001208201138102648854/

surf算法原理,有一些简单介绍.

http://blog.csdn.net/andkobe/article/details/5778739

对surf的某些细节做了通俗易懂的解释.

http://www.owlei.com/DancingWind/


 一、Surf描述子形成步骤

1. 构造高斯金字塔尺度空间

其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度。Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像。首先来看看图像中某个像素点的Hessian矩阵,如下:


即每一个像素点都可以求出一个Hessian矩阵。但是由于我们的特征点需要具备尺度无关性,所以在进行Hessian矩阵构造前,需要对其进行高斯滤波。这样,经过滤波后在进行Hessian的计算,其公式如下:


最终我们要的是原图像的一个变换图像,因为我们要在这个变换图像上寻找特征点,然后将其位置反映射到原图中,例如在sift中,我们是在原图的HOG图上寻找特征点的。那么在surf中,这个变换图是什么呢?从surf的众多资料来看,就是原图每个像素的Hessian矩阵行列式的近似值构成的。其行列式近似公式如下:


其中0.9是作者给出的一个经验值,其实它是有一套理论计算的,具体去看surf的英文论文。

由于求Hessian时要先高斯平滑,然后求二阶导数,这在离散的像素点是用模板卷积形成的,这2中操作合在一起用一个模板代替就可以了,比如说y方向上的模板如下:


该图的左边即用高斯平滑然后在y方向上求二阶导数的模板,为了加快运算用了近似处理,其处理结果如右图所示,这样就简化了很多。并且右图可以采用积分图来运算,大大的加快了速度,关于积分图的介绍,可以去查阅相关的资料。

同理,x和y方向的二阶混合偏导模板如下所示:


上面讲的这么多只是得到了一张近似hessian行列式图,这例比sift中的DOG图,但是在金字塔图像中分为很多层,每一层叫做一个octave,每一个octave中又有几张尺度不同的图片。在sift算法中,同一个octave层中的图片尺寸(即大小)相同,但是尺度(即模糊程度)不同,而不同的octave层中的图片尺寸大小也不相同,因为它是由上一层图片降采样得到的。在进行高斯模糊时,sift的高斯模板大小是始终不变的,只是在不同的octave之间改变图片的大小。而在surf中,图片的大小是一直不变的,不同的octave层得到的待检测图片是改变高斯模糊尺寸大小得到的,当然了,同一个octave中个的图片用到的高斯模板尺度也不同。Surf采用这种方法节省了降采样过程,其处理速度自然也就提上去了。其金字塔图像如下所示:


2. 利用非极大值抑制初步确定特征点

  此步骤和sift类似,将经过hessian矩阵处理过的每个像素点与其3维领域的26个点进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步的特征点。

3. 精确定位极值点

  这里也和sift算法中的类似,采用3维线性插值法得到亚像素级的特征点,同时也去掉那些值小于一定阈值的点。

4. 选取特征点的主方向。

  这一步与sift也大有不同。Sift选取特征点主方向是采用在特征点领域内统计其梯度直方图,取直方图bin值最大的以及超过最大bin值80%的那些方向做为特征点的主方向。而在surf中,不统计其梯度直方图,而是统计特征点领域内的harr小波特征。即在特征点的领域(比如说,半径为6s的圆内,s为该点所在的尺度)内,统计60度扇形内所有点的水平haar小波特征和垂直haar小波特征总和,haar小波的尺寸变长为4s,这样一个扇形得到了一个值。然后60度扇形以一定间隔进行旋转,最后将最大值那个扇形的方向作为该特征点的主方向。该过程的示意图如下:


5. 构造surf特征点描述算子

在sift中,是在特征点周围取16*16的邻域,并把该领域化为4*4个的小区域,每个小区域统计8个方向梯度,最后得到4*4*8=128维的向量,该向量作为该点的sift描述子。

在surf中,也是在特征点周围取一个正方形框,框的边长为20s(s是所检测到该特征点所在的尺度)。该框带方向,方向当然就是第4步检测出来的主方向了。然后把该框分为16个子区域,每个子区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向都是相对主方向而言的。该haar小波特征为水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。该过程的示意图如下所示:


这样每个小区域就有4个值,所以每个特征点就是16*4=64维的向量,相比sift而言,少了一半,这在特征匹配过程中会大大加快匹配速度。

总结:

Surf在速度上比sift要快许多,这主要得益于它的积分图技术,已经Hessian矩阵的利用减少了降采样过程,另外它得到的特征向量维数也比较少,有利于更快的进行特征点匹配。





http://www.niftyadmin.cn/n/1244873.html

相关文章

视频稳像 video stabilization

当今社会,视频文件随处可见,随处可拍。但是,由于摄像机太轻,操作者抖动,风吹等原因,使得摄像机会产生一定的随机抖动。这样一来,就会造成拍摄得到的视频画面发生抖动。而对于智能视频分析算法来…

在matlab和VS2010中配置vlfeat

(refering to steps ste up by Eric and Iamlegend ) vlfeat图像库包含SIFT,MSER,KDtree,快速shift,K-means等各种图像处理中常用的算法。提供matlab,c api接口,方便大家在图像处理中各种调用。 由于是C语言编写&#…

图像融合(后续更新)

后续更新 

image retargeting (图像缩略图、图像重定向)

image retargeting技术在不引入大的畸变的情况下,通过改变照片的大小和比例信息,来适应各种尺寸屏幕。 【缩略图像要求】: The important content of I should be preserved in I.The important structur of I shoul…

探索真实事物的虚拟再现——微软亚洲研究院SIGGRAPH Asia 2014精彩入选论文赏析

SIGGRAPH Asia今年首次来到内地,于12月3日在深圳国际会议中心开幕。 Dynamic Hair Campture using Spacetime Optimization 动作大片中常常会出现这样一个场景,长发飘飘的女神从高楼或飞机上坠落,这时候超级英雄就会突然出现在半空中英雄救美…

如何撰写一篇优秀的论文

(节选自Steve Lin:如何撰写一篇优秀的SIGGRAPH论文) 一篇优秀的论文应该是这样的 广大的研究同仁介绍了这篇论文所包含的重要想法和所获得的结果 在论文中描述清楚你的想法和所获得的结果 基于你所做的东西,提供一些具有洞察性的见解 为什么…

VS2010下Bundler的使用以及cygwin的配置

描述的是通过分析物体的运动得到三维结构信息的过程。 人类通过移动获得很多环境的三维结构信息。当观察者自己或者其周围的物体运动的时候,可以从获得的图象中获取信息。运动恢复结构需要解决立体图像恢复结构类似的问题:找到三维物体图像的对应点。为了…

cygwin $'\r': command not found问题

cygwin运行sh脚本出现如上错误,原因是脚本文件里使用的是\r\n,就是是windows下的回车换行,而不是linux系统里的换行。 解决方法就是使用dos2unix命令。本机安装的msysgit里有这个可执行文件,因此直接使用 在cygwin中先cd到“.sh”…