本文主要是介绍【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
理论恒叨系列
【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化
【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示。聚合后的新的代价值保存在与匹配代价空间 C C C同样大小的聚合代价空间 S S S中,且元素位置一一对应。
图1:代价聚合前后视差图示意图
为了获得较好的匹配效果,SGM算法依旧采用全局立体匹配算法的思路,即全局能量最优化策略,简单来说就是寻找每个像素的最优视差使得整张影像的全局能量函数最小。全局能量函数的定义如公式1所示:
式1 全局能量函数的定义式
其中, E d a t a E_{data} Edata为数据项,是反应视差图对应的总体匹配代价的测度; E s m o o t h E_{smooth} Esmooth是平滑项,为了让视差图满足某些条件假设的约束,如场景表面的连续性假设,平滑项会对相邻像素视差变化超过一定像素的情况进行惩罚(惩罚一般就是加大能量值)。
解释下视差连续与视差非连续,视差连续代表局部范围内的像素的视差相差很小(1个像素内),是一个连续的变化趋势;而非连续是指局部范围内的像素视差相差很大(超过1个像素),是一个突变的变化趋势。这个局部范围往往是一个矩形的窗口(比如3x3、5x5)。由于视差和深度某种程度上其实是等价的(视差和深度的关系可以查看博客双目立体匹配中的核线约束[极线约束]),所以视差连续性背后表达的是空间中目标表面离相机的距离的连续性,如果是目标是连续的表面在影像上成像,则成像范围内视差也是连续的;而如果目标有前景和背景在影像上成像,则前景和背景的交界处,在局部窗口内会是一部分属于前景一部分属于背景,前景和背景离相机的距离就可能相差很大了,视差也会相差很大,即不连续。
图2 视差连续区域与非连续区域示意图
能量函数最小化是一个二维最优问题,这是一个NP完全问题,有很多近似的较为高效的能量最优策略如图割、置信度传播、合作优化等算法被用来解决这个问题,但是效率上依旧需要进一步改进。为了更高效的解决这个二维最优化问题,SGM算法采用基于类似于扫描线或者叫单方向动态规划的方法,使用一维路径聚合的方式来近似二维最优,相比其他解决方法效率更高,效果相当。
首先,SGM提出的更具体化的能量函数如公式2所示:
式2 SGM能量函数表达式
其中, C C C为匹配代价,公式的第一项是数据项,表示当视差图为 D D D时,所有像素的匹配代价的累加,第二项和第三项是平滑项,表示对像素 p p p的 N p N_p Np邻域内的所有像素 q q q进行惩罚,其中第二项惩罚力度较小( P 1 P_{1} P1较小),对相邻像素视差变化很小的情况(1个像素)进行惩罚;第三项惩罚力度较大( P 2 > P 1 P_2> P_1 P2>P1),对相邻像素视差变化很大(大于1个像素)的情况进行惩罚。较小的惩罚项可以让算法能够适应视差变化小的情形,如倾斜的平面或者连续的曲面,较大的惩罚项可以让算法正确处理视差非连续情况,由于影像的亮度边缘位置(也就是梯度较大的位置)是前景背景交界的可能性较大,这些位置的像素邻域内往往不是视差连续的,相差较大,为了保护真实场景中的视差非连续情况, P 2 P_2 P2往往是根据相邻像素的灰度差来动态调整,如公式3所示:
式3 P2的调整式
P 2 ′ P_2' P2′为 P 2 P_2 P2的初始值,一般设置为远大于 P 1 P_1 P1的数。这个公式的含义是:如果像素和它的邻域像素亮度差很大,那么该像素很可能是位于视差非连续区域,则一定程度上允许其和邻域像素的视差差值超过1个像素,对于超过1个像素的惩罚力度就适当减小一点。
实际上,式2中的能量函数最优化问题依旧是一个NP完全问题,为高效的解决它,SGM提出一种路径代价聚合的思路,即将像素所有视差下的匹配代价进行像素周围所有路径上的一维聚合得到路径下的路径代价值,然后将所有路径代价值相加得到该像素聚合后的匹配代价值。像素 p p p沿着某条路径 r r r的路径代价计算方法如式4所示:
式4 像素p沿着某条路径r的路径代价计算公式
其中,第一项为匹配代价值 C C C,属于数据项;第二项是平滑项,表示的是和式2相同的含义,累加到路径代价上的值取不做惩罚、做 P 1 P_1 P1惩罚和做 P 2 P_2 P2惩罚三种情况中代价最小的值;第三项是为了保证新的路径代价值 L r L_r Lr不超过一定数值上限,即
式5
像素的总路径代价值 S S S则通过公式6计算,
式6 总路径代价值S计算公式
路径聚合的示意图如图3所示:
图3 路径聚合示意图
从图3中可以看到,根据路径数不同,聚合的方向也有所不同,一般来说,有4路径(红色箭头方向)、8路径(红色+黑色箭头方向)和16路径(白色箭头方向)三种聚合方式,路径数越多效果越好,但是耗时也会越长,往往需要平衡利弊,根据应用的实际要求来选择合适的路径数。
从公式5及6以及路径数不超过16可以很容易推导出 S ≤ 16 ( C m a x + P 2 ) S≤16(C_{max}+P2) S≤16(Cmax+P2),这个不等式很重要,它表明选择合适的 P 2 P_2 P2值可以将聚合代价值 S S S控制在一定数值范围内,减少聚合代价数组对内存的占用。如采用基于5×5窗口的Census变换的方法计算得到的匹配代价值 C C C最高不超过25(因为Census变换后的比特串最大有效长度为25),则匹配代价只需用一个字节来存储,而当 P 2 ≤ 65535 / 16 − 25 P_2 ≤ 65535/16-25 P2≤65535/16−25时, S S S可以只用两个字节来存储,因为存储代价的 C C C和 S S S空间大小是 W × H × D W×H×D W×H×D,当影像尺寸较大时,对内存的占用是巨大的,所以减少元素存储所需要的字节数是必要的。
路径代价聚合的理论是基于动态规划的近似最优化求解问题,把当前像素的最优解问题分解成N个方向的子问题最优解,求和是为了让每个方向都有贡献,其实也可以加权求和,为每个方向设定一个权值。如果你确定某几个方向对当前像素确定无帮助反而起反作用,那也可以把这些方向删去。理想情况是所有子问题都确定能对总问题有所联系和贡献,而直接所有方向求和是一种通用做法,也是容易实现的,理论上不一定是最严密合理的,但本就是近似求解,也不需要完全严密的理论。
图4 SGM聚合步骤示意图(视差图呈现,点击看大图)
码上教学系列
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(2)代价计算
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(5)视差优化
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(6)视差填充
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化
完整代码已发布于Github开源项目:Github/SemiGlobalMatching,欢迎免费下载
博主简介:
Ethan Li 李迎松
武汉大学 摄影测量与遥感专业博士
主方向立体匹配、三维重建
2019年获测绘科技进步一等奖(省部级)
爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com
个人微信:
欢迎交流!
喜欢博主的文章不妨关注一下博主的博客,感谢!
博客主页:https://blog.csdn.net/rs_lys
这篇关于【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!