SIFT算法

SIFT算法

利用SIFT算法实现特征匹配主要有三个流程:

1、 提取关键点

2、 对关键点附加详细的信息( 局部特征), 即描述符;

3、 通过特征点( 附带上特征向量的关键点) 的两两比较找出相互匹配的若干对特征点, 建立景物间的对应关系。

 

 

尺度空间的概念

尺度空间理论主要思想是通过对原始图像进行尺度变换, 获得图像多尺度下的空间表示。从而实现边缘、 角点检测和不同分辨率上的特征提取, 以满足特征点的尺度不变性。人的眼镜在一定的范围内无论物体是大还是小都可以把它们分辨出来,然而计算机却很难做到,在未知的场景中,计算机视觉并不能够提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同尺度下有一个统一的认知,在建立统一认知的过程中,要考虑的就是图像在不同的尺度下都存在的特点。并且尺度空间中各尺度图像的模糊程度逐渐变大, 能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。尺度越大图像越模糊。

SIFT算法_第1张图片

该图为高斯金字塔。对于该高斯金字塔越往上δ越大 图像模糊程度越大。

 

 

高斯金字塔

构建高斯金字塔

1.对图像做高斯平滑

2.对图像做降采样

SIFT算法_第2张图片

为了让尺度体现其连续性, 在简单下采样的基础上加上了高斯滤波。一幅图像可以产生几组( octave)图像, 一组图像包括几层( interval) 图像。
容易看出,高斯金字塔有多组,每组又有多层,一组的多个层之间的尺度是不一样的,也就是使用的高斯参数σ不同,相邻两层之间的尺度相差一个比例因子k,如果每组有S层,则k=21S,上一组图像的最底层图像是由下一组中尺度为2σ的图像进行因子为2的降采样得到的(高斯金字塔是从底层开始建立的),高斯金字塔构建完成之后,将相邻的金字塔相减就得到了DoG金字塔。

       高斯金字塔的组数:

                                                               

o表示高斯金字塔的层数,m,n分别是图像的行和列。减去的系数a可以在0−log2min(m,n)0−log2min(m,n)之间的任意值,和具体需要的金字塔的顶层图像的大小有关。

 

 

DoG高斯差分金字塔
 

在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,此时每租的层数减少了1。

 

DOG局部极值检测


关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度(就是每组内不同层,因为前面对每组不同层进行了不同的sigma进行了高斯模糊所以就是不同的尺度)对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

SIFT算法_第3张图片

由于要在相邻尺度进行比较,如图3.3右侧每组含4层的高斯差分金子塔,只能在中间两层中进行两个尺度的极值点检测,其它尺度则只能在不同组中进行。为了在每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG金字塔由高斯金字塔每组中相邻两层相减得到,则高斯金字塔每组需S+3层图像,实际计算时S在3到5之间。

当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。

 

删除不好的极值点(特征点)


通过比较检测得到的DoG的局部极值点实在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,因此在离散空间找到的极值点不一定是真正意义上的极值点,因此要设法将不满足条件的点剔除掉。可以通过尺度空间DoG函数进行曲线拟合寻找极值点,这一步的本质是去掉DoG局部曲率非常不对称的点。

要剔除掉的不符合要求的点主要有两种:

低对比度的特征点

不稳定的边缘响应点

求取特征点的主方向


经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。

找到了特征点,也就可以得到该特征点的尺度σσ,也就可以得到特征点所在的尺度图像     

                                                      
计算以特征点为中心、以3×1.5σ3×1.5σ为半径的区域图像的幅角和幅值,每个点L(x,y)的梯度的模m(x,y)m(x,y)以及方向θ(x,y)θ(x,y)可通过下面的公式求得:

                       SIFT算法_第4张图片

计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。

得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ)(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

生成特征描述


通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率。

特征描述符的生成大致有三个步骤:

校正旋转主方向,确保旋转不变性。
生成描述子,最终形成一个128维的特征向量
归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θθ角度,即将坐标轴旋转为特征点的主方向,旋转后邻域内的像素的新坐标为:

                                         SIFT算法_第5张图片
旋转之后的主方向为中心取8x8的窗口,左图中央为当前关键点的位置,每个小格代表Wie关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个4x4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示,每个特征的由4个种子点组成,每个种子点有8个方向的向量信息,这种邻域方向性信息联合增强了算法的抗噪能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。 

SIFT算法_第6张图片
不同于求主方向,此时每个种子区域的梯度直方图在0-360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息。

在实际计算的过程中,为了增强匹配的稳健性,Lowe建立对每个关键点使用4x4共16个种子点来描述,这样一个关键点就会产生128维的SIFT特征向量。 
 SIFT算法_第7张图片
通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性,

部分内容参考引用博客:

https://blog.csdn.net/lyl771857509/article/details/79675137

https://blog.csdn.net/jiaoyangwm/article/details/79986729

 

你可能感兴趣的:(SIFT算法)