SIFT算法总结

SIFT算法由D.G.Lowe 1999年提出,2004年完善总结,论文发表在2004年的IJCV上,主要用于提取具有图像旋转不变性和伸缩不变性的特征点。这项技术可以推广到图像识别、图像拼接以及图像恢复等。

论文详细地址:lowe sift算法

算法主要分为4个步骤:

 

  • scale-space extrema detection--尺度空间上的极值检测
  • keypoint localization--关键点的定位
  • orientation assignment --为关键点标定方向
  • keypoint descriptor--提取特征点描述符

$1.  尺度空间上的极值检测

      在介绍这一部分的时候,先引入几个概念:

 

  • 降采样:对于一幅图像而言的降采样就是每隔几行、几列得到取一点,组成一个新的图像。以比例因子为2的降采样来说:就是対一幅图像每隔一行一列取一点。
  • 升采样:其实一种插值,就是在一幅图像里利用相关的插值运算得到一幅大的图像!比如比例因子为2的升采样就是每个相邻像素点种插值出一个像素(这里包括XY两个方向),最常用的插值方法有线性插值等。
  • 图像金字塔:由一个原始图像经过降采样得到一幅图像,再对新的图像做降采样,重复多次构成的一组集合。以采样因子2为例说明,如果形象的把这些图像摞起来就想一个金字塔,每次之间长和宽大小恰好为2倍关系,故此得名。
  • 高斯卷积:就是权函数为高斯函数的模板进行卷积运算。通常做高斯卷积后的图像会比原图像平滑但也会模糊,所以又称高斯模糊!
  • 高斯金字塔:高斯金字塔里有两个概念:组(Octave)和层(LevelInterval),每组里有若干层!高斯金字塔的构造是这样的,第一组的第一层为原图像,然后将图像做一次高斯平滑(高斯卷积、高斯模糊)高斯平滑里有一个参数δ,SIFT里作者取1.6 。然后将δ乘一个比例系数k作为新的平滑因子来平滑第一组第二层得到第三层,重复若干次,得到L层(L一般取5)他们分别对应的平滑参数为:0,δ,kδ,k2δ,k3δ。然后将最后一幅图像做比例因子为2的降采样得到第二组的第一层,然后对第二组的第一层做参数是δ的高斯平滑,对第二层做kδ的平滑得到第三层.....这里一定注意:每组对应的平滑因子δ是一样的,而不是像有的资料上说的持续递增。这样反复形成了OL层的高斯金字塔。一般模糊的高斯模板长宽都约为6δ(这里δ为当次的平滑因子,就是可能是kδ,k2δ..
  • DoGDifference of Gaussian)金字塔:是由高斯金字塔构造出来的,他的第一组第一层是由高斯金字塔的第一组第二层减第一组第一层,他的第一组第二层是由高斯金字塔的第一组第三层减第一组第二层得到。每组都这样就生成了一个DoG金字塔。顺便说一下,DoG金字塔每组图像几乎都是一片黑,但仔细看你能看出轮廓的。
最后关于金字塔具体处理的说明:

1)在SIFT里高斯金字塔的第一组第一层通常是由一个源图像长宽扩大一倍开始的,这样做是为了得到更多的特征点;

2)大家可以发现如果用每组5层的高斯金字塔构造一个DOG金子塔的话,DOG金字塔每组的层数是4;

3)对于DOG金字塔,特征点的搜索从每组的第二层到倒数第二层,所以如果DOG金字塔的有效层数目为n都话,那么DOG金字塔应该有n+2层,那么对应的高斯金字塔应该有n+3层;

4)高斯金字塔从第二组开始的每组第一层是由上一组的倒数第二层采样得到的

讲了这么多概念,现在正式开始讲解如何在尺度空间里寻找特征点。

由于图像进行伸缩等变换后尺度空间发生变化,所以为了方便找出匹配点,需要图像在不同的空间里进行平滑,并相减得到更多的边缘等高频信息,高斯平滑并计算DOG金字塔利用下面的3个计算公式:

至于为什么用DOG算子来提取特征点,而不是Hessian或者其他角点方法比如Harris,是因为Mikolajczyk发现通过DOG算子计算出来的局部区域极大值和极小值与上述几种角点相比能产生更加稳定的特征点。

