SIFT–尺度空间、高斯金字塔

SIFT–尺度空间、高斯金字塔尺度空间高斯金字塔高斯模糊下采样高斯金字塔的构造过程差分高斯金字塔构造过程SIFT成名已久,但理解起来还是很难的,一在原作者Lowe的论文对细节提到的非常少,二在虽然网上有许多相应博文,但这些博文云里雾里,非常头疼,在查看了许多资料了,下面贴出我自己的一些理解,希望有所帮助。Lowe把SIFT分为四个阶段:构建尺度空间、关键点的定位、方向分配、特征描述符。下面分别从这四个阶段来阐述。尺度空

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用


SIFT成名已久,但理解起来还是很难的,一在原作者Lowe的论文对细节提到的非常少,二在虽然网上有许多相应博文,但这些博文云里雾里,非常头疼,在查看了许多资料了,下面贴出我自己的一些理解,希望有所帮助。


Lowe把SIFT分为四个阶段:构建尺度空间、关键点的定位、方向分配、特征描述符。下面分别从这四个阶段来阐述。

尺度空间

尺度空间是一个比较晦涩的概念,但尺度空间在自然空间中又是真是存在的,这里我们先从尺度谈起,在自然界物体都是由大小不同的实体组成,我们描述着些实体比如说房子、桌子一般会说有多高或者有多大,那么这个多高和多大一般所说就是长度和占地面积。在肉眼可见的情况下,我们常用厘米、米这样的标量尺度来描述长度和占地面积。而很少用纳米和微米这样很小的尺度。也就是说尺度是用来衡量一个量的一个标准。即我们可以用厘米来描述一个桌子多高,也可以用纳米来描述(当然生活中是没必要的)。
再来一个地图的例子,有世界地图和北京地图俩幅。在世界地图上(大尺度下)我们只能看到的是每一个国家的分布,但这个国家的仔细信息我们在这个尺度上是看不到的。但在北京地图上(小尺度下)我们就能清晰看出每一个街道或者商铺的名称。所以往往大尺度下关注的是物体的全局信息,如物体的轮廓等,小尺度下则更注重物体的细节。

以上,对现实中物体的描述一定要在一个十分重要的前提下进行,即对自然界建模时的尺度。当我们用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的就是图像在所有尺度下的描述。

高斯金字塔

提到信号多尺度描述,容易想到信号的金字塔化。用金字塔来作为图像尺度的表示形式时一般有俩个步骤:

1、用低通滤波器进行平滑。
2、对平滑过的图像进行下采样。

在用金字塔来作为尺度变化的描述时,我们要明确一点:这里的低通滤波器只能用高斯滤波。因为高斯核是实现尺度变换的唯一线性核(Lindeberg等人已经证明过)。而且不同的高斯核组成的尺度空间具有半群结构、尺度不变性和旋转不变性等。当金字塔的核为高斯核时,我们称为高斯金字塔。

所以我们首先要做的就是把处于不同尺度下的图片用高斯金字塔表示出来。
高斯金字塔分俩步:高斯模糊、下采样。

高斯模糊

高斯模糊在这片博文中有讲到,具体细节不阐述,这里贴出公式。

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





 σ 
在高斯函数中为正态分布的标准差。在用高斯金字塔表示尺度形式时

 σ 
定义为尺度大小。

我们定义原图像大小为

 I(x,y) 



尺度空间定义为原图像与高斯模糊卷积得到,尺度空间的表达式为

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



很明显,在

 σ>=0 
才有意义,当

 σ=0 
表示对原图像无操作。当

 σ 
越大,尺度越大,也就是模糊程度越高。

下采样

生成对应的显示缩略图,分辨率是逐渐降低的。这里的下采样因子是2。
具体事例参见下图:
高斯金字塔

高斯金字塔的构造过程

这里我们先给出构造好的高斯金字塔,并解释其中用到的各种参数。
高斯金字塔
如图,这个高斯金字塔有5组(octave),每个Octave内又包含若干层。所有我们定义第一个参数   O  ,表示高斯金字塔的组数。
 σ  我们称为尺度参数,第一组第一层的尺度参数为  σ  ,且Lowe认为最优的  σ=1.6 
且组间尺度关系倍数为2,如第二组的尺度参数是第一组尺度参数的俩倍(同一层的俩倍)。但组内尺度参数是不同的,且有比例关系  σn=kn1σ1   σ1  指的是该组的第一层尺度,   k  称为比例系数,作者给出   k=21s  。这个关系适用于高斯金字塔的所有层。

具体步骤:

1、为获取更多的稳定的特征点数目,对原始图像做放大一倍操作,得到尺度参数  σ=1  (作者这里假定原始图像已有 σ=0.5  的高斯模糊)
2、所以为了得到第一组第一层图片的  σ=1.6  ,运用高斯模糊的半群性质。要对放大后的图像作  1.62(0.5×2)2  的高斯平滑。
3、得到第一组第一层图片的尺度后,运用公式  σn=kσ1  通过高斯模糊分别计算其它层的结果。
4、我们将第一组倒数第三层的图片作比例因子为2的降采样,结果作为第二组的第一层(第二组第一层的尺度是第一组第一层尺度的俩倍)。同理,运用公式  σn=k 2σ1  通过高斯模糊分别计算其它层的结果。
5、将第二组第三层的图片做比例因子为2的降采样,结果作为第三层第一组的结果,同样要注意初始尺度的变化,其它处理跟第二组同。
6、后面每组的处理都跟前面相同。

差分高斯金字塔构造过程

