SIFT算法学习总结

这儿仅作为我个人学习SIFT算法的总结!

算法存在的意义

SIFT(Scale-Invariant feature transform)算法是一种局部特征检测的算法,该算法通过寻找图像中的特征点(interest points ,or corner points)来进行特征点匹配。它在尺度空间寻找极值点,并精确计算出其位置信息,结合尺度,方向信息进行特征描述,该算法具有尺度,旋转不变性,对图像的亮度或者拍摄角也具有一定的不变性。

SIFT算法在物体识别,机器人地图感知与导航,图像拼接,匹配,图像追踪等方面有广泛应用。

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

算法核心步骤

  1. 在尺度空间中寻找极值点
  2. 关键点的定为与过滤(过滤掉第对比度和边缘响应的点)
  3. 方向赋值(达到旋转和尺度的不变性)
  4. 特征描述(使用方向直方图)

算法实现原理

构建尺度空间

当用一个机器视觉系统分析未知场景时,计算机没有办法预先知识图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。

同一物体在不同观测精度下呈现出不同的表象就构成了一组尺度空间。尺度空间中个尺度图像的模糊程度逐渐变大,能够模拟人由近及远的观察目标,尺度越大,图像越模糊。

人的视觉系统具有尺度不变性,不管离观察目标有多远多近,我们都能准确的识别出看到的物体,这表明我们能够从不同尺度的图像中找寻到相同的特征点。SIFT算法就在于寻找到了尺度不变性的方法。

所以在很多时候,我们会在将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征。比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸。
构造尺度空间是通过高斯模糊算子实现的
这里写图片描述
σ 称为尺度空间因子,它是高斯正太分布的方差,其值越大表明图像被平滑程度越大,尺度越大,反之亦然。

构造高斯金字塔

这里写图片描述
高斯金字塔分为不同的组合不同的层,每一组我们称之为一个八度(octave),每一组的分辨率大小不同,一般上一组是下一组倒数第三层图像个点采样得到的。每一组中有多层图像,同一组中图像分辨率大小相同,但是采用的尺度因子不同,也就是被平滑的程度不同,通过高斯金字塔的构建也就够SIFT算法尺度空间的表示。

使用DOG近似LOG寻找极值点(关键点)

对图像作LOG,即可得到图像的边缘信息。LOG是一种边缘检测算子。在此,LOG空间中的极值点被初步筛选特征点,由于LOG计算比较耗时,故采用DOG计算(DOG是LOG计算的近似)。那么是如何计算出图像的DOG表示呢?我们发现,高斯金字塔中,不同层之间图像平滑算子不同,可以将高斯金字塔的下层减去上层图像得到DOG图像。
这里写图片描述
这里写图片描述
这里写图片描述
得到图像的DOG空间表示,在DOG空间中寻找极值点。通过比较当前点周围8个点的大小与上层9个和下层9个点大小确定当前点是否是极值点,是极值点,就认定该点为初步筛选出的特征点。
这里写图片描述

去除低对比度和边缘响应的点

到现在,我们已经得到部分关键点。但是现在存在几个问题:
1、关键点的位置信息不精确
2、关键点中存在不好的点(特征点不具备很强的独特性,使得识别鲁棒性降低)

这一步的本质是移除DOG局部曲率不对称的像素点。

关键点的精确定位
这里写图片描述

问题是我们找到的极值点并不一定是最低点。

通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力,在这里使用近似Harris Corner检测器。
这里写图片描述
通过将尺度空间函数泰勒展开,如上图 D(x) ,对上式求导,令导数为0,得到精关键点确位置信息这里写图片描述

接下来去除低对比度的点。将这里写图片描述代入 D(X) 即DOG空间中计算 D(x) 处的取值。若这里写图片描述小于0.03,那么该点的对比度低,应该剔除。

接下来要做的是剔除边缘响应的点
我们知道,沿着边缘方向,高斯差分算子得到较小的主曲率,垂直于边缘方向,得到的主曲率较大(如果该点不是边缘,而是角点,那么两边得到的曲率应该差不多)。主曲率可由Hessian矩阵求得。
这里写图片描述
D(X)的主曲率和H的特征值成正比,令 α 为较大特征值, β 为较小特征值,令α=γβ,则D(X)的主曲率和γ成正比。
这里写图片描述
这里写图片描述
这里写图片描述
在罗伊(SIFT创始人)论文中,设置γ=10,我们将主曲率大于一定阈值的点去除得到最终的特征点。
这里写图片描述

计算关键点方向(方向赋值)

现在我们得到了一系列不错的关键点了,现在需要去除尺度和旋转的不变性。
1、首先通过关键点所在的尺度选定其所在的高斯金字塔中的图像。
2、图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:这里写图片描述
L为关键点所在的尺度空间值

完成计算后通过统计梯度和方向直方图得到关键点的主方向。
这里写图片描述

方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值。

特征描述子生成

至此,我们已经得到一个关键点的位置,尺度,方向信息,我们需要一个描述特征的方法。
这里写图片描述

SIFT描述子是关键点邻域高斯图像梯度统计结果的一种表示。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。
Lowe建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征。表示步骤如下:
1、确定计算描述子所需的图像区域
特征描述子与特征点所在的尺度有关,因此,对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近的邻域划分为d*d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。

2、 将坐标轴旋转为关键点的方向,以确保旋转不变性,如6.2所示。
这里写图片描述

3、 将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。

4、插值计算每个种子点八个方向的梯度。

5、统计的4*4*8=128个梯度信息即为该关键点的特征向量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。

6、 描述子向量门限。非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值。然后,再进行一次归一化处理,提高特征的鉴别性。

7、 按特征点的尺度对特征描述向量进行排序。

算法使用

在opencv3中,SIFT不在直接可用,需要手动编译,然后使用

参考资料:

http://blog.csdn.net/abcjennifer/article/details/7639681
http://blog.csdn.net/zddblog/article/details/7521424
http://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/
http://blog.csdn.net/dcrmg/article/details/52561656
http://blog.csdn.net/dcrmg/article/details/52577555

猜你喜欢

转载自blog.csdn.net/silence2015/article/details/77101295