当前位置: 代码迷 >> 综合 >> 【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化
  详细解决方案

【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化

热度:50   发布时间:2023-12-21 13:00:52.0

下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census
欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上角star一下!感谢!

AD-Census算法来自于中国学者Xing Mei等在ICCV2011发表的论文《On Building an Accurate Stereo Matching System on Graphics Hardware》1。算法效率高、效果出色,Intel RealSense D400就是基于该算法实现的立体匹配 2

本系列将带大家深入了解AD-Census的理论,希望能够对同学们的立体匹配算法研究有所帮助。

AD-Census是一个将局部算法和半全局算法相结合的算法,它包含四个步骤:1 初始代价计算、2 代价聚合、3 扫描线优化、4 视差优化。本篇的内容是最后一个步骤:多步骤视差优化。

Step 1. AD-Census Cost Initialization
Step 2. Cross-based Cost Aggregation
Step 3. Scanline Optimization
Step 4. Multi-step Disparity Refinement

【理论恒叨】【立体匹配系列】经典AD-Census: (4)多步骤视差优化

    • (1)Outlier Detection离群点检测
    • (2)Iterative Region Voting迭代局部投票
    • (3)Proper Interpolation(找不到合适的词翻译,你们理解就好)
    • (4)Depth Discontinuity Adjustment视差非连续区调整
    • (5)Sub-pixel Enhancement子像素优化

视差优化是基本上是立体匹配必备步骤,各家的立体匹配算法都会带上这一步,主要目的是剔除错误视差、提高视差精度,以及填充视差图。AD-Census当然也不例外,我们来看看它都做了哪些操作。

(1)Outlier Detection离群点检测

Outlier离群点实际上就是误差较大的点,它们的视差值是错的。AD-Census使用一致性检查来做Outlier Detection,一致性检查不必多说,基本没见过哪个立体匹配算法不做它的,可以说是必备良药了。AD-Census的一致性检查和SGM是类似的,参考博文:

【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化
【码上实战】【立体匹配系列】经典SGM:(5)视差优化

一致性检查的同时,也会把无效像素分为遮挡区(occlusion)误匹配区(mismatch),划分的方法和SGM原文一直,参考博文:

【码上实战】【立体匹配系列】经典SGM:(6)视差填充

(2)Iterative Region Voting迭代局部投票

从名字我们可以读到三个信息:(1)迭代表示此步骤要重复执行多次(2)局部表示考虑的是局部范围内的像素(3)投票表示在既定规则内进行统计,数量最多的对象具有优势。

我们看原文中的描述:

对无效像素 p p p 的十字交叉域支持区内的所有可靠像素,统计[0, d m a x d_{max} dmax?]范围视差分布的直方图 H p H_p Hp? (直方图的值相当于视差的得票数)。占有最多像素(也就是得票最多)的视差值记为 d p ? d_p^* dp?? 。可靠像素数量记为 S p S_p Sp? 。如果可靠像素的数量足够多,且得票最多的视差值得票率足够多,则把 d p ? d_p^* dp?? 赋给 p p p 。这里的两个“足够多”,用阈值来控制:

式中, τ s τ_s τs? τ H τ_H τH?为两个预设阈值。

以上操作会重复迭代执行5次,每次迭代成功赋值的像素 p p p 都会被标记为可靠像素,以为下一次迭代提供有效值。

(3)Proper Interpolation(找不到合适的词翻译,你们理解就好)

此步骤其实就是视差填充。在一致性检查中无效视差被区分为遮挡区和误匹配区。首先对无效像素 p p p ,沿其周围16个方向搜索可靠像素视差值(貌似太夸张了些),对于遮挡区像素,则选择所有可靠像素视差值中的最小值,因为遮挡区大概率来自于背景,背景视差往往是较小值;对于误匹配区像素,则选择和 p p p 颜色最近的像素的视差,因为颜色相近的像素往往具有相近的视差值(这里应该是要限制下搜索步长的,太远了假设大概率都失效了)。

作者以实验说明,经过第(2)步和第(3)步,离群点(Outlier)得到很好的剔除,算法的视差错误率得到明显改善。如图所示:

(4)Depth Discontinuity Adjustment视差非连续区调整

这是个新鲜词,在其他论文中比较少见。此步的目的是进一步优化视差非连续区域的视差值。

首先,会对视差图做一个边缘检测,对于边缘上的像素 p p p ,记其视差值为 D ( p ) D(p) D(p) ,记录其左右两边像素 p 1 p_1 p1? p 2 p_2 p2?的视差值 D L ( p 1 ) D_L(p_1) DL?(p1?) D L ( p 2 ) D_L(p_2) DL?(p2?)。如果 D L ( p 1 ) D_L(p_1) DL?(p1?) D L ( p 2 ) D_L(p_2) DL?(p2?)中存在一个视差值赋给像素 p p p 后的匹配代价比 p p p 原先的匹配代价 C 2 ( p , D ( p ) ) C_2(p,D(p)) C2?(p,D(p)) 更小,则把 D ( p ) D(p) D(p)替换成该视差值。

其实就是对边缘上的像素值进行微调,选择左右两边使其代价更小的那个视差值。

作者通过实验表明,该步骤可以明显减少视差非连续区域的视差错误。如图所示:

(5)Sub-pixel Enhancement子像素优化

子像素优化很常规,和SGM一样,来一个一元二次拟合。公式如下:

式中 d = D L ( p ) d=D_L(p) d=DL?(p) d + = d + 1 d_+=d+1 d+?=d+1 d ? = d ? 1 d_-=d-1 d??=d?1。对此步有疑问可以参考博文:

【码上实战】【立体匹配系列】经典SGM:(5)视差优化


至此,AD-Census的理论部分就此完结,贴出一些论文中的实验结果,有不明白的欢迎大家给我留言。后续我会着手编码实现该方法并在我的Github主页中开源,感谢大家的观看,再见!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

博主简介:
Ethan Li 李迎松(知乎:李迎松)
武汉大学 摄影测量与遥感专业博士

主方向立体匹配、三维重建

2019年获测绘科技进步一等奖(省部级)

爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com

个人微信:

欢迎交流!

关注博主不迷路,感谢!
博客主页:https://ethanli.blog.csdn.net


  1. Zhang K , Lu J , Lafruit G . Cross-Based Local Stereo Matching Using Orthogonal Integral Images[J]. IEEE Transactions on Circuits and Systems for Video Technology, 2009, 19(7):1073-1079. ??

  2. Keselman L , Woodfill J I , Grunnet-Jepsen A , et al. Intel? RealSense? Stereoscopic Depth Cameras[C]// 2017 IEEE Conference on Computer Vision and Pattern Recognition Workshops (CVPRW). IEEE, 2017. ??