sift算法

SIFT算法的实现

学习过程:一幅图像SIFT特征向量的生成算法总共包括4步:

1、检测尺度空间极值点,初步确定关键点位置和所在尺度。

2、抽取稳定的关键点,精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

3、为每个关键点指定方向参数,使算子具备旋转不变性。

4、关键点描述子的生成,即生成SIFT特征向量。

匹配过程:当一幅图像的特征向量库生成后,即已经学习好之后,使用特征点匹配算法进行图像的匹配。

 

学习过程

基本思想:找到不同尺寸上的特征点,并为它分配一个方向,则特征点坐标、尺度大小和方向三个参数构成一个特征区域,然后根据这个特征区域求得一个特征向量,这样一幅图像就可以用若干特征向量来表示。

1、检测尺度空间极值点,初步确定关键点位置和所在尺度。

1.1、尺度空间的生成

尺度空间的详细描述见上一篇博客

提取尺度不变的特征点,其主要思想是提取的特征点出现在任何一个尺度上。这样不论图像的尺度如何变化,总能够提取出这种特征点。检测尺度无关的特征点可以通过搜索所有可能的尺度,这可以基于尺度空间理论来解决。前面已经提到,在一些合理的假设之下,高斯函数是得到图像尺度空间唯一可用的核函数。将图像 I ( x, y ) 的尺度定义为一个函数 L ( x, y , σ ) ,它由高斯函数 G ( x, y , σ )和图像 I ( x, y )卷积

得到:L ( x, y , σ ) =G ( x, y , σ ) * I ( x, y )

为了在尺度空间中高效的检测稳定关键点的位置,提出了在高斯差分函数与图像卷积得到的空间 D ( x, y , σ )中寻找极值点(其中,相邻两个尺度由一个常数 k分开)

D ( x , y , σ ) = ( G ( x , y , kσ ) - G ( x , y , σ ) ) * I ( x , y )= L ( x , y , kσ ) - L ( x , y , σ )

其中:

 

 

高斯拉普拉斯LoG金字塔

该金字塔式普通金字塔和尺度空间的组合。即普通金字塔的每一层是一组图像组成的,称为Octave,每一组是是高斯平滑形成的多尺度的图像,即多空间与多分辨率的组合。

高斯拉普拉斯LoG金字塔自下而上分为多层,在第一层中,对原始图像不断用高斯函数卷积,得到一系列逐渐平滑图像。在这一层中,相邻的高斯图像差分得到高斯差分图像。这一组进行完毕后,从中抽取一幅图像 A 进行降采样,得到图像 B的面积变为 A 1/4,并将 B作为下一层的初始图像,重复第一层的过程。选取 A的原则是,得到 A所用的尺度空间参数 σ为本层尺度空间参数的 2倍。如图 5所示:

 


1.2、计算极值点


如图7,每个点最多需要和26个点进行比较。有一个问题是到底要在多少个尺度中寻找极值点,即如何确定 s 值。实验表明,s 3是较好的选择。如果 s = 3,则需要 5幅高斯差分图像才可以。这里的计算是高效的,因为大多数情况下,只需要几步比较,就可以排除一个像素点,认为它不是极值。

 

2、抽取稳定的关键点,精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

     具体见sift中文.pdf中描述。

 

3、为每个关键点指定方向参数,使算子具备旋转不变性。

      具体见sift中文.pdf中描述。

 

4、关键点描述子的生成,即生成SIFT特征向量。

      前面已经为关键点赋予了图像位置、尺度以及方向,这三个参数称为一个特征区域,这一步将根据关键点周围的局部特性计算一个特征描述子,即一个特征向量。这个描述子还需要对仿射变换、光照变换等具有一定的鲁棒性。

     首先将坐标轴旋转为特征点的方向,以保证旋转不变性;接下来以特征点为中心取8x8的窗口(特征点所在的行和列不取)。在图9左边所示中,中央黑点为当前特征点的位置,每一个小格代表特征点所在尺度空间的一个像素,箭头方向代表该像素的梯度方向,肩头长度代表梯度模值,图中圈内代表高斯加权的范围(越靠近特征点的像素,梯度方向的信息贡献越大)。然后在4x4的图像小块上计算8个方向的梯度值直方图,绘制每个方向的累加值,形成一个种子点,如图9右侧所示。此图中一个特征点由4个种子点组成,每个种子点有8个方向向量信息,共生成32个数据,所以形成32维的SIFT特征向量即特征描述符。这种领域方向性信息联合的思想增强了算法抗噪声的能力,同时对于含有定位误差的特征匹配也提供了较好的容错性。

 sift算法_第1张图片

实际计算过程中,为了增强匹配的稳健性,Lowe建议对每个特征点使用4x416个种子点来描述,每个种子点有8个方向向量信息,这样每个特征点就有4x4x8128个数据,即形成128维特征向量的特征描述符。此时,SIFT特征向量已除去了尺度变化、旋转等几何变形因素的影响,再继续将特征向量的长度归一化,则可以进一步去除光照变化的影响。

为了对光线变化更具鲁棒性,描述子都被归一化到单位长度。如果图像的对比度发生变化,每个像素值都会乘上一个数值,归一化后,对比度的影响被消除了。对于图像亮度的变化,每个像素值都会加上一个数值,然而这对计算的梯度是没有影响的。因此,该描述子对亮度的仿射变换是鲁棒的。对于非线性的光线变化,梯度大小会受影响,但是梯度的方向不会有大的变化,我们可以根据生物学原理解释此问题。在 128 维的单位向量中,滤除梯度大小大于 0.2的梯度值(即把大于0.2的都改为0.2),然后重新归一化。也就是说,梯度大小的作用被虚弱了,而方向信息的作用被强化了。0.2是实验得出的经验值。

 

特征匹配

以两个特征点描述符之间的欧式距离作为特征点匹配的相似度准则。假设特征点对pq的特征描述符分别为DespDesq,则其欧式距离定义为:


首先采用优先k-d树进行优先搜索来查找每个特征点的两个近似最近邻特征点,如找出特征点p欧式距离最近和次近的两个邻居特征点q’q’’,然后计算pq’以及pq’’两组描述符之间的欧式距离的比值r,如果r小于给定的阀值T,则视为匹配成功,接受点对(p,q’)为图像序列中的一对匹配点,否则匹配失败。

 

如图4.9所示,是特征点随最近邻域与次邻域距离比值的分布概率图,水平坐标表示最近邻域距离与次邻域距离的比值比;垂直坐标表示正确匹配的特征点(内点,图中inliers曲线表示)和错误匹配的特征点("外点图中outliers曲线表示)。两条曲线相交于最近邻域距离与次邻域距离的比值为0.75,这说明小于0.75时,检测到的特征点为"内点"的概率比"外点"大,而且大很多。通常选择阀值为0.6.


具体可参考:http://blog.csdn.net/xiaowei_cqu/article/details/8069548

你可能感兴趣的:(算法,opencv,sift)