双目立体视觉-SGM匹配算法-P1、P2参数影响分析


前言

笔者在之前学习以及应用双目匹配SGM算法时,对于其中代价聚合步骤中惩罚因子P1、P2的作用以及意义一直比较模棱两可,而且相关的详细介绍的博客也不多,opencv对于这个算法的参数设置的原因也没有详细介绍。最近由于项目需要,需要细化每一个参数的详情,所以重新思考了这一问题,今天小有成果,所以记录下来。以下内容为笔者的经验分析并未进行严格的实验证明,如有谬误之处欢迎批评指正。最后,希望笔者的一些看法能给正在学习SGM的朋友一些启发。

一、为什么要进行代价聚合?

要解释P1、P2的意义首先必须要从它产生的目的来研究。我们知道在半全局匹配当中,仅有代价计算的步骤最终视差图是很糟糕的,因为基于局部代价的计算是有风险的,同时WTA又是贪婪算法,极有可能在不是真正的一致像对之间给出一个比真正的一致像对更小的匹配误差,这就使得最终的WTA给出一个错误的视差值。 而且最主要的原因是忽略了物理世界的物体表面的连续性约束,而代价聚合正是为了解决这个问题设计的,我先先来瞧瞧代价聚合的动态规划的公式:

在这里插入图片描述


二、P1、P2是如何起作用的?

我们以单路径,从左至右的代价聚合来分析,其他的聚合方向同理。首先,考虑为什么要用动态规划,其实动态规划在这里主要起到让本阶段的决策只受到上一阶段状态的影响,更具体的讲,就是当你在处理某一个像素,它在进行代价聚合时,只受到该路径方向的上一个像素的状态的影响(状态就是该像素的各个视差对应的匹配代价),这样你在处理当前像素的时候就是在前一个已经处理好的像素(该路径的上一个像素)的基础之上来处理,以此类推从第一个开始传播到最后一个。所以在进行以下分析的时候,大家可以不必盯着整个聚合过程,只需要考虑上一个像素和当前像素即可。 我们从动态规划的公式可以看出来,整个过程就是逐像素的对每一级视差的代价进行调整。调整的大小依赖于上一阶段的代价分布,如下图所示,是张量的某一层(张量横轴为x纵轴为y,垂直x,y轴方向的轴为d),格子中的MIN代表着这一像素的最小的匹配代价(还没有进行代价聚合的代价)。请考虑当前动态规划进行到了格子的第二列的下数第6个格子的情形,在对这个视差下的代价进行调整的时候,你会发现由于相同的视差前一个像素的代价是在它那个像素下的最小的(第一列下数第6个格子)所以经过动态规划公式计算的结果,调整值为0,也就是没有新添加的代价。这就使得这一项更加容易被最终选为最优视差,这也体现出了代价聚合的目的,让相邻的像素的视差值趋于相同,从而符合了物理世界的连续性。本质上就是将前一个像素的代价分布对位的加在了下一个像素的代价分布上,但是为了防止越加越大每一次都减去前一个像素的代价最小值。

在这里插入图片描述

那么P1又起到了怎样的作用呢?首先P1是远小于P2的,从公式可以看出来P1是对上一个像素的d-1和d+1的视差下的代价L施加的惩罚,这里P1是加在了上一个像素的d-1和d+1的L值后面,但是其实P1反而是在影响着当前像素。前面提到了,当前的代价更新实际上就是把上一个像素的代价分布强加在当前像素的代价分布上,但是这样做还远远不够,有时候对于前一个像素的最小代价的周边代价和最小代价没差多少,这就使得仍然不能达到让视差区域一致的目的(也就是让当前像素的最小代价的视差和前一个像素的视差一致)。所以在实际当中调整P1值实际上的实际作用就是:加强视差连续的效果,让视差趋同,同时对于视差非连续区域有一定的影响。那么P2的作用也呼之欲出了,对于离最小代价很远的本身很大的代价的视差呢,由于再加强它的代价也是没有意义的还徒增存储压力,所以干脆直接都附加相同的代价P2。所以P2值的实际作用:控制每一个像素的“附加”视差代价的门限,当代价大到即使最小代价MIN加上P2依然比当前低价要小的时候,直接令它的附加代价为P2。所以P2不易设置的过小,过小使得这个门限太小,使得附加的代价分布不能充分体现其分布特性,从而影响P1的加强连续性的作用形状类似于如下所示,所以P2应该设置的合理,也不应该设置的太大,太大达不到节省内存的作用了。

在这里插入图片描述

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值