理论恒叨立体匹配系列经典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代价聚合分为两步:
- 十字交叉域构造( Cross Construction)
- 代价聚合(Cost Aggregation)
本文先介绍CBCA的原文1中这两步的思路,再介绍AD-Census论文中的改进版。
CBCA十字交叉域构造
十字的含义是每个像素都会有一个十字臂,臂上的所有像素颜色(亮度)值和该像素的颜色(亮度)值相近。我在一张图像上画几个示意图:
从图中可以看到十字臂构造的两个规则:
- 像素的十字臂以像素为中心往左右及上下延伸,碰到颜色(亮度)和该像素差别较大时停止延伸。
- 十字臂也不能无限制延伸,它必须限制一个最大长度。
简单来说,颜色和长度是两个限制臂长的因素。
咱们先看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 的支持区域是合并其垂直臂上的所有像素的水平臂。
如图所示:
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的改进版规则是:(还是以左臂的延伸为例)
- 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理论恒叨立体匹配系列经典AD-Census: 多步骤视差优化
理论恒叨立体匹配系列经典AD-Census: 扫描线优化(Scanline Optimization)
理论恒叨立体匹配系列经典SGM:匹配代价计算之Census变换