SIFT算法简介

来源:互联网 发布:保定seo公司 编辑:程序博客网 时间:2024/06/11 21:09

 SIFT算法简介

  SIFT算子是一种图像的局部描述子,具有尺度、旋转、平移的不变性,而且对光照变化、仿射变换和3维投影变换具有一定的鲁棒性。在Mikolajczyk(在参考文献中有个下载链接,包括了这些论文,0积分)对包括SIFT算子在内的十种局部描述子所做的不变性对比实验中,SIFT及其扩展算法已被证实在同类描述子中具有最强的健壮性。 

   SIFT算法的主要思想是在尺度空间寻找极值点,然后对极值点进行过滤,找出稳定的特征点。最后在每个稳定的特征点周围提取图像的局部特性,形成局部描述子并将其用在以后的匹配中。SIFT算法是基于Lindeberg的理论解决了尺度不变性的问题,本文会对尺度空间理论做一些介绍。 

   SIFT 特征除具有前面所述的优点外,还具有很好的独特性,适于在海量特征数据库中进行快速、准确的匹配;另外,算法产生的特征点在图像中的密度很大,速度可以达到实时要求;由于SIFT 特征描述子是向量的形式,它可以与其他形式的特征向量进行联合。SIFT  的应用十分广泛,包括目标识别、机器人视觉、图像检索、图像拼接、3D 建模、手势识别、视频跟踪和运动匹配等。 


 SIFT方法介绍  

    SIFT 特征的优点在前面已经做了说明,  下面将对SIFT 方法做详细的介绍。SIFT 算法有以 下几个步骤:  

     1.  检测尺度空间的极值点。  


    2.   抽取稳定的关键点。  


    3.   为每个关键点指定一个或者多个方向。  


    4.   生成特征点描述子。  


我想分别在这四个步骤简单的说下。

     1.首先什么是尺度空间,所谓尺度空间就相当于对一幅图片做一次高斯滤波,生成的图片就是一个尺度空间下的,再对这幅滤波后的图片循环往复的滤波,就会让图片变得越来越模糊,这样就形成了不同的“尺度。就是由清楚到模糊的一系列图片就是一系列的尺度,这些尺度放在一起就形成了一个尺度空间。

      提取尺度不变的特征点,其主要思想是提取的特征点出现在任何一个尺度上。这样不论图 像的尺度如何变化,总能够提取出这种特征点。检测尺度无关的特征点可以通过搜索所有可能 的尺度,这可以基于尺度空间理论来解决。 一般都是在 高斯差分函数与图像卷积得到的空间中寻找极值点。每一幅高斯差分图像中的一个像素点,要和它所在图像的八邻域像素比较,而且要和它所在图像的上一层和下一层的各九个邻近的像素点比较。这样才能找出真正的极值点。

      2.抽取稳定的关键点,那么哪些是稳定的?哪些又是不稳定的?论文中说低对比度和边缘上的点都是不稳定的,我们只要把这些不稳定的点排除,那么剩下的点就是稳定的。对于低对比度的点,参考文献1中给出了一个公式来进行判断。对于边缘上的点,我们采取法曲率这个东西,如果极值点分布在边缘上,该点的法曲率最大值和最小值之比 (即两个主曲率之比),一般情况下要比非边缘点的比值大。根据这种思想,我们可以设一个比值的阈值,当比值大于这个阈值就认为极值点在边缘上。  

    3.以关键点为中心,划定一个邻域,利用所有在此区域内的点的梯度形成一个方向直方图。从直方图中选出纵坐标值最大的一项的方向作为该关键点的主方向。如果存在其他方向,纵坐标的大小大于主方向纵坐标大小的80%,也将其作为该关键点的方向。特征点有多个方向的情况下,实际上是在此位置上有多个关键点,他们的方向不同。直方图的横坐标是梯度方向,共36 项,每项代表了 10 度的范围;纵坐标是梯度大小,对于归到横坐标上任一项内所有的点,将其梯度大小相加,其和作为纵坐标。

                                       

   4.生成局部描述子:在关键点周围取一个邻域,并对其中点的梯度做高斯加权。这个邻域分为四个子区域,每个子区域取八个方向。假如采用8x8 的像素矩阵,以及圆形的邻域,邻域被划分为2x2 个子区域,那么描述子的维数就是2x2x8=32维,如果采用16x16的像素矩阵,那么很明显就是128维了。为了对光线变化更具鲁棒性,描述子都被归一化到单位长度。如果图像的对比度发生变化,每个像素值都会乘上一个数值,归一化后,对比度的影响被消除了。对于图像亮度的变化,每 个像素值都会加上一个数值,然而这对计算的梯度是没有影响的。因此,该描述子对亮度的仿 射变换是鲁棒的。对于非线性的光线变化,梯度大小会受影响,但是梯度的方向不会有大的变化,我们可以根据前面描述的生物学原理解决此问题。


SIFT算法的GPU加速实现

由于sift算法适合于GPU加速并行,所以国外的牛人给出了一个SIFT的GPU加速实现,其中主要使用了GLSL加速和cuda加速,代码中可以自动选择加速的方式。其中的官网为参考文献2中的链接。这份代码展示了GLSL在工程中的使用,是作为GLSL的工程实现的参考。代码中使用了错综复杂的类,而且GLSL也被封装起来,虽然是一份不错的代码,但是看起来很费劲。我用vs自动生成一个类图,并且就GLSL加速部分加了注释,详见下图,该图片很大,需要保存到本地上才能放大看清楚。



参考文献:

1.http://download.csdn.net/detail/gningh/6012907

2.http://www.cs.unc.edu/~ccwu/siftgpu/

3.http://www.cnblogs.com/v-July-v/archive/2011/03/13/1983663.html

4.http://blog.csdn.net/v_JULY_v/article/details/6186942

5.http://www.robots.ox.ac.uk/~vedaldi/code/siftpp.html

关于SIFT相关论文的打包下载:0积分

http://download.csdn.net/detail/gningh/6012941