zoukankan      html  css  js  c++  java
  • [ZZ] SIFT中的尺度空间和传统图像金字塔

    http://www.shamoxia.com/html/y2010/2146.html

     

    最近自己混淆了好多概念,一边弄明白的同时,也做了一些记录,分享一下。

    想要得知图像中哪些是有意义的,必须先要明确这样一个问题:在一幅图像中,只有在一定的尺度范围内,一个物体才有意义。举一个例子,树枝这个概念,只有在几厘米到几米的距离去观察它,才能感知到它的确是树枝; 如果在微米级或者千米级去观察,就不能感知到树枝这个概念了,这样的话可以感知到的是细胞或者是森林的概念。

    因而,如果想要描述现实世界的结构,或者将三维物体映射到二维的图像上去,多尺度表示将会至关重要。多尺度表示的概念很容易理解,举例说明,绘制地图时会有比例尺的概念。世界地图中就只能够显示大洲大洋,以及较大的地域和国家;而一个城市地图,甚至可以详细的显示出每条街道。
    这里需要强调一点,事物是实实在在的存在的,但是通过图像这个媒介,观察者可以感知到的概念是不同的。

    一种比较老的尺度表示方法是图像金字塔。金字塔是结合降采样操作和平滑操作的一种图像表示方式。它的一个很大的好处是,自下而上每一层的像素数都不断减少,这会大大减少计算量;而缺点是自下而上金字塔的量化变得越来越粗糙,而且速度很快。(需要强调的是,这里的金字塔构造方法和小波金字塔的构造方法是类似的,对某一层的图像进行平滑之后,再做降采样,平滑目的是为了降采样后的像素点能更好的代表原图像的像素点,与多尺度表示中的平滑完全不是一个目的)

    SIFT中提到的“尺度空间”(Scale-Space)表示法是多尺度表示的另外一种有效方法,它的尺度参数是连续的,并且所有尺度上空间采样点个数是相同的(实际上,一个尺度上得到的就是一幅图像,尺度空间采样点也就是该尺度上图像的像素点。也就是说,尺度空间表示法在各个尺度上图像的分辨率都是一样的)。尺度空间表示的主要思想是,由原始信号(例如一幅图像)生成一系列信号,并用这些信号来表示原始信号,这个过程中,精细尺度的信息被逐步的平滑掉(可以认为是细节信息被丢弃)。

    尺度可变高斯函数G \left( x, y, \sigma \right) = \frac{1}{2\pi\sigma^2}e^-(x^2+y^2)/2\sigma^2

    所以,这里的尺度空间和传统图像金字塔的表示是不同的,尺度空间可以理解为用高斯对图像做了卷积,图像的分辨率还是那么大,像素还是那么多,只是细节被平均(平滑)掉了,原因就是高斯了,用周围的信号比较弱的像素和中间那个信号比较强的点做平均,平均值当然比最强信号值小了,这就起到了平滑的作用。传统图像金字塔关键在于降采样,每四个像素,求平均作为一个像素,显然分辨率降低了。

    下面就是Octave和sigma这两个参数的影响,行与行之间的差距,可以理解为金字塔或者降采样;行内部其实是因为高斯sigma参数作用的结果,高斯卷积其实是起到了一个平滑的作用:
    111111.jpg

    下面这个就是DOG,高斯查分,其实这和边缘检测的原理是差不多的,通过查分,将边缘留下来了。这就是图像中的关键点的原始的结合,什么是关键点,最起码能够代表图像中有变化比较明显的特征点,但是,对于那些平滑的特征,如果丢失了,是不是可惜呢?
    222222.jpg

    关于SIFT的理解,Cauthy的博文有几篇,了解的要比我深好多呢。

    另外最近还有一种金字塔的表示,用来做金字塔匹配The Pyramid Match等,其原理其实是采样窗口的大小,采样窗口由小到大,包含的局部特征也会越来越丰富。关于这个,推荐两篇论文

    1、The Pyramid Match: Efficient Matching for Retrieval and Recognition

    2、Beyond Bags of Features: Spatial Pyramid Matching for Recognizing Natural Scene Categories

    http://www.cs.unc.edu/~lazebnik/images/spatial_pyramid.jpg

     
    2010年10月7日11:34 | #4

    看了您的文章才了解了二者的区别啊。。。。那尺度空间还分组octave,其实是结合了图像金字塔的特性的吧,因为每组内的sigma和下一组是一样的,不知道您看了Hess的代码了没,有点问题想请教一下,邮箱是xjsxujingsong@gmail.com

    丕子 回复:
     cauthy 回复:
    对 是 结合了图像金字塔的特性

     

    我的理解是真正的尺度空间就应该是连续的,即去掉分组,图像逐渐变小,高斯滤波的sigma也应该是连续的,逐渐变大,SIFT是做了近似,分个组,组里面sigma逐渐变大,最后在求极值点的时候,极值点所在的尺度应该是 scale = sigma*2^(octave+invl/Invls),最终才能够保证极值点分布的尺度空间是一个完整的连续的空间

     

    2010年10月10日21:59 | #5

     

    文章很赞
    但小弟仍对以下问题存有疑问望丕大侠指导

    sift特征提取是为了检测对图像缩放、旋转、尺度缩放保持不变性的关键点,在sift算法中lowe首先建立了含有多个octave的高斯金字塔,并在不同的octave中利用高斯卷积建立不同的scale从而产生DOG,通过检测DOG的极值点来作为关键点的备选点,但论文中只是检测了一个octave中的极值点,既然只检测了一个octave中的极值点,为何又要建立其他的octave呢?
    question:
    (1) 我的理解是:多个octave是通过一系列的降采样而得到的,这相当于是对图像做了缩放的操作,那么在多个的octave中检测极值点实际上就是为了检测具备图像缩放的不变性的点,相应的在一个octave中检测的极值点实际上是检测出具有尺度缩放不变性的点。不知这样的理解是否正确?
    (2) 如果这个理解是正确的我们是不是应该首先在一个octave中检测出极值点,之后再去检查其他的octave中与这个极值点对应位置的那个点是否是这些octave中的极值点?(个人认为这样做其实是为了让这些点同时具备尺度缩放不变性和图像缩放不变性)

    丕子 回复:

    这是caythy的总结:我觉得Paper里面的尺度空间还是结合了图像金字塔的,paper里面说选择尺度空间在每一组octave分层,这个尺度k=2^(1/s), 这里的s就是intvls,这样最后算下来的极值点检测就能覆盖一个完整的组octave。的确是这样的啊

    Octave scale sigma sigma extrema extrema

    Octave 1

    2^(8/3) 2^(5/3)

    2^(7/3) 2^(4/3) 2^(4/3)

    2^(6/3) 2^(3/3) 2^(3/3) √

    2^(5/3) 2^(2/3) 2^(2/3) √

    2^(4/3) 2^(1/3) 2^(1/3) √

    2^(3/3) 2^(0/3) 2^(0/3)

    Octave 0

    2^(5/3) 2^(5/3)

    2^(4/3) 2^(4/3) 2^(4/3)

    2^(3/3) 2^(3/3) 2^(3/3) √

    2^(2/3) 2^(2/3) 2^(2/3) √

    2^(1/3) 2^(1/3) 2^(1/3) √

    2^(0/3) 2^(0/3) 2^(0/3)

    Gaussian DoG

    公式 scale = sigma*2^(octave+invl/Invls)
    Sigma=sigma*2(invl/Invls)

    程序中求极值点的时候需要三线性插值,用的Sigma而不是scale其实是一样的,其中打钩表示求极值点是在那些范围内做的。

    你可以去看看:http://cauthy.wordpress.com/

     

    2010年10月21日15:09 | #6

     

    博主,您好,文章写得真的很不错,但是我还有几个问题想请教一下:
    1、公式 scale = sigma*2^(octave+invl/Invls),这个scale是代表高斯滤波中的参数还是一个octave中每一级的索引号?
    2、“paper里面说选择尺度空间在每一组octave分层,这个尺度k=2^(1/s), 这里的s就是intvls,这样最后算下来的极值点检测就能覆盖一个完整的组octave。的确是这样的啊”,这句话不是很理解,k=2^(1/s), 是怎么来的啊
    3、sift是怎样保持旋转不变的呢,文章中是说计算关键点的主方向,然后再计算描述子之前将坐标旋转为相应的主方向,这样就能保持旋转不变了吗。举个例子:假设一幅原图像,为它的某一个关键点求出主方向,然后对匹配图像(假设为原图像旋转90度后的图像)也为它的那一个关键点求出主方向,这两个方向的值应该不同吧,再将相应的图像旋转相应的度数,难道旋转后的图像就会是一样的吗(即所谓的旋转不变)?
    不好意思,问题有点多,最近一直在弄这个,都没弄明白,感觉你应该理解得不错,希望能帮帮我,谢谢

    丕子 回复:

    1、尺度参数。scale就是指不同尺度的参数,其实控制的像是金字塔的将采样,一个octave中影响尺度的参数是sigma;
    2、其实正确的式子是这样的:scale = sigma*2^(octave+invl/Invls)
    3、关于旋转不变我也找了一下,能够发现的就是关于那个坐标旋转了,但是这个也不一定准。随意这方面也理解的不好

    liuliudandan 回复:

    首先谢谢您的回复。我还想问一下尺度参数在文章中具体是做什么用的。然后计算特征描述子的时候是将关键点折回到原始图像上算还是在关键点所在的第octave组、第invl层上算呢。请问可以加您Q吗,我的是511542536,谢谢了

    cauthy 回复:

    肯定是在关键点所在的组和层来算啊,尺度空间太有用了,最简单的例子就是图像放大缩小。。。
    旋转不变的话有两个方面1是detector,用的是规整化normalization的DoG,满足旋转不变,也就是说图像旋转之后我照样能找到这个关键点。2是descriptor,举个简单的例子,假如关键点周围是黑白图像,梯度方向就是指向白色的,图像经过旋转之后,梯度方向肯定还是指向白色的,只是和原来的角度不同(图像旋转了),总结起来就是主方向,就是PCA的感觉。

     

  • 相关阅读:
    赵栋 201771010137 第三周学习总结
    赵栋 201771010137 《面向对象程序设计(java)》课程进度表
    赵栋 201771010137 《面向对象程序设计(java)》第二周学习总结
    赵栋 201771010137 《面向对象程序设计(java)》
    防止电源反接的方法
    dsPIC单片机的波特率的计算
    PIC单片机编译器自带的延时程序
    python3.7 64bit安装pygame1.9.3
    dsPIC单片机的CAN引脚设置
    TJA1040
  • 原文地址:https://www.cnblogs.com/xfzhang/p/1901148.html
Copyright © 2011-2022 走看看