顺便阐述差分金字塔的构造过程,然后再贴出解释
在Lindeberg的论文《Scale-space theory: A basic tool for analysing structures at different scales》 指出尺度规范化的LoG算子具有真正的尺度不变性。即我们可以在不同尺度的图像(已经经过高斯卷积)上进行拉普拉斯运算(二阶导数),并求极值点,从而求出关键点。但这样做运算很大,Lowe做了近似处理。将高斯差分算子DOG近似于LoG算子。

差分高斯金字塔的公式如下:

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



简单来说,
高斯金字塔每一组内相邻俩层的图片相减得到差分高斯金字塔。具体见下图。

差分高斯金字塔

极值点的检测是在差分高斯金字塔中进行的,Lowe提出每一层极值点是在三维空间中比较获得的,即这个极值点是同相邻俩层和本层周围点共26个点比较得出的,注意这里极值点是备选关键点,后面还要进一步处理,具体如下图:
极值点检测

高斯金字塔和差分高斯金字塔整个过程见下图:

高斯金字塔和差分高斯金字塔

一些解释:因为Lowe原文中对具体实现细节描述甚少,网上的一些资料也都是交代的模模糊糊,比如每层间的尺度的计算,都讲的不清楚,我也只贴出具体关系和已理解的部分。

1、高斯金字塔中每层图片数如何确立?
高斯金字塔每个Octave必须有s+3幅picture。因为极值点检测是在差分高斯金字塔中进行的,即每一层的极值点是必须有相邻俩层比较才能得出。所以差分高斯金字塔每组必须有s+2幅picture,因为差分高斯金字塔是由高斯金字塔相邻俩幅picture减去得来。所以反推得出高斯金字塔中每组有s+3幅picture。作者推荐   s=3 

2、尺度空间的连续性如何体现?
Lowe设  s=3  ,且有   k=21s  ,则第一组中的尺度依次为:

 σ,213σ,223σ,233σ,243σ,253σ 



相应的差分高斯金字塔中的尺度为:


 σ,213σ,223σ,233σ,243σ 



极值点只能在差分高斯金字塔的中间三层取得,我们依次写下可以取得极值点的尺度:

 213σ,223σ,233σ,243σ,2213σ,2223σ,2233σ,2243 

我们可以发现这些数据是离散连续的,也就是说通过高斯金字塔描述的尺度空间是连续的,
这样在尺度空间的极值点确定过程中,我们不会漏掉任何一个尺度上的极值点。

3、下一组的第一层图片如何得到?
下一组第一层的图片由上一组倒数第三层下采样得到。由  2  中可知,倒数第三层的尺度为   233σ=2σ  ,所以第二组第一层图片的尺度正好是第一组第一层的俩倍。
具体过程也有从Lowe的源码反推的,这里不贴了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181961.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 之 zsh

    Linux 之 zsh安装现在好多linux发行版好像都自带zsh的,比如说centos。[root@master~]#chsh-l/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/usr/bin/tmux/bin/zsh/usr/bin/fish如果实在没有的话,就用yum安装一个。yuminstallzsh…

    2025年5月23日
    2
  • 遗传算法的优化算法_粒子群算法和遗传算法的区别

    遗传算法的优化算法_粒子群算法和遗传算法的区别与遗传算法的第一次接触遗传算法的基本概念基本定义遗传算法的基本流程遗传算法过程中的具体操作参数的编码二进制编码Gray编码实数编码有序编码初始群体的设定适应度函数的计算遗传操作设计选择selection交叉crossover变异mutation控制参数的设定求解优化问题的实例问题描述问题分析算法设计个体编码适应值函数选择策略杂交算子变异算子参数设置

    2025年9月16日
    7
  • 正则提取字符串中的数字_正则表达式忽略空格python

    正则提取字符串中的数字_正则表达式忽略空格pythonpython从字符串中提取数字使用正则表达式,用法如下:##总结##^匹配字符串的开始。##$匹配字符串的结尾。##\b匹配一个单词的边界。##\d匹配任意数字。##\D匹配任意非数字字符。##x?匹配一个可选的x字符(换言之,它匹配1次或者0次x字符)。##x*匹配0次或者多次x字符。##x+匹配1次或者多次x字符。…

    2022年10月3日
    4
  • 数据库锁表如何解决_mysql数据库怎么解锁

    数据库锁表如何解决_mysql数据库怎么解锁这个问题之前遇到过一次,但是由于不知道导致锁表的原因,也没细想,就知道表被锁了,然后让别人把表给解锁了。但是前天的一次操作,让我亲眼见证了导致锁表的过程,以及如何给lock的表解锁。1.导致锁表的原因(同志们也可以参考是不是也是同样的操作啊。。。):1.1首先是大前提我们正常的框架在service层都会有事物控制,比如我一个service层的方法要执行更新两张表,这两个表只有同…

    2022年8月23日
    7
  • 深入理解FT,DTFT,DFT 之间的关系[通俗易懂]

    学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DFT、DTFT、FS、FT、FFT、DFS等,参考整理的资料,重新写了一下各种变换的概念。 学过卷积,我们都知道有时域卷积定理和频域卷积定理,在这里只需要记住两点:1.在一个域的相乘等于另一个域的卷积;2.与脉冲函数的卷积,在每个脉冲的位置上将产生一个波形的镜像。(在任何一本信号与系统课本里,此两条性质有详细公式证明) 下面,就用这两…

    2022年4月3日
    225
  • countdowntimer的用法_offset counta函数

    countdowntimer的用法_offset counta函数CountDownTimer类介绍CountDownTimer类比较简单,总共就一个构造和4个方法。内部是通过handler实现CountDownTimer(longtime,longinterval):参数time是总时间,interval是间隔时间start():开始倒计时的方法cancel():取消倒计时的方法onTink(longtime):抽象方法,每个间隔时间

    2026年1月17日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号