大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
SIFT成名已久,但理解起来还是很难的,一在原作者Lowe的论文对细节提到的非常少,二在虽然网上有许多相应博文,但这些博文云里雾里,非常头疼,在查看了许多资料了,下面贴出我自己的一些理解,希望有所帮助。
Lowe把SIFT分为四个阶段:构建尺度空间、关键点的定位、方向分配、特征描述符。下面分别从这四个阶段来阐述。
尺度空间
尺度空间是一个比较晦涩的概念,但尺度空间在自然空间中又是真是存在的,这里我们先从尺度谈起,在自然界物体都是由大小不同的实体组成,我们描述着些实体比如说房子、桌子一般会说有多高或者有多大,那么这个多高和多大一般所说就是长度和占地面积。在肉眼可见的情况下,我们常用厘米、米这样的标量尺度来描述长度和占地面积。而很少用纳米和微米这样很小的尺度。也就是说尺度是用来衡量一个量的一个标准。即我们可以用厘米来描述一个桌子多高,也可以用纳米来描述(当然生活中是没必要的)。
再来一个地图的例子,有世界地图和北京地图俩幅。在世界地图上(大尺度下)我们只能看到的是每一个国家的分布,但这个国家的仔细信息我们在这个尺度上是看不到的。但在北京地图上(小尺度下)我们就能清晰看出每一个街道或者商铺的名称。所以往往大尺度下关注的是物体的全局信息,如物体的轮廓等,小尺度下则更注重物体的细节。
以上,对现实中物体的描述一定要在一个十分重要的前提下进行,即对自然界建模时的尺度。当我们用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的就是图像在所有尺度下的描述。
高斯金字塔
提到信号多尺度描述,容易想到信号的金字塔化。用金字塔来作为图像尺度的表示形式时一般有俩个步骤:
1、用低通滤波器进行平滑。
2、对平滑过的图像进行下采样。
在用金字塔来作为尺度变化的描述时,我们要明确一点:这里的低通滤波器只能用高斯滤波。因为高斯核是实现尺度变换的唯一线性核(Lindeberg等人已经证明过)。而且不同的高斯核组成的尺度空间具有半群结构、尺度不变性和旋转不变性等。当金字塔的核为高斯核时,我们称为高斯金字塔。
所以我们首先要做的就是把处于不同尺度下的图片用高斯金字塔表示出来。
高斯金字塔分俩步:高斯模糊、下采样。
高斯模糊
高斯模糊在这片博文中有讲到,具体细节不阐述,这里贴出公式。
σ
在高斯函数中为正态分布的标准差。在用高斯金字塔表示尺度形式时
σ
定义为尺度大小。
我们定义原图像大小为
尺度空间定义为原图像与高斯模糊卷积得到,尺度空间的表达式为
很明显,在
σ>=0
才有意义,当
σ=0
表示对原图像无操作。当
σ
越大,尺度越大,也就是模糊程度越高。
下采样
生成对应的显示缩略图,分辨率是逐渐降低的。这里的下采样因子是2。
具体事例参见下图:
高斯金字塔的构造过程
这里我们先给出构造好的高斯金字塔,并解释其中用到的各种参数。
如图,这个高斯金字塔有5组(octave),每个Octave内又包含若干层。所有我们定义第一个参数 O ,表示高斯金字塔的组数。
σ 我们称为尺度参数,第一组第一层的尺度参数为 σ ,且Lowe认为最优的 σ=1.6 。
且组间尺度关系倍数为2,如第二组的尺度参数是第一组尺度参数的俩倍(同一层的俩倍)。但组内尺度参数是不同的,且有比例关系 σn=kn−1⋅σ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算子。
差分高斯金字塔的公式如下:
简单来说,
高斯金字塔每一组内相邻俩层的图片相减得到差分高斯金字塔。具体见下图。
极值点的检测是在差分高斯金字塔中进行的,Lowe提出每一层极值点是在三维空间中比较获得的,即这个极值点是同相邻俩层和本层周围点共26个点比较得出的,注意这里极值点是备选关键点,后面还要进一步处理,具体如下图:
高斯金字塔和差分高斯金字塔整个过程见下图:
一些解释:因为Lowe原文中对具体实现细节描述甚少,网上的一些资料也都是交代的模模糊糊,比如每层间的尺度的计算,都讲的不清楚,我也只贴出具体关系和已理解的部分。
1、高斯金字塔中每层图片数如何确立?
高斯金字塔每个Octave必须有s+3幅picture。因为极值点检测是在差分高斯金字塔中进行的,即每一层的极值点是必须有相邻俩层比较才能得出。所以差分高斯金字塔每组必须有s+2幅picture,因为差分高斯金字塔是由高斯金字塔相邻俩幅picture减去得来。所以反推得出高斯金字塔中每组有s+3幅picture。作者推荐 s=3 。
2、尺度空间的连续性如何体现?
Lowe设 s=3 ,且有 k=21s ,则第一组中的尺度依次为:
相应的差分高斯金字塔中的尺度为:
极值点只能在差分高斯金字塔的中间三层取得,我们依次写下可以取得极值点的尺度:
我们可以发现这些数据是离散连续的,也就是说通过高斯金字塔描述的尺度空间是连续的,
这样在尺度空间的极值点确定过程中,我们不会漏掉任何一个尺度上的极值点。
3、下一组的第一层图片如何得到?
下一组第一层的图片由上一组倒数第三层下采样得到。由 2 中可知,倒数第三层的尺度为 233σ=2⋅σ ,所以第二组第一层图片的尺度正好是第一组第一层的俩倍。
具体过程也有从Lowe的源码反推的,这里不贴了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181961.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...