SIFT特征

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SIFT特征相关的知识,希望对你有一定的参考价值。

参考技术A 参考了几位大佬的博文:

参考1

参考2

SIFT特征也叫做尺度不变特征,SIFT特征最后是把输入的图像表现成为以128维的特征向量集合,SIFT特征具有 旋转,缩放,平移,光照 不变形,SIFT特征检测的步骤:

1. 尺度空间的极值检测:高斯金字塔->DOG->极值检测

2. 关键点的准确定位:二阶泰勒展开+边缘点过滤

3. 关键点主方向确定

4. 生成特征向量

目的:我们的目的是要找到一些特征,这些特征具有尺度不变形,也就是说一张图在不同的尺寸下面,我们仍然可以找到这些特征

方法:我们可以通过对图像连续的尺度变化,生成图像的尺度空间,具体的做法就是对图像进行多次的高斯模糊,为什么用高斯核呢,因为高斯核:是唯一可以产生多尺度的核,那么在这里,我们其实也可以直接通过计算图像的二阶导数,可以在不同尺度下找到比较稳定的极值点(图像的高斯拉普拉斯算子LOG),但是LOG的计算复杂,我们可以通过计算高斯差分(DOG)的方法来近似LOG,下面是证明过程

高斯函数:

LOG(高斯拉普拉斯算子LoG(Laplacian of Gaussian):

再看DOG:

 --(1)

同时:

--(2)

令(1)=(2),可得:

以上可以证明,我们可以用DOG来近似LOG

其中Octave成为组,组数一般取4,但实际上跟输入图像的大小(M*N)有关

每一个组中的层数s,一般为3~5,模型的初始参数 ,高斯金字塔的形成过程是这样的:

1. 由原始的输入图像开始进行高斯模糊,生成第0组的隔层图像  ,其中

2. 第1组的的第0层图像由第0组的倒数第三层图像下采样得到,第0层的倒数第三层图像:

所以第1组的第0层图像尺度为: ,于是我们可以得到规律,第o组的第r层图像相对于输入的图像的尺度可以用用下面的计算公式得到:

3. 之后就可以根据高斯金字塔,计算DOG,也就是根据高斯金字塔连续的两层相减得到,若高斯金字塔中的一组有s+2 层,那么DOG对应的组就有s+2层

4. 最后计算尺度空间的极值点,对于每个点,对比其周围的8个点以及上下两层的共18个点,如果是最大值/最小值,则被选定为极值点

上一部找到的极值点是在离散空间找到的,离散空间的极值点并不一定是真真的连续空间的极值点,对此我们可以对尺度空间的DOG函数函数进行曲线拟合,从而找到极值点的更准确的定位,同时我们还需要对边缘位置进行处理提高关键点的稳定性。

利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值,利用尺度空间DOG函数进行曲线拟合,然后对其函数利用泰勒展开式,求得一个偏移量,从而实现对行(x),列(y)以及尺度(sigma)进行修正,一般认为,偏移量小于0.5则调整完毕.

之后我们还要对边缘点进行过滤,SIFT认为边缘点容易受到噪音的影响,因此需要剔除,对于边缘点的检测是通过曲率来判读的,边缘点在横跨边缘的地方曲率较大,而在垂直边缘的方向有较小的曲率,候选特征点的曲率与2*2的海森矩阵的特征值成正比,可以通过以下的公式进行筛选:

其中Tr表示海森矩阵对角线元素之和,Det表示海森矩阵的行列式,Tgamma表示一个阀值,默认取10,如果上式成立,那我们就可以剔除该候选关键点

上面找到的关键点保证了尺度不变形,为了实现旋转不变形,我们需要给特征点的方向进行赋值,利用特征点周围的像素点的梯度分布,统计生成一个梯度直方图从而方便来确定特征点的主方向,我们上面已经找到了特征点的尺度,那也就可以得到特征点所在的尺度图像:

对于一个特征点,我们要去计算以该特征点为中心, 为半径的区域内的像素点的梯度向量的幅度和方向:

之后统计一个梯度直方图,我们以10度为一个bin,共分了36个bin,每个采样点按照其梯度方向加权统计到直方图中,权重为幅度m和贡献因子的乘积,贡献因子是采样点到关键点的距离的反比。

当直方图确定以后,任何大于峰值80%的的方向,可以看作是该特征点的辅助方向,以此来提高匹配的稳定性。 最后我们可以用方向的峰值和左右两个幅值拟合二次曲线,来更准确的定位峰值的位置。

通过之前的步骤,我们已经得到了特征点的尺度,位置已经方向信息,这一步我们需要用一个特征向量来表示它。我们可以通过三步来生成特征向量:

我们以关键点为中心,取一个16*16的window,对于里面的每一个像素点,我们都要计算其幅度和角度,然后我们以4*4作为一个种子点,把里面的像素点的梯度进行统计并生成一个梯度直方图,对于每一个梯度直方图,我们以45度作为一个bin在360度的范围内共有8个方向区间,于是,对每个关键点,我们取4*4共16个种子点来描述,每个描述子由8个方向的梯度信息,所以对于每个特征点,我们生成了一个4*4*8=128维的向量

最后我们对生成的特征向量进行归一化处理,该处理可以去除光照的影响

通过SIFT提取的特征有着旋转平移不变形,尺度不变形,光照不变形,其中:

1. 旋转不变形是因为在生成特征向量之前,我们需要将坐标轴做一个映射使其旋转到主方向,因此有了一定的旋转不变形

2. 平移不变形是因为SIFT在计算特征向量的时候,提取关键点周围的区域的样本点,所以如果该特征点移动到任何处于该区域内的位置都可以被提取出来,这就有点像CNN中的pooling

3. 尺度不变形是首先因为我们通过DOG拟合LOG,而LOG又经前人的证明可以在不同尺度下检测到图像的特征,其次通过DOG我们可以拟合出来不同的尺度的情况,在这种情况下求出来的关键点,自然是具有尺度不变形的

4.光照不变形是因为我们对最后的特征向量进行了归一化

1. SIFT高度依赖局部区域像素的梯度,有可能这个区域取得不合适,导致我们找的主方向不准确,从而导致计算出来的特征向量误差很大,从而不能成功匹配

2. 另外我们在进行SIFT特征选取之前,可以看一下图像的像素值分布,如果像素值分布过于集中,那么SIFT的表现也不会很好,对此我们可以做一些图像均衡化的处理

以上是关于SIFT特征的主要内容,如果未能解决你的问题,请参考以下文章

python—sift特征提取

SIFT特征

[转]SIFT特征提取分析

SIFT特征描述与检测的Matlab实现

SIFT特征描述与检测的Matlab实现

SIFT特征描述与检测的Matlab实现