下载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: (2)十字交叉域代价聚合
十字交叉域代价聚合(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代价聚合分为两步:
- 十字交叉域构造( Cross Construction)
- 代价聚合(Cost Aggregation)
本文先介绍CBCA的原文1中这两步的思路,再介绍AD-Census论文中的改进版。
CBCA十字交叉域构造
十字的含义是每个像素都会有一个十字臂,臂上的所有像素颜色(亮度)值和该像素的颜色(亮度)值相近。我在一张图像上画几个示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/ba9c51b6326b0280e98f2a4393dcc6dd.png)
从图中可以看到十字臂构造的两个规则:
- 像素的十字臂以像素为中心往左右及上下延伸,碰到颜色(亮度)和该像素差别较大时停止延伸。
- 十字臂也不能无限制延伸,它必须限制一个最大长度。
简单来说,颜色和长度是两个限制臂长的因素。
咱们先看CBCA原论文中所描述的一组简单的规则(以左臂的延伸为例):
- D c ( p l , p ) < τ D_c(p_l,p)<τ Dc(pl,p)<τ。 D c ( p l , p ) D_c(p_l,p) Dc(pl,p)是 p l p_l pl和 p p p的颜色差异, τ τ τ是设定的阈值。颜色差异的定义是 D c ( p l , p ) = m a x i = R , G , B ∣ I i ( p l ) − I i ( p ) ∣ D_c(p_l,p)=max_{i=R,G,B}|I_i(p_l)-I_i(p)| Dc(pl,p)=maxi=R,G,B∣Ii(pl)−Ii(p)∣,即三个分量差值的最大值。
- D s ( p l , p ) < L D_s(p_l,p)<L Ds(pl,p)<L。 D s ( p l , p ) D_s(p_l,p) Ds(pl,p)是 p l p_l pl和 p p p的空间长度, L L L是设定的阈值。空间长度的定义是 D s ( p l , p ) = ∣ p l − p ∣ D_s(p_l,p)=|p_l-p| Ds(pl,p)=∣pl−p∣(像素单位)。
右臂、上臂、下臂的延伸规则和左臂一样。
当每个像素的十字臂构造成功,就可以构造像素的支持区域(Support Region),构造方法如下:
像素 p p p 的支持区域是合并其垂直臂上的所有像素的水平臂。
如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/9ab9c153d782100ed4519dd46f77457f.png)
q q q是 p p p的垂直臂上的某个像素, p p p 的支持区域就是所有 q q q(包括 p p p自身)的水平臂的并集。
CBCA代价聚合
当像素
p
p
p 的支持区域构造好之后,就可以对
p
p
p 进行两步法(Two-Pass)代价聚合:
Pass 1. 对所有像素,将其水平臂上的像素代价值相加,存储为临时值。
Pass 2. 对所有像素,将其竖直臂上的像素在第一步存储的临时值相加,得到该像素最终的聚合代价值。为了让聚合值范围位于一个较小的可控范围内,最终的聚合代价值需要除以支持区的总像素数。
代价聚合示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/43744a7b575b11677bfa55014798b0d5.png)
这两步都可以高度并行,所以此步骤的并行化是很高的。
为了得到更好的结果,上面的代价聚合步骤一般会迭代2 - 4次。
AD-Census十字交叉域构造
AD-Census的十字交叉域构造方法整体来说是和CBCA原文保持一致的,但是会做一些改进。
按照上面原文中的做法,代价聚合的准确性取决于参数 L L L和 τ τ τ,在一块大的弱纹理区就需要更大的 L L L和 τ τ τ值从而包含更多存在亮度差异的像素,让结果更加准确稳健一些。但简单的加大 L L L和 τ τ τ会在黑色像素区域或者视差非连续区域引入更多的噪声。
基于此,AD-Census的改进版规则是:(还是以左臂的延伸为例)
- D c ( p l , p ) < τ 1 D_c(p_l,p)<τ_1 Dc(pl,p)<τ1 a n d and and D c ( p l , p 1 + ( 1 , 0 ) ) < τ 1 D_c(p_l,p_1+(1,0))<τ_1 Dc(pl,p1+(1,0))<τ1
- D s ( p l , p ) < L 1 D_s(p_l,p)<L_1 Ds(pl,p)<L1
- D c ( p l , p ) < τ 2 D_c(p_l,p)<τ_2 Dc(pl,p)<τ2, i f if if L 2 < D s ( p l , p ) < L 1 L_2<D_s(p_l,p)<L_1 L2<Ds(pl,p)<L1
规则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<L_1) L2(L2<L1)时,设定一个更严格的颜色阈值 τ 2 ( τ 2 < τ 1 ) τ_2(τ_2<τ_1) τ2(τ2<τ1),从而确保只有当颜色非常相近时,才会让臂长延长至 L 1 L_1 L1。
修改后的规则,一方面避免臂的延伸穿过边缘像素;另一方面使弱纹理有更长的臂同时又不会让所有像素的臂过长。
AD-Census代价聚合
相比于CBCA原文的代价聚合,AD-Census也做了修改。迭代次数依旧固定为4次,但不同的是,第1次和第3次,聚合的方向和原文保持一样,即Pass 1先存储所有像素水平臂的代价累加值,Pass 2再沿每个像素的竖直臂累加(参看上文);第2次和第4次,方向相反,Pass 1先存储所有像素竖直臂的代价累加值,Pass 2再沿每个像素的水平臂累加。
上面两种方向,像素的可支持区域是不一样的,大家可以自己模拟下相加的步骤,会发现聚合到像素的代价值来源并不一样。通过这样改进,使用到了两种可支持区,作者发现可以显著减少视差非连续区域的匹配错误。
作者做了一组对比实验,分别用CBCA原文中的方法做代价聚合以及用AD-Census的方法做代价聚合,对比结果如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f41689a8f8f89cd3c600353595f68733.png)
原图是这样:
![](https://i-blog.csdnimg.cn/blog_migrate/54cac24d59c1cd2d90c9c23ff32163a0.png)
从结果可以看到,右上角的弱纹理区、下方的视差非连续区,AD-Census的视差结果都得到了明显改善。
本篇代价聚合的内容就介绍到这里,这部分是AD-Census的核心内容,作者对原始的CBCA法进行了改进,使弱纹理区域和视差非连续区域的视差估计更加准确(有实验为证)。
下一篇带给大家的是AD-Census的第三步:扫描线优化(Scanline Optimization)。
博主简介:
Ethan Li 李迎松(知乎:李迎松)
武汉大学 摄影测量与遥感专业博士
主方向立体匹配、三维重建
2019年获测绘科技进步一等奖(省部级)
爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com
个人微信:
欢迎交流!
关注博主不迷路,感谢!
博客主页:https://ethanli.blog.csdn.net
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. ↩︎