SIFT特征提取分析

SIFT特征提取分析

sift

关键点,关键点检测

读‘D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J],IJCV,2004’ 笔记


关键点是指图像中或者视觉领域中明显区别于其周围区域的地方,这些关键点对于光照,视角相对鲁棒,所以对图像关键点提取特征的好坏直接影响后续分类、识别的精度。

特征描述子就是对关键点提取特征的过程,应该具备可重复性、可区分性、准确性、有效性和鲁棒性。

SIFT(Scale-Invariant Feature Transform)是一种特征描述子。该描述子具有尺度不变性和光照不变性。

检测尺度空间极值

构建尺度空间

这里的尺度可以理解为图像的模糊程度,就是眼睛近视的度数。尺度越大细节越少,SIFT特征希望提取所有尺度上的信息,所以对图像构建尺度空间, 也就是实用不同的平滑核对图像进行平滑。

It has been shown by Koenderink (1984) and Lindeberg (1994) that under a variety of reasonable assumptions the only possible scale-space kernel is the Gaussian function.

所以,这里的平滑核选用高斯核,空间尺度有高斯核尺度决定

其中是原图像,*是卷积符号,对应尺度下的尺度图像。是高斯核。

不同尺度下的图像.jpg

其中左上角为原图,右上角为尺度下的图像,下行左右分别是尺度的图像。

尺度空间描述了不同模糊程度上的特征,而并没有刻画图像尺寸大小的情形,所以文中将尺度空间和图像金字塔结合起来。图像的金字塔是通过对图像逐步平滑下采样得到的。

令每一层金字塔(octave)中尺度变化范围为,每层金字塔测量s个尺度,那么第t层金字塔的尺度范围就是,第层金字塔的第一幅图像由上层塔中尺度下的下采样的到,下采样比例为0.5.

最终的尺度金字塔图像如下:

尺度金字塔.jpg

每一层金字塔中多层尺度变化因子是,第n层尺度是这样能够保证从金字塔底部到顶部的尺度是连续的

,

DoG极值

现在已经将图像变到尺度空间了,希望在这个空间找到比较显著的点,即变化明显的点,也就是说在图像逐渐模糊的过程中引起你注意的点,这个点突不突出可以通过尺度轴上变化趋势来体现,即尺度轴上的梯度极值。

在尺度轴上计算梯度就是图像沿着尺度轴差分呗

其示意图如下:

DoG示意图.jpg

这里DoG近似等于尺度归一化的高斯拉普拉斯算子,而尺度归一化的高斯拉普拉斯算子相较于其他角点检测算子,如梯度,Hessian或Harris焦点特征能够更稳定的图像特征[1],这篇参考文献我没看。

现在就要找极值点了,在DoG空间中寻找极值,也就是说比周围点都大或者都小的点认为是关键点。既然DoG是差分图像叠在一起的,这里的周围当然是3D的周围,共包括相邻的26个邻点。如下图标注的点要和周围26个绿色的点比较。

DoG极值.jpg

那现在就是沿着尺度轴,逐步查找对应尺度上的极值。我们现在在图像的一个像素点沿着尺度轴看过去,就成了一维图像,让我们看看这个问题。

每层金字塔中有s层尺度图像,就是说有s个尺度,我们希望在s个尺度上都寻找极值点,那么应该有s+2层DoG图像才可以,因为这个过程是三层数据比较嘛。 而DoG图像是两层图像差分得来的,所以s+2层DoG图像应该需要s+3层尺度图像。

所以在每一层金字塔上都应该计算s+3层尺度图像。

s+3.jpg

注:这里是沿着尺度轴类比到一维上观测的示意图。图中单位尺度使用a表示,每一层金字塔包含3个尺度,即。发现第一层金字塔最后寻找尺度为到,而第二层金字塔中最先寻找到的尺度为,所以尺度是连续的。

