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
十字交叉域代价聚合(Cross-Based Cost Aggregation,CBCA)并不是AD-Census的原创,而是来自于Ke Zhang等的论文《Cross-Based Local Stereo Matching Using Orthogonal Integral Images》1 。它基于一个假设:相邻的颜色相近的像素有相近的视差值。如果参与聚合的像素和被聚合的像素具有相同的视差值,那么聚合的可靠性会更高。基于此,CBCA的目标是找到像素 p p p 周围和其颜色相近的像素,并以某种规则将它们的代价值聚合到 p p p 的代价上。
AD-Census代价聚合分为两步:
本文先介绍CBCA的原文1中这两步的思路,再介绍AD-Census论文中的改进版。
十字的含义是每个像素都会有一个十字臂,臂上的所有像素颜色(亮度)值和该像素的颜色(亮度)值相近。我在一张图像上画几个示意图:
从图中可以看到十字臂构造的两个规则:
简单来说,颜色和长度是两个限制臂长的因素。
咱们先看CBCA原论文中所描述的一组简单的规则(以左臂的延伸为例):
右臂、上臂、下臂的延伸规则和左臂一样。
当每个像素的十字臂构造成功,就可以构造像素的支持区域(Support Region),构造方法如下:
像素 p p p 的支持区域是合并其垂直臂上的所有像素的水平臂。
如图所示:
q q q是 p p p的垂直臂上的某个像素, p p p 的支持区域就是所有 q q q(包括 p p p自身)的水平臂的并集。
当像素 p p p 的支持区域构造好之后,就可以对 p p p 进行两步法(Two-Pass)代价聚合:
Pass 1. 对所有像素,将其水平臂上的像素代价值相加,存储为临时值。
Pass 2. 对所有像素,将其竖直臂上的像素在第一步存储的临时值相加,得到该像素最终的聚合代价值。
代价聚合示意图:
这两步都可以高度并行,所以此步骤的并行化是很高的。
为了得到更好的结果,上面的代价聚合步骤一般会迭代2 - 4次。
AD-Census的十字交叉域构造方法整体来说是和CBCA原文保持一致的,但是会做一些改进。
按照上面原文中的做法,代价聚合的准确性取决于参数 L L L和 τ τ τ,在一块大的弱纹理区就需要更大的 L L L和 τ τ τ值从而包含更多存在亮度差异的像素,让结果更加准确稳健一些。但简单的加大 L L L和 τ τ τ会在黑色像素区域或者视差非连续区域引入更多的噪声。
基于此,AD-Census的改进版规则是:(还是以左臂的延伸为例)
规则1相比之前的规则1,不仅限制了 p l p_l pl和 p p p的颜色差异要小于阈值 τ 1 τ_1 τ1,而且限制了 p l p_l pl和它臂上前面一个像素 p l + ( 1 , 0 ) p_l+(1,0) pl+(1,0)的差异要小于阈值 τ 1 τ_1 τ1,这样臂的延伸就不会穿过边缘像素。
规则2个规则3引入更灵活的控制,使用较大的臂长阈值 L 1 L_1 L1使得弱纹理区域能包含更多的像素。而当臂长超过阈值 L 2 ( L 2 < L 1 ) L_2(L_2
修改后的规则,一方面避免臂的延伸穿过边缘像素;另一方面使弱纹理有更长的臂同时又不会让所有像素的臂过长。
相比于CBCA原文的代价聚合,AD-Census也做了修改。迭代次数依旧固定为4次,但不同的是,第1次和第3次,聚合的方向和原文保持一样,即Pass 1先存储所有像素水平臂的代价累加值,Pass 2再沿每个像素的竖直臂累加(参看上文);第2次和第4次,方向相反,Pass 1先存储所有像素竖直臂的代价累加值,Pass 2再沿每个像素的水平臂累加。
上面两种方向,像素的可支持区域是不一样的,大家可以自己模拟下相加的步骤,会发现聚合到像素的代价值来源并不一样。通过这样改进,使用到了两种可支持区,作者发现可以显著减少视差非连续区域的匹配错误。
作者做了一组对比实验,分别用CBCA原文中的方法做代价聚合以及用AD-Census的方法做代价聚合,对比结果如下图所示:
原图是这样:
从结果可以看到,右上角的弱纹理区、下方的视差非连续区,AD-Census的视差结果都得到了明显改善。
本篇代价聚合的内容就介绍到这里,这部分是AD-Census的核心内容,作者对原始的CBCA法进行了改进,使弱纹理区域和视差非连续区域的视差估计更加准确(有实验为证)。
下一篇带给大家的是AD-Census的第三步:扫描线优化(Scanline Optimization)。
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. ↩︎ ↩︎ ↩︎
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. ↩︎