但是上面的公式和DOG又有什么关系呢,两者只差了(k-1)a^2倍而已,不影响特征点的寻找。

有一点需要说明的是,这里不同的a就是代表不同的尺度,a的值越大,意味着尺度空间越大,具体怎么样理解尺度这个概念呢,就是需要描述的像素灰度分布越广,尺度越广,也就是说越模糊的图像尺度也越大,举个例子,有两个灰度值分别为0和1,模糊后变为0.4和0.6,要表示这两个灰度值需要更多的参数,尺度变大,更简单的说,尺度就是频率,高斯模糊越明显,尺度越大,因为这时图像是低频的。

剩下的只需要在DOG金字塔里寻找3*3*3邻域的极值即为我们所要寻找的feature point,如图所示

$2. 关键点的精确定位

通过拟合三维二次函数以精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性,提高抗噪声能力。

1)空间尺度函数泰勒展开式如(4)所示

2)在已经检测到的特征点中,要去掉低对比度的特征点和不稳定的边缘响应点,去除低对比度的点:把公式(5)带入公式(4),可得(6),若(6)的值大于0.03,该特征点就保留下来,否则舍弃。

3)边缘响应的去除

一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率,主曲率通过一个2*2的Hessian矩阵H求出:

导数由采样点相邻差估计得到,D的主曲率和H的特征值成正比,令b为最大特征值,c为最小特征值,则

$3. 关键点方向分配

利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备旋转不变性。

梯度大小和方向计算公式如下:

orientation histogram的生成,将0~360度分到36个区间中,每个区间的高度计算如下,其中a为当前的尺度,(x0,y0)为当前特征点的坐标而g(x0,y0,1.5a)则是高斯滤波系数。

主方向定义为拥有最高峰hm的那个区间,而其他的区间高度为0.8*hm之上的区间方向,可以认为是该特征点的辅方向,这样就增强了匹配的鲁棒性。

这样,每个关键点key points就有三个信息:位置、所处尺度a、方向。

若表示出来,效果如下:

$4. 提取特征描述子

 

  • 首先将坐标轴旋转为关键点的方向,以确保旋转不变性
  • 为了方便起见,在$3部分利用公式7计算梯度时,应该计算全体现像素点的梯度方向和大小;
  • lowe建议选取16*16邻域,然后将这个大区域分为16个4*4区域,再分别对每个区域16个像素点的梯度大小乘上高斯模版系数
  • 将16个单位方向向量按照常规的8方向分布,并乘上上一步计算的幅值叠加起来,得到类似图2右边的效果。
最后,一共有4*4*8=128维向量来表征这个特征点。

此时,SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SIFT(尺度不变特征变换)算法是一种用于图像特征提取和匹配的经典算法。VS(Visual Studio)是一种常用的集成开发环境。 要在VS中实现SIFT算法,我们需要按照以下步骤进行: 1. 创建一个新的项目:在VS中新建一个项目,选择合适的项目类型和模板。 2. 导入图像处理库:SIFT算法需要进行图像处理和特征提取,因此需要导入相关的图像处理库,如OpenCV。 3. 加载图像:使用图像处理库中的函数加载待处理的图像。 4. 运行SIFT算法:调用图像处理库中的SIFT函数,对加载的图像进行特征提取。 5. 提取特征点:从SIFT算法的输出中提取关键点和特征描述。这些特征点具有尺度不变性和旋转不变性。 6. 可视化特征点:使用图像处理库的绘图函数将提取的特征点可视化在原始图像上。 7. 匹配特征点:使用特征匹配算法,如最近邻算法,对不同图像中的特征点进行匹配。 8. 输出匹配结果:通过图像处理库的绘图函数将匹配的特征点可视化在两张图像上,以显示匹配的结果。 9. 运行和调试:运行程序并检查结果,如果需要,进行调试和优化。 10. 导出结果:将匹配结果导出为文件或在界面上展示。 总结而言,通过在VS中创建项目、导入图像处理库、加载图像、运行SIFT算法、提取特征点、可视化、匹配、输出结果以及运行和调试等步骤,我们可以在VS中实现SIFT算法,并获得图像的特征点和匹配结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值