这样我们就从DoG空间中粗略的找到了关键点。但为了进一步精化结果,需要对检

的结果进行筛选,去掉噪声点。



去除干扰

我们还是从1D上来直观感受一下,下面这个图是一维的差分曲线图,可以理解成DoG空间对应尺度轴上的曲线

梯度曲线.jpg

我们要找的是梯度的极值点,而在上图的极值点中有红色标出的点,这种发生突变的点可以认为是噪声影响,应该踢掉,而黑色标注的极值点中,虽然也是极值但是变化并不明显,所以也应该去除。 对于后一种情况直接阈值处理就可以,而对于前一种情况应该判定是不是一个尖峰信号,那么如何判定呢?我们可以在曲线的极值点找一个与之内切的椭圆,那么这个椭圆的长轴和短轴的比例能够反映出曲线在该极值点的尖锐程度

注:这里长短轴说的并不严谨,只能说是与该极值点切线垂直的轴和与改切线平行的轴的比例,但要去除的噪声点处肯定垂直方向轴较长,为了叙述方便就称为‘长短轴’的比例

判断尖锐程度.jpg

可以看到第一个椭圆的长短轴比例大于第二个椭圆,所以曲线在对应的第一个极值点更加尖锐。

那么内切椭圆的长短轴比例怎么计算呢?这个和曲线在该点的曲率有关。我们下边有提到。

好了,我们现在明白了在1D上应该怎么过滤干扰了,再回来看DoG空间怎么去除干扰。

去除干扰1: 较小的极值

当然可以直接对找到的极值点的值进行阈值化过滤,但是为了更加精确的定位关键点的位置,对关键点进行3D二次函数的拟合(可以类比最优化里牛顿法的做法),然后对函数求极值。

将每个关键点的一段函数进行泰勒二次展开:

