在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → opencv2.4.9源码分析——SIFT

opencv2.4.9源码分析——SIFT

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:1.31M
  • 下载次数:3
  • 浏览次数:107
  • 发布时间:2020-06-25
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.zip
  • 所需积分:2
 

实例介绍

【实例简介】
详细介绍SIFT算法,opencv的SIFT源码分析,以及应用实例
SIFT算法进行了改进,通过对两个相邻高斯尺度空间的图像相减,得到个DoG(高斯差分, Difference of gaussians)的响应值图像Dx,y,σ)来近似LoG D(x,y, o)=(G(x,y, ko)-G(x,y,o)O1(x,y)=L(x,y, ko)-L(x,y,a (5) 其中,k为两个相邻尺度空间倍数的常数。 可以证明DoG是对LoG的近似表示,并且用DoG代替LoG并不影响对图像斑点位賀的 检测。而且用DoG近似LoG可以实现下列好处:第一是LoG需要使用两个方向的高斯二阶 微分卷积核,而DoG直接使用晑斯卷积核,省去了卷积核生成的运算量;第二是DoG保留 了个高斯尺度空间的图像,因此在生成某一空间尺度的特征时,可以直接使用公式1(或公 式3)产生的尺度空间图像,而无需重新再次生成该尺度的图像:第三是DoG具有与LoG相 同的性质,即稳定性好、抗干扰能力强。 为了在连续的尺度下检测图像的特征点,需要建立DoG金宇塔,而DoG金宁塔的建立 又离不开髙斯金字塔的建立,如下图所小,左侧为高斯金字塔,右侧为DoG金字塔: (next octave) Scale (first octave) Difference of aussian Gaussian(DOG) 图1高斯金字塔和DoG金字塔 高斯金字塔共分O组( Octave),每组又分S层( Layer)。组内各层图像的分辨率是相 同的,即长和宽相同,但尺度逐渐增加,即越往塔顶图像越模糊。而下·组的图像是由上 组图像按照隔点降采样得到的,即图像的长和宽分别减半。高斯金字塔的组数O是由输入 图像的分辨牽得到的,因为要进行隔点降采样,所以在执行降釆样生成高斯金字塔时,一直 到不能降采样为止,但图像太小又亳无意义,因此具体的公式为: 0=| log2 min(x,y)-2」 (6) 其中,X和Y分别为输入图像的长和宽,L」衣示向下取整。 金字塔的层数S为: (7) LoWe建议s为3。需要注意的是,除了公式7中的第一个字母是大写的S外,后面出现的都 是小写的s 髙斯金字塔的创建是这样的:设输入图像的尺度为0.5,由该图像得到高斯金字塔的第 0组的第0层图像,它的尺度为m,我们称m为基准层尺度,再由第0层得到第1层,它 的尺度为ko,第2层的尺度为k2o,以此类推。这里的k为: (8) 我们以s=3为例,第0组的6(s+3=6)幅图像的尺度分别为: 0,ko0,k2∞,k3o0,k∞o,k5o (9) 写成更一般的公式为: d=or∈[0,,s+2] (10) 第0组构建完成后,再构建第1组。第1组的第0层图像是由第0组的倒数第3层图 像经过隔点采样得到的。由公式10可以得到,第0组的倒数第3层图像的尺度为k∞o,k的 值代入公式8,得到了该层图像的尺度正好为2∞,因此第1组的第0层图像的尺度仍然是 2∞。但由于第1组图像是由第0组图像经隔点降采样得到的,因此相对于第1组图像的分 辨率来说,第θ层图像的尺度为ω,即尺度为2σ是相对于输入图像的分辨率来说的,而尺 度为∞是相对丁该组图像的分辨率来说的。这也就是为什么我们称0为基准层尺度的原因 (它是每组图像的基准层尺度)。第1组其他层图像的生成与第0组的相同。因此可以看出, 第1组各层图像的尺度相对于该组分辨率来说仍然满足公式10。这样做的好处就是编程的 效率会提高,并且也保证∫高斯金字塔尺度空间的连续性。而之所以会出现这样的结果,是 因为在参数选择上同吋满足公式7、公式8以及对上·组倒数第3层图像降釆样这三个条件 的原因。 那么第1组各层图像相对」输入图像来说,它们的尺度为: =2k00 r∈[0,,S-2 该公式与公式10相比较可以看出,第1组各层图像的尺度比第0组相对应层图像的尺 度人了一倍。高斯金字塔的其他组的构建以此类推,不再赘述。下面给出相对于输入图像的 各层图像的尺度公式: o,)=2k∞O∈[0,O-1l,r∈[0,,+2 (12) 其中,O表示组的坐标,r表示层的坐标,a为基准层尺度。k用公式8代入,得: 2 O∈[0,…0-1],r∈[0,…,s+2] (13) 在高斯金字塔中,第0组第∂层的图像是输入图像经髙斯模糊后的结果,模糊后的图像 的高频部分必然会减少,因比为了最大程度的保留原图的信息量,LoWe建议在创建尺度空 间前首先对输入图像的长宽扩展一倍,这样就形成了高斯金字塔的第-1组。设输入图像的尺 度为0.5,那么相对于输入图像,分辨率护人一倍后的尺度应为1,由该图像依次进行高斯 平滑处理得到第-1组的各个层的尺度图像,方法与其他组的一样。由于增加」第-1组,因此 公式13重新写为 (0 ∈[-1,0,…,0-1],r∈[0,…,s+2] (14) DoG金字塔是由高斯金字塔得到的,即高斯金宁塔组内相邻两层图像相减得到DoG金 字塔。如髙斯金字塔的第0组的筼0层和第1层相减得到DoG金字塔的第0组的箅0层图 像,高斯金字塔的第0组的第1层和第2层相减得到υσG金字塔的第θ组的第1层图像 以此类推。需要注意的是,高斯金字塔的组内相邻两层相减,而两组间的各层是不能相减的 因此高斯金字塔每组有s+3层图像,而DoG金宁塔每组则有s+2层图像。 极值点的搜索是在DoG金字塔内进行的,这些极值点就是候选的特征点。 在搜索之前,我们需要在DoG金字塔内剔除那些像素值过小的点,因为这些像素具有 较低的对比度,它们肯定不是稳定的特征点。 极值点的搜索不仅需要在它所在尺度空间图像的邻域内进行,还需要在它的相邻尺度空 间图像内进行,如图2所示。 每个像素在它的尺度图像中一共有8个相邻点,而在它的下一个相邻尺度图像和上 个相邻尺度图像还各有9个相鸰点(图2中绿色标注的像素),也就是说,该点是在3×3×3 的立方体内被包围着,因此该点在DoG金字塔内一共有26个相邻点需要比较,来判断其是 否为极大值或极小值。这里所说的相邻尺度图像指的是在同个组内,因此在DoG金字塔 内,每一个组的第0层和最后一层各只有一个相邻尺度图像,所以在搜索极值点时无需在这 两层尺度图像内进行,从而使极值点的搜索就只在每组的中间s层尺度图像内进行。 搜索的过程是这样的:从每组的第1层开始,以第1层为当前层,对第1层的DoG图 像中的每个点取·个3×3×3的立方体,立方体上下层分别为第0层和第2层。这样,搜索得 到的极值点既有位置坐标(该点所在图像的空间坐标),又有尺度空间坐标(该点所在层的 尺度)。当第1层搜索完成后,再以第2层为当前层,其过程与第1层的搜索类似,以此类 推。 Scale 图2DoG中极值点的搜索 2、特征点的定位 通过上一步,我们得到了极值点,但这些极值点还仅仅是候选的特征点,因为它们还存 在一些不确定的因素。首先是极值点的搜索是在离散空间内进行的,并且这些离散空间还是 经过不断的降采样得到的。如果把采样点拟合成由面后我们会发现,原先的极值点并不是真 正的极值点,也就是离散空间的极值点并不是连续空间的极值点。在这里,我们是需要精确 定位特征点的位置和尺度的,也就是要达到亚像素精度,因此必须进行拟合处。 我们使用泰勒级数展开式作为拟合函数。如上所述,极值点是·个三维矢量,即它包括 极值点所在的尺度,以及它的尺度图像坐标,即=(x,y,o),因此我们需要三维函数的泰 勒级数展开式,设我们在=(x0,y,)处进行泰勒级数展开,则它的矩阵形式为: 6 02f02f02f dxax day dao 02f02f02f axdy ayay ayaallly-yol 2f02f02f Ordo aydo dodo (15) 公式15为舍去高阶项的形式,而它的矢量表示形式为 f(X)=f(X0)+ o¥(X-x0)+7(x-x0) a F(X-Xo (16) 在这里表示离散空间卜的插值中心(在离散空问内也就是采样点)坐标,表示拟 合后连续空间下的插值点坐标,设ⅹ=Ⅹ-Xn,则X表示相对于插值中心,插值后的偏移量。 因此公式16绎过变量变换后,又可写成: f(x)=f(X0)+yX+XT ⅩX 20X2 (17) 对上式求导,得 af (x a 02f0 ox ox+2 ax2+axa 8 0f.02f X axaX2 (18) 让公式17的导数为0,即公式18为0,就可得到极值点下的相对于插值中心的偏移量: aX2 ax (19) 把公式19得到的极值点带入公式17中,就得到了该极值点下的极值 T f(X)=f(X0)+ af 02f10f)a2f/02f-1of 2 8X2 0X/0X28X2dX f(X0)+ H打×1ora2 T a2f-ra2fa2f-1 af 2 dx dx2dx2dx2 dX a f 02f-10f ∫(X0)+ dF×f7a2 2 ax ax2 ax afl f(Xo)+xx+ 2 0X (-X) 18F f(X0)+ 2 aX (20) 对于公式19所求得的偏移量如果大」0.5(只要x、y和σ任意一个量大于0.5),则表 明插值点已偏移到了它的临近的插值中心,所以必须改变当前的位置,使其为它所偏移到的 插值中心处,然后在新的位置上重新进行泰勒级数插值拟合,直到偏移量小于0.5为止(x、 y和σ都小于0.5),这是一个迭代的工程。当然,为了避免无限次的迭代,我们还需要设置 个最人迭代次数,在达到了迭代次数但仍然没有满足偏移量小于0.5的情况下,该极值点 就要被剔除掉。另外,如果由公式20所得到的极值f(X过小,即f(X<0.03时(假设图 像的灰庋值在0-1.0之间),则这样的点易受到噪声的干扰而变得不稳定,所以这些点也应 该剔除。而在 opencv中,使用的是下列公式来判断其是否为不稳定的极值 X S (21) 其中T为经验阈值,系统默认初始化为0.04。 极值点的求取是在DoG尺度图像内进行的,DoG图像的一个特点就是对图像边缘有很 强的响应。一旦特征点落在图像的边缘上,这些点就是不稳定的点。这是因为一方面图像边 缘上的点是很难定位的,只有定位的歧义性;另一方血这样的点很容易受到噪声的干扰而变 得不稳定。因此我们定要把这些点找到并剔除掉。它的方法与 Harris角点检测算法相似, 即一个平坦的DoG响应峰值往往在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向 上有较小的主曲率,主曲率可以通过2×2的 Hessian矩阵求出 H(x,y) Dxx(x,y)Dxy(x,y) Dxv(x,y) Dyy(x,y) (22) 其中D(x,y)、D(x,y)和D(x,y)分别表示对DoG图像中的像素在x轴方向和y轴方向上求 阶偏导和阶混合偏导。在这里,我们不需要求具体的矩阵的两个特征值——a和尸, 而只要知道两个特征值的比例就可以知道该像素点的主曲率 矩阵的直迹和行列式分别为: Tr( )=Dxx+ Dyy=a+B (23) Det( (D3)2=aB (24) 我们首先剔除掉那些行列式为负数的点,即Det()<0,因为如果像素的曲率有不同的 符号,则该点肯定不是特征点。设a>P,并且a=yB,其中y>1,则 Tr(H)2(a+β)2(+β)2(y+1)2 Det(h) 2 (25) 上式的结果只与两个特征值的比例有关,而与具体的特征值无关。我们知道,当某个像 系的矩阵的两个特征值相差越大,即γ很大,则该像素越有可能是边缘。对于公式25, 当两个特征值相等时,等式的值最小,随着γ的增加,等式的值也增加。所以,要想检查主 曲率的比值是否小于某一阈值y,只要检査下式是否成立即可: Tr(H)(y+1) Det(h) (26) 对于不满足上式的极值点就不是特征点,因此应该把它们剔除掉。Lowe给出γ为10 在上面的运算中,需要用到有限差分法求偏导,在这里我们给出具体的公式。为方便起见 我们以图像为例只给出二元函数的实例。与二元函数类似,三元函数的偏导可以很容易的得 到 设f(i,是ν轴为i、x轴为j的图像像素值,则在(j点处的一阶、二阶及二阶混合偏导 af f(i, j+1)-f(i, j 0ff(i+1,j)-f(-1, ax 2h 2h (27) ff(+1)+f(-1)-2f(,j)a2ff(+1,j+f(-1,j)-2f(i,j) h h (28) 2ff(-1,j-1)+f(i+1,j+1)-f(i-1,+1)-f(i+1,-1) dx d (29) 由丁在图像中,相邻像素之问的间隔都是1,所以这里的h 3、方向角度的确定 经过上面两个步骤,一幅图像的特征点就可以完全找到,而且这些特征点是具有尺度不 变性。但为了实现旋转不变性,还需要为特征点分配一个方向角度,也就是需要根据检测到 的特征点所在的高斯尺度图像的局部结构求得一个方向基准。该高斯尺度图像的尺度a是 已知的,并且该尺度是相对于高斯金字塔所在组的基准层的尺度,也就是公式10所表示的 尺度。而所谓局部结构指的是在高斯尺度图像中以特征点为中心,以r为半径的区域内计算 所有像素梯度的幅角和幅值,半径r为 (30) 其中a就是上面提到的相对于所在组的基准层的高斯尺度图像的尺度。 像素梯度的幅值和幅角的计算公式为: m(xy)=√(x+1,y)-L(x-1,y)2+(L(x,y+1),L(x,y-1)2 (31) L(x,y+1)-L(x,y-1) o(x, y)=arctan L(x+1,y)-L(x-1,y) (32) 因为在以〃为半径的区域内的像素梯度幅值对圆心处的特征点的贡献是不同的,因此还 需要对幅值进行加权处理,这里采用的是高斯加权,该高斯函数的方差Cm为: Om=1.50 (33) 其中,公式中的σ也就是公式30中的σ 在完成特征点邻域范围内的梯度计算后,还要应用梯度方向直方图来统计邻域內内像素的 梯度方向所对应的幅值大小。具体的做法是,把360°分为36个柱,则每10°为一个柱,即 0°~9为第1柱,10°~19为第2柱,以此类推。在以r为半径的区域内,把那些梯度方向 在0~9°范围内的像索找出来,把它们的加权后的梯度嘔值相加在一起,作为第1柱的柱 高;求第2柱以及其他柱的高度的方法相同,不再赘述。为了防止某个梯度方向角度因受到 噪声的干扰而突变,我们还需要对梯度方向直方图进行平滑处理。 Opencv2.4.9所使用的平 滑公式为: H()~h(-2)+h(+2)4×(h(-1)+h(+1)),6×h() i=0...15 16 16 16 (34) 其中h和H分别表示平滑前和平滑后的直方图。由于角度是循环的,即0°=360°,如果出现 h(),j超出了(0,…,15)的范围,那么可以通过圆周循环的方法找到它所对应的、在0°~360° 之间的值,如h(-1)-h(15) 这样,直方图的主峰值,即最高的那个柱体所代表的方向就是该特征点处邻域范围内图 像棁度的主方向,也就是该特征点的上方向。由于柱体所代表的角度只是一个范围,如第1 柱的角度为0~9°,因此还需要对离散的梯度方向直方图进行插值拟合处理,以得到更精确 的方向角度值。例如我们凵经得到了第i柱所代表的方向为特征点的主方向,则拟合公式为: H(i-1)-H(i+1) B=i+ =0,…15 2×(H(-1)+H(i+1)-2×H() (35) O=360-10xB (36) 其中,H为由公式34得到的直方图,角度6的单位是度。同样的,公式35和公式36也存 在着公式34所遇到的角度问题,处理的方法同样还是利用角度的圆周循环。 每个特征点除了必须分配一个主方向外,还可能有一个或更多个辅方冋同,增加辅方向的 目的是为了增强图像匹配的鲁棒性。辅方向的定义是,当存在另个柱体高度大于主方向柱 体高度的80%时,则该柱体所代表的方向角度就是该特征点的辅方向。 在第2步中,我们实现∫用两个信息量来表小一个特征点,即位置和尺度。那么经过上 面的计算,我们对特征点的表示形式又增加了个信息量一一方向,即(x,y,o,6)。如果某 个特征点还有一个辅方向,则这个特征点就要用两个值来表示——(x,y,,B1)和(x,y,, 02),其中O1表示主方向,O2表示辅方向,而其他的变量x,y,不变。 4、特征点描述符生成 【实例截图】
【核心代码】

标签:

实例下载地址

opencv2.4.9源码分析——SIFT

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警