理论恒叨立体匹配系列经典AD-Census: 十字交叉域代价聚合(Cross-based Cost Aggregation)

Posted 李迎松~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理论恒叨立体匹配系列经典AD-Census: 十字交叉域代价聚合(Cross-based Cost Aggregation)相关的知识,希望对你有一定的参考价值。

下载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代价聚合分为两步:

  1. 十字交叉域构造( Cross Construction)
  2. 代价聚合(Cost Aggregation)

本文先介绍CBCA的原文1中这两步的思路,再介绍AD-Census论文中的改进版。

CBCA十字交叉域构造

十字的含义是每个像素都会有一个十字臂,臂上的所有像素颜色(亮度)值和该像素的颜色(亮度)值相近。我在一张图像上画几个示意图:

从图中可以看到十字臂构造的两个规则:

  1. 像素的十字臂以像素为中心往左右及上下延伸,碰到颜色(亮度)和该像素差别较大时停止延伸。
  2. 十字臂也不能无限制延伸,它必须限制一个最大长度。

简单来说,颜色和长度是两个限制臂长的因素。

咱们先看CBCA原论文中所描述的一组简单的规则(以左臂的延伸为例):

  1. 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,BIi(pl)Ii(p),即三个分量差值的最大值。
  2. 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)=plp(像素单位)。

右臂、上臂、下臂的延伸规则和左臂一样。

当每个像素的十字臂构造成功,就可以构造像素的支持区域(Support Region),构造方法如下:

像素 p p p 的支持区域是合并其垂直臂上的所有像素的水平臂。

如图所示:

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. 对所有像素,将其竖直臂上的像素在第一步存储的临时值相加,得到该像素最终的聚合代价值。为了让聚合值范围位于一个较小的可控范围内,最终的聚合代价值需要除以支持区的总像素数。

代价聚合示意图:

这两步都可以高度并行,所以此步骤的并行化是很高的。

为了得到更好的结果,上面的代价聚合步骤一般会迭代2 - 4次。

AD-Census十字交叉域构造

AD-Census的十字交叉域构造方法整体来说是和CBCA原文保持一致的,但是会做一些改进。

按照上面原文中的做法,代价聚合的准确性取决于参数 L L L τ τ τ,在一块大的弱纹理区就需要更大的 L L L τ τ τ值从而包含更多存在亮度差异的像素,让结果更加准确稳健一些。但简单的加大 L L L τ τ τ会在黑色像素区域或者视差非连续区域引入更多的噪声。

基于此,AD-Census的改进版规则是:(还是以左臂的延伸为例)

  1. 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
  2. D s ( p l , p ) < L 1 D_s(p_l,p)<L_1 Ds(pl,p)<L1
  3. 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理论恒叨立体匹配系列经典AD-Census: 多步骤视差优化

理论恒叨立体匹配系列经典AD-Census: 扫描线优化(Scanline Optimization)

理论恒叨立体匹配系列经典SGM:视差计算视差优化

理论恒叨立体匹配系列经典SGM:匹配代价计算之Census变换

理论恒叨立体匹配系列经典SGM:代价聚合(Cost Aggregation)

码上实战立体匹配系列经典AD-Census: 十字交叉域代价聚合