其中x是相对于关键点的距离。分别表示三元函数`!$D(x,y,\sigma)‘在关键点的取值和一阶导数,二阶导数。这个展开就是在关键点周围拟合出的3D二次曲线,找极值就令其导数为零。于是:

此时的极值为

文中剔除的点。

去除干扰2:边缘噪声(尖锐的值)

曲线的曲率可以通过曲线函数在该点的Hessian函数的特征值来获得,Hessian矩阵最大的特征向量对应了该点的法线向量[2],特征向量是正交的,所以第二个特征向量就对应的是切线方向了,而特征值的大小正比于对应方向上曲率的大小。==这里要说一点参考[3]里面的 “一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,在垂直边缘的方向有较小的曲率” 这个说法是不正确的。根据我们前面1维情形的分析,不好的极值应该在垂直边缘的方向有较大曲率和平行边缘方向有较小的曲率。

DoG空间上极值点已经决定了尺度信息。那么Hessian矩阵可以决定关键点的位置信息,就是说在一个固定尺度上,图像是二元函数,通过计算二元函数的Hessian矩阵可以识别尖锐的突起和平缓的突起,一般认为尖锐突起是较强的边缘响应导致的噪声,应该被过滤。 Hessian矩阵定义如下:

可以由二阶差分计算得到,那么接下来就可以计算特征值的比值了。

先等一等,假设两个特征值分别为,看下面两个式子:

其中分别是矩阵的迹和矩阵的行列式,这样发现特征值的比值可以通过这两个两计算得到,而不需要特征值分解,这样简单多了。

假设为较大特征值,且,则

最小,所以当越大时,对应的越大。所以我们要将的点剔除就相当于将的点剔除。论文中

关键点的表示

ok,在DoG空间中已经找到并细化出若干关键点,那么这些关键点该怎么表示呢?

可以使用三元组表示关键点,其中三个值分别表示关键点的位置、尺度和方向。为什么要计算特征点的方向呢?这是为了使特征描述子具有旋转不变特性(下一节有讲到,为什么就旋转不变了)。

样本点的方向定义(其实就是对应尺度图像上对应位置的梯度):

是对应尺度的尺度图像。

而关键点的方向是由他周围区域内样本点决定的,比如区域内的所有样本点计算梯度值和方向,将方向分为若干个bins,然后使用高斯函数加权将周围样本点统计出方向直方图,比如论文中将一周360°分成36个bins,那么我们统计方向落在每个bins中样本,将该样本梯度值乘以高斯权重后加入这个bins中,就得到了长度为36的方向直方图。在这个方向直方图中,最大峰值对应的bins就是关键点的方向。如果存在多个峰值或者存在大于0.8倍最大峰值的bins,那么就在该点创建多个关键点,这些关键点的位置、尺度一致,但是方向不同(参考[3]中此处也存在错误)。

论文中采用的高斯权重函数的尺度,其中是该关键点所在的图像在尺度空间中的尺度。而由高斯函数原则,关键点的邻域半径应该设置为.


局部图象描述子

找到了图像在不同尺度的关键点,我们还希望刻画关键点周围的特征,以利于后续的分类或者匹配等操作。

局部特征肯定离不开关键点周围的区域了,将关键点附近半径为的邻域(论文中选取边长为16的正方形邻域)划分为的子区域(论文中推荐),在每个子区域统计长度为的方向直方图(论文中直方图长度为8),每个直方图被称为一个种子点,这样一个关键点的特征描述子就是一个长度为的向量(论文中是维的特征向量)。

如下图所示

抽取特征.jpg

其中中间的点是检测到的关键点,蓝色的点表示该尺度图像中的像素点,红色方格表示划分出的子区域,在每个子区域统计方向直方图得到种子点。这里我们只是示意,具体的区域大小接下来详细讨论。我们还注意到关键点发出的一条橙黄色箭头,这表示关键点的方向。

那么该描述子怎么体现旋转不变性呢?让我们来看下面这个过程

1474269727512.jpg

这两个区域应该是一个图像,只不过旋转了90°,而如果按照‘从最上边的点顺时针统计E点的邻域’,分别是计算出来的差别就会好大,但是如果我们将E点的方向固定,都指向右侧,那么它周围的邻域的相对位置也就固定了,这时候再按照‘从最上边的点顺时针统计E点的邻域’那么结果就是是相同的了,我们可以认为图中左右两个区域是同一区域的不同视角。

现在再来看图像,图像是规则的矩形区域,我们在统计方向直方图是也是有固定的规则的,矩形区域的选择一般都是平行于图像边缘的,所以为了去除旋转的影响,可以,将每个关键的方向固定到相同方向,那么相同区域经过固定规则检测出来的结果就非常相近,这就避免了旋转角度的影响。一般可以将图像旋转,使关键点的方向统一对齐到图像x轴的方向[4],然后再对旋转后的图像划分子区域统计方向直方图。有些资料说将坐标轴方向旋转到关键点方向上,可能意思和我一样,但我觉得没有“旋转图像使将关键点方向和x轴方向重合”这种表述清晰。我刚开始看到那种表述一直搞不明白在干嘛。。。

如下图,我们将图像旋转使关键点的方向对齐到x轴方向,然后在使用红色的网格对旋转后的图像统计方向直方图。

1474270989847.jpg

坐标旋转后的值

这里的是关键点方向和x轴方向的夹角,顺时针旋转该角度为负值,逆时针为正值。

ok,现在保证描述子旋转不变了,让我们按照红色网格区域划分子区域来统计方向直方图吧。可是这时候又发现了个问题,这怎么统计啊?对于每旋转的图像正好像素点落在红色网格内,可现在旋转后落得乱七八糟,怎么办呢?这时候就需要采用双线性插值的方法插出网格点的值了~

我们从上图中取出一小块来分析:

1474272202619.jpg

其中蓝色的点就是旋转后的点,而绿色的点就是网格的中心,我们现在要插值插出绿色点的值,就要看蓝色点在这些点的影响了。图中分别表示蓝色的点对左上角绿色点的在两个方向的影响率,最终的蓝色点分布到左上角点的影响是,这里是绿色点的值。关于双线性插值见[5][5].

假设绿色的点的梯度值为,方向为60°,那么其在左上角的影响为,方向为60°,为高斯权重。那么对于每一个网格点都要计算他周围的点对他的影响,然后累加起来,这时候会产生不同的点在同一个网格点产生影响的方向不同,此时应该将方向插分到与之最近的统计方向上,使得方向直方图更加准确。比如直方图长度为8,那么每45°一个方向,所以60°的方向影响应该插分到45°和90°方向上,所以影响力有落在了45°方向上,落在90°方向上。

综上,方向直方图统计网格点处的值时,在方向o上增量为

这里,是p点周围的旋转后的样本点,因为是逐像素的所以限制其距离在单位1内。的坐标,是高斯权重,分别是对该网格点在两个方向的影响率和对所求方向上的影响率。

现在旋转不变性还剩下一个一直没有说的问题就是区域大小的选择和高斯权重尺度的选择。下面就和说一说~

在统计方向直方图串联成局部特征描述子时,每个子区域的选择应该和计算关键点方向时的区域大小一致,即,其中是图像在尺度空间的尺度。考虑到旋转的问题,我们不希望旋转后半径为的区域内有部分是空的,所以我们选的区域要能够在旋转后仍然后的区域可以检测到。

1474275273487.jpg

另外由于需要采用双线性插值的方法获得网格点的值,所以每一个子区域的半径为

总体区域的半径应该为

去除光照影响

为了去除光照影响,一般将关键点生成的特征向量归一化。

是方差。

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

总结

将所有尺度上关键点提取的局部描述子取出来,就完成了图像sift特征的提取。在图像匹配时,对两幅图像分别提取sift特征,然后在每个尺度上进行描述子的匹配。在匹配中如果一个关键点的最小匹配距离和第二小匹配距离小于某个阈值,则认为是正确匹配。这里参见参考文献3.

SIFT特征特性:

  • 尺度不变性
  • 旋转不变性
  • 光照不变性
  • 鉴别性强,信息量丰富

SIFT特征的缺点

  • 实时性不高,因为不断的下采样和插值等操作
  • 对于边缘光滑的目标无法准确提取特征点

SIFT特征的用途

主要解决图像配准和目标识别跟踪中下述问题

  • 目标的旋转、缩放、平移
  • 图像的仿射/射影变换
  • 部分减轻光照影响
  • 目标的部分遮挡
  • 杂物场景(crowd scene)
  • 噪声


由于最近在挖目标跟踪的东西,就挖到了sift特征,所以花了二三天时间看了Lowe的论文,加上网上的资料,总的来说应该还算清楚的捋顺了SIFT特征的原理。

关于具体的实验及其结果,我暂时没有实现,因为我了解SIFT只是为了更好的理解现在看的东西,所以暂时就不实现了,等忙完了这一段,抽空把代码补上。



  1. Mikolajczyk,K. 2002. Detection of local features invariant to affine transformation, Ph.D. thesis, Institut National Polytechnique de Grenoble, France. ?
  2. C. Steger. An unbaised detection of curvilinear structures[J]. PAMI,1998. ?
  3. Rachel-Zhang, Sift特征提取分析,CSDN blog,2012,6 ? ?
  4. zddhub,SIFT算法详解,CSDN blog,2012,4 ? ?
  5. 双线性插值 ?
时间: 2024-12-21 01:31:00

SIFT特征提取分析的相关文章

[转]SIFT特征提取分析

SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果,详细解析如下: 算法描述 SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果.整个算法分为以下几个部分: 1. 构建尺度空间 这是一个初始化操作,尺度空间

Surf特征提取分析

Surf特征提取分析 Surf Hessian SIFT 读"H.Bay, T. Tuytelaars, L. V. Gool, SURF:Speed Up Robust Features[J],ECCV,2006"笔记 SURF:Speed Up Robust Features,加速鲁棒特征. 我觉得SURF是SIFT特征的一种近似计算,在相似性能甚至更好性能的同时提高了算法的速度.这些近似体现在 在尺度空间中,使用box filtes与原图像卷积,而不是使用DoG算子 确定关键点方

3. opencv进行SIFT特征提取

opencv中sift特征提取的步骤 使用SiftFeatureDetector的detect方法检测特征存入一个向量里,并使用drawKeypoints在图中标识出来 SiftDescriptorExtractor 的compute方法提取特征描述符,特征描述符是一个矩阵 使用匹配器matcher对描述符进行匹配,匹配结果保存由DMatch的组成的向量里 设置距离阈值,使得匹配的向量距离小于最小距离的2被才能进入最终的结果,用DrawMatch可以显示 代码 // 使用Flann进行特征点匹配

python—sift特征提取

一.SIFT提出的目的和意义 二.SIFT的特征简介 三.SIFT算法实现步骤简述 四.图像集 五.SIFT算法代码实现 代码 结果截图 小结 六.SIFT实验总结 一.SIFT提出的目的和意义 1999年David G.Lowe教授总结了基于特征不变技术的检测方法,在图像尺度空间基础上,提出了对图像缩放.旋转保持不变性的图像局部特征描述算子-SIFT(尺度不变特征变换),该算法在2004年被加以完善. 二.SIFT的特征简介 SIFT算法可以解决的问题 目标的旋转.缩放.平移(RST) 图像仿

SIFT特征提取算法

学到SIFT看到了参考了最下面的四篇文章,最后综合起来,根据自己的理解,按着自己的想法,手敲了下面的内容,感觉好长,不过希望对大家有用. SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果. 基本的路线: 1. 尺度空间极值检测:搜索所有尺度上的图像

SIFT 特征提取算法总结

原文链接:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html   主要步骤 1).尺度空间的生成: 2).检测尺度空间极值点: 3).精确定位极值点: 4).为每个关键点指定方向参数: 5).关键点描述子的生成. L(x,y,σ), σ= 1.6 a good tradeoff     D(x,y,σ), σ= 1.6 a good tradeoff 关于尺度空间的理解说明:图中的2是必须的,尺度空间是连续的.在 

在vs环境中跑动sift特征提取(原理部分)

/* 如果给两张图片,中间有相似点.要求做匹配.怎么做.我现在能讲么? 比如给了两幅图片,先求出sift点. 尺度空间极值检测.高斯模糊 关键点定位 关键点方向确定 关键点描述 kdtree 和 bbf 最优节点优先算法 进行两幅图片特征点的匹配,会涵盖一些不正确的匹配点 ransac 随机抽样一致,消除不合适的点 把需要匹配的点,限定到某一个正确的地方 根据这种匹配的结果.确定两幅图相交的某一个点. 比如两幅图的重叠方式是,左上右下的方式,那么在不重叠的地方,按照左边图像写入,然后全黑. 重叠

在vs环境中跑动sift特征提取

因为在前两天的学习中发现.在opencv环境中跑动sift特征点提取还是比较困难的. 所以在此,进行记述. 遇到的问题分别有,csdn不愿意花费积分.配置gtk困难.教程海量然而能跑者鲜.描述不详尽等. [然后我却是发现这个borwhess实在是不知道叫先生何名为好.] 话归正题. 以下跑动具体过程: 首先去: http://blog.csdn.net/masibuaa/article/details/9246493 发现main.cpp 也就是:检测sift的部分. 这个回头慢慢凿.先跑起来:

SIFT算法学习

参考: SIFT算法学习 SIFT特征提取分析 (牛人,图像算法和机器学习) 转一些SIFT代码链接 SIFT算法C语言逐步实现详解(上)