文章目录
- 前言
- 一、AD-census是什么?
- 1.代价计算
- 2.代价聚合
- 3.视差优化
- 4.视差后处理
- 二、基于python的AD-census立体匹配算法实现
前言
AD-Census算法来自于中国学者Xing Mei等在ICCV2011发表的论文《On Building an Accurate Stereo Matching System on Graphics Hardware》,其主要优点是有效兼顾并行速度和精度两点。
原文链接:On Building an Accurate Stereo Matching System on Graphics Hardware
参考文章:
《On Building an Accurate Stereo Matching System on Graphics Hardware》
双目立体匹配算法:ADCensus概述
论文阅读《On Building an Accurate Stereo Matching System on Graphics Hardware》(AD Census-双目立体匹配)
一、AD-census是什么?
AD-Census是一个将局部算法和半全局算法相结合的算法,它包含四个步骤:代价计算(cost initialization):绝对差AD+Census变换算法、代价聚合(cost aggregation):动态十字交叉域、视差优化(disparity computation):扫描线视差优化、后处理(refinement):多步后处理操作。
1.代价计算
AD-Census代价计算结合了AD法和Census法(关于AD和census代价计算的方法大家可以参考李博的文章【理论恒叨】【立体匹配系列】经典AD-Census: (1)代价计算)AD法在重复纹理区域比Census法表现更好,Census法在弱纹理区域比AD法表现更好,而AD-Census法在两种场景下都是表现最好的。如下为AD-census的代价计算公式,两个算法的结果尺度并不一样,AD的结果是亮度差,范围是[0,255],而Census是比特串对应位值不相同的个数,范围为[0,N](N等于比特串的位数,一般是32位或者64位)。因此,需要通过归一化,将两者的结果归一化到相同的范围区间。
2.代价聚合
AD-Census采用改进的十字交叉域构造进行代价聚合,基于颜色相似度和空间接近度对每个像素计算十字臂的长度,为了在无纹理区域和深度不连续区域获得更好的结果。在交叉构建步骤之后,像素 p 的窗口区域通过合并位于 p 垂直臂(例如 q)上的所有像素的水平臂来建模。获得十字交叉域后,进行代价聚合,原始的聚合策略是第一遍横向汇总匹配成本并存储中间结果; 然后第二遍垂直聚合中间结果以获得最终成本,这个过程迭代2-4次。改进的聚合策略是第一次和第三次先水平聚合,再垂直聚合,第二次和第四次,先垂直聚合再水平聚合,两种聚合方式的十字交叉区域不一样,这样能够提高大的无纹理区域和深度不连续区域的精度。
十字交叉域构建过程中,颜色差异阈值
τ
\tau
τ和最长臂长阈值 L 起着决定性作用,在大的弱纹理区域,需要使用更大的 L和
τ
\tau
τ值来得到邻域中更多的信息的像素,让结果更稳健 ,但简单增大 L 和
τ
\tau
τ会在视差非连续区域带来更多的噪声。基于此,AD-Census改进的规则如下(以左臂延伸为例):改进后的规则可以避免臂的延伸穿过边缘像素,同时使弱纹理有更长的臂同时又不会让所有像素的臂过长。
3.视差优化
AD-Census学习了SGM的代价聚合方式,想要进一步提高代价的准确性,减少匹配错误(在SGM中此步骤称为代价聚合),优化的方向为4个方向,左右上下。这里李博讲的很明白啦。【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)
AD-Census所做的修改在于P1和P2值的设定方式。P1,P2不只是和左视图的相邻像素颜色差D1 = Dc ( p , p − r )
有关,而且和右视图对应同名点的相邻像素颜色差D2 =Dc (pd,pd−r)有关。
4.视差后处理
(1)Outlier Detection离群点检测
离群点检测就是左右一致性检查,将不匹配点分为遮挡区域(occlusion region)和误匹配区域(mismatch region)。
(2)Iterative Region Voting迭代局部投票
(3)Proper Interpolation(视差填充)
对于保留下来的无效像素p,在一定范围内沿周围16个方向搜索最近的可靠像素的视差值:对于遮挡区域像素p,选择所有搜索到的可靠像素的视差中最小的值(因为遮挡像素一般在背景,背景离相机远,也就是视差小)。对于误匹配像素p,在搜索到的可靠像素的集合中选择和p颜色最相近的像素的视差赋值给p。
(4)Depth Discontinuity Adjustment视差非连续区调整
此步的目的是进一步优化视差非连续区域的视差值。首先,会对视差图做一个边缘检测,对于边缘上的像素 p ,记其视差值为D(p),记录其左右两边像素 p1 、p2的视差值DL ( p1 ) 、DL ( p2 ) 。如果DL ( p1 ) 、DL ( p2 )中存在一个视差值赋给像素 p 后的匹配代价比 p pp 原先的匹配代价C2(p,Dp)更小,则把D(p )替换成该视差值。
其实就是对边缘上的像素值进行微调,选择左右两边使其代价更小的那个视差值。
(5)Sub-pixel Enhancement子像素优化
子像素优化用一元二次拟合。
二、基于python的AD-census立体匹配算法实现
参考博主:ADCensus立体匹配算法(Python)的代码
修改如下部分就可以运行啦!
运行结果如下:
大家可以直接根据大佬的GitHub下载,这里就不放链接啦!