浅谈SIFT特征描述子

原文:http://bubblexc.com/y2011/163/

SIFT是我接触最早的图像局部特征描述子之一,其实最初,始终觉得局部特征描述子是些非常玄虚的东西。对于SIFT,这种感觉更是尤为强烈,“尺度空间”“拉普拉斯高斯算子(LoG)”“高斯差分金字塔”,一系列让人头痛的概念。不过,反反复复看了几次,渐渐也就有了感觉,在此总结一下。

物体识别的核心问题是将同一目标在不同时间、不同分辨率、不同光照、不同位姿情况下所成的像相相匹配。而为了进行匹配,我们首先要合理的表示图像。由于目标的自身状态、场景所处的环境的影响,同一类物体在不同的图像中所成的像往往会差别很大,但即使这样,人们所能通过同一物体的一些局部共性来识别出物体(正如我们能将不同国家民族的人区分出来)。所谓局部特征描述子就是用来刻画图像中的这些局部共性的,而我们也可以将一幅图像映射(变换)为一个局部特征的集合。理想的局部特征应具有平移、缩放、旋转不变性,同时对光照变化、仿射及投影影响也应有很好的鲁棒性。传统的局部特征往往是直接提取角点或边缘,对环境的适应能力较差。1999年British Columbia大学 David G.Lowe 教授总结了现有的基于不变量技术的特征检测方法,并正式提出了一种基于尺度空间的、对图像缩放、旋转甚至仿射变换保持不变性的图像局部特征描述算子-SIFT(尺度不变特征变换),这种算法在2004年被加以完善。

SIFT算法的实质可以归为在不同尺度空间上查找关键点(特征点)的问题。所谓关键点,就是一些十分突出的点,这些点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相同的景物, 那么使用某种方法分别提取各自的稳定点,这些点之间就会有相互对应的匹配点。而在SIFT中,关键点是在不同尺度空间的图像下检测出的具有方向信息的局部极值点。涉及到的最重要的两步是:1.构建尺度空间 2.关键点检测

  • 构建尺度空间

先来谈谈尺度的问题。我们要精确表示的物体都是通过一定的尺度来反映的。现实世界的物体也总是通过不同尺度的观察而得到不同的变化。比如说,对同一物体拍照,我们拍摄了一副近景,一副远景,虽然两幅图片中都有这个物体,但这个物体确是处于两个不同的尺度。SIFT特征具有尺度不变性,就是说即使同一物体处于两个不同的尺度的图像中,我们仍可以通过提取图像的SIFT特征匹配成功。

图像的尺度有多种表示方法(金字塔、八叉树等等),在SIFT中Lowe教授采用了尺度空间理论。其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,并检测这个序列中的关键点。这样图片就被映射为多个尺度上的关键点信息,尽管两幅图片是处于不同的尺度,但却可以提取出在尺度变换中没有改变的关键点,从而进行关键点匹配,进而识别出物体。

实际上,在尺度空间理论中,是通过对图像进行模糊来模拟多尺度下的图像。直观上,图像的模糊程度逐渐变大,模拟了人在距离目标由近到远时目标在视网膜上的形成过程。文献《Scale-space theory: A basic tool for analysing structures at different scales》证明,高斯核是唯一可以产生多尺度空间的核(其它核会对图像造成模糊之外的其它影响)。一个图像的尺度空间,  L(x,y,σ)  ( σ  可以代表尺度的大小) ,定义为原始图像  I(x,y) 与一个可变尺度的2维高斯函数  G(x,y,σ)   卷积运算。高斯函数:

G(x,y,σ)=12πσ2e(x2+y2)/(2σ2)

L(x,y,σ)=G(x,y,σ)I(x,y)

需要的注意的是,图像的尺度是自然存在的,不是人为创造的!高斯卷积只是表现尺度空间的一种形式。(在SIFT的代码中,进行高斯模糊时,用到了高斯模糊的“勾股定理”:例如,使用半径分别为 6 和 8 的两次高斯模糊变换得到的效果等同于一次半径为 10 的高斯模糊效果)。

高斯金字塔

图1:高斯金字塔

在SIFT中,构建了高斯金字塔(如图1所示),即分为两步:1)对图像做高斯平滑 2)对图像做降采样(减小计算量)。一幅图像可以产生几组(octave)图像,一组图像包括几层(interval)图像。为了让尺度体现出连续性,相邻两层图像间的尺度为k倍的关系,同时相邻两组的同一层尺度为2倍的关系(在SIFT算法中,Lowe教授假设初始图片已经是以一定  σ  模糊过得了)。

 
  • 关键点检测

文献《Scale-space theory: A basic tool for analysing structures at different scales》指出尺度规范化的LoG算子具有真正的尺度不变性。即我们可以在不同尺度的图像(已经经过高斯卷积)上进行拉普拉斯运算(二阶导数),并求极值点,从而求出关键点。但这样做的运算量很大,于是SIFT中进行了近似处理:

2G=2Gx2+2Gy2

LOG(x,y,σ)=σ22GGauss(x,y,kσ)Gauss(x,y,σ)σ2(k1)

G(x,y,kσ)G(x,y,σ)(k1)σ22G

通过推导可以看出,LoG算子与高斯核函数的差有直接关系,由此引入一种新的算子DoG(Difference of Gaussians),即高斯差分算子:

D(x,y,σ)=[G(x,y,kσ)G(x,y,σ)]I(x,y)=L(x,y,kσ)L(x,y,σ)

可以看出,LoG算子和DoG算子指相差常数系数,而这并不会改变极值点的位置。因此我们在DoG算子中求得极值点就是LoG算子的极值点,也正是我们需要的关键点。而DoG在计算上只需相邻尺度高斯平滑后图像相减,因此简化了计算!

对应DOG算子,我们要构建DOG金字塔

DoG

图2:高斯差分金字塔

如下图,我们可以通过高斯差分图像看出图像上的像素值变化情况。如果没有变化,也就没有特征。特征必须是变化尽可能多的点。本质上,DOG图像描绘的是目标的轮廓。

图3:高斯差分处理后的图像

关键点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。具体来说,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

至此就可以检测出图像中尺度不变的关键点,然后我们为关键点赋予梯度方向,并利用关键点的周围的像素梯度方向直方图生成SIFT特征描述子。具体过程可以参考以下资料(想整理的问题总结完了,偷个懒,>_<):

  1. SIFT的matlab程序,非常详细  http://www.vlfeat.org/~vedaldi/code/sift.html
  2. SIFT tutorial http://www.aishack.in/2010/05/sift-scale-invariant-feature-transform/
  3. 一个非常详细ppt教程,可用作教学 http://wenku.baidu.com/view/53021cf24693daef5ef73daf.html
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值