博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SIFT 尺度不变特征变换算法
阅读量:5108 次
发布时间:2019-06-13

本文共 3304 字,大约阅读时间需要 11 分钟。

看了一周的SIFT,感觉到了该算法的强大,下面就将介绍下该算法的实现过程(主要参考lowe的论文)

SIFTScale-invariant feature transform)是一种检测局部特征的算法,该算法通过求得一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,首先由lowe于99年提出,于04年对其进行了完善。

主要应用物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

SIFT算法的特点有

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

算法建立主要有四个步骤

1. 尺度空间极值检测(Scale-space extrema detection):搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2. 关键点定位(Keypoint localization):在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3. 方向确定(Orientation assignment):基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4. 关键点描述(Keypoint descriptor):在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

1、尺度空间极值检测(Scale-space extrema detection

  关键词:尺度空间,高斯差分尺度空间,高斯金子塔,高斯差分金字塔(DOG)

尺度空间:由一原始图像经过不同尺度的高斯模糊所得的一组图像空间

   定义:

   其中 G(x,y,σ) 是尺度可变高斯函数,I(x,y)是原始图像,σ大小决定图像的平滑程度,大尺度对应图像的概貌特征,小尺度对应图像的细节特征。大的σ值对应粗糙尺度(低分辨率),反之,对应精细尺度(高分辨率)。

    

高斯差分尺度空间:极值点由高斯差分尺度空间确定。

选择高斯差分尺度空间计算极值点的原因有两点:

      1、容易计算,不同尺度空间相减即可

      2、也是最根本的一点:差分尺度空间和高斯拉普拉斯函数近似相等

           推导如下:

                                                                                                                        (1)

                                                                                   (2)

               (1)和(2)可得

                

             高斯金字塔及高斯差分金字塔:建立如下图

            

     

      

        左边是高斯金字塔,右边是高斯金字塔每组的相邻两层相减所得的高斯差分金字塔;

极值点的检测:

       在高斯差分金字塔中,每个像素与本层的相邻的8个及上下两层相邻的9个像素一共26个像素对比,如果是最小或最大则为极值点,见下图:

      

        

 高斯金字塔的塔数及每组包含的层数确定:

        高斯金字塔的塔数可以由公式确定:

        (M,N 为原始图像的长和宽,t为金字塔顶层图像的小的维数的对数值)

       层数的确定: 假设最终所检测极值点的层数intvls 为s ,由于极值点是在三层中所检测的,那么GOD中的层数应该为s+2,又由于GOD是由高斯金字塔上下两层相减所得,所以高斯金字塔中的层数应该为s+3

2. 关键点定位(Keypoint localization)

  由于我们实在离散空间中进行的关键点定位,所以关键点的位置很有可能不精确,如下图:

  

   我们对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开式(拟合函数)Harris Corner检测器

                                                   (3)

   其中,。求导并让方程等于零,可以得到极值点的偏移量为:

                                                                   (4)

   带入方程得:

                                                               (5)

     其中,代表相对插值中心的偏移量,当它在任一维度上的偏移量大于0.5时(即xy),意味着插值中心已经偏移到它的邻近点上,所以必须改变当前关键点的位置。同时在新的位置上反复插值直到收敛;也有可能超出所设定的迭代次数或者超出图像边界的范围,此时这样的点应该删除,在Lowe中进行了5次迭代。另外,过小的点易受噪声的干扰而变得不稳定,所以将小于某个经验值(Lowe论文中使用0.03Rob Hess等人实现时使用0.04/S)的极值点删除。同时,在此过程中获取特征点的精确位置(原位置加上拟合的偏移量)以及尺度()。 

去除对比度小的关键点及边缘点

  对比度小的点:通过DOG所得的极值点中存在对比度小的点,若   ,该特征点就保留下来,否则丢弃。

   边缘点:由于DoG算子会产生较强的边缘响应,所以极值点中存在边缘点:因为一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。我们可以通过hessian矩阵解决这个问题;

   

其中Dxx、Dxy等可以通过得到

D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,我们不直接求特征值,求Tr 和 行列式Det则

令α=γβ,则

 (r + 1)2/r的值在两个特征值相等的时候最小,随着r的增大而增大,因此,为了检测主曲率是否在某域值r下,只需检测

当比值为负值时直接丢弃,当 (α+β)/ αβ> (r+1)2/r, throw it out.   在Lowe的文章中,取r=10。

3. 方向确定(Orientation assignment)

   关键点的位置确定了,接下来我们确定关键点的尺度和方向,算出每个关键点的幅度和方向

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

  

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

   

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

关键点描述子生成步骤

    1、确定计算描述子所需的图像区域,图像区域的半径通过下式计算:

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

    

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

  

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

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

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

  6、根据特征点的尺度对特征描述向量进行排序,SIFT特征向量生成

特征向量形成后,我们可以利用特征向量进行各种应用了!

实验结果

1、特征点的提取:

2、特征点匹配

3、利用ransac算法后的图像匹配

RR   Refrence:

1  j 1、lowe文章David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.

        2、David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999

        3、

        4、

     5、

            

            附录:上传一份rob hess 的源码,rob hess主页源码已经修改,这份是适用于win的,但是有部分地方需要修改

             

          

1

      

转载于:https://www.cnblogs.com/Black-Small/p/3258468.html

你可能感兴趣的文章
【转】 FPGA设计的四种常用思想与技巧
查看>>
C++:同名隐藏和赋值兼容规则
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
【转】Java反射 之 反射基础
查看>>
mysql数据库备份和还原的常用命令
查看>>
s3c2440实验---定时器
查看>>
HBase配置性能调优(转)
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>