美文网首页
On Building an Accurate Stereo M

On Building an Accurate Stereo M

作者: OrdinaryW | 来源:发表于2019-11-06 17:34 被阅读0次

    1. 前言

        在了解SGBM算法以后,可能大家都会发现SGBM算法中最不牛逼的关键点,就是对全图用统一尺寸的矩形框来完成代价聚合(矩形框内代价求和)。因此,今天我为大家继续介绍新的,而且很经典的立体匹配算法。该算法来源于以下论文:《On Building an Accurate Stereo Matching System on Graphics Hardware》

    • 算法流程:

      • Step 1. Cost(AD+Census)
      • Step 2. Cross-based Cost Aggregation (手动五角星)
      • Step 3. Scanline Optimization
      • Step 4. Multi-step Disparity Refinement
    • 代价计算:采用AD + Census的代价融合方式,具体见原文。他这样其实是有三个目的:

      • 利用AD保留原图的细节信息,也就是直接利用像素颜色或者灰度信息,可以理解为颜色空间相似度
      • 利用Census保留原图的局部结构信息,可以理解为距离/结构空间相似度
      • 利用鲁棒性函数处理代价值,可以进一步降低代价噪声,方便两种不同量级的代价融合
    AD+Census
    鲁棒性函数

    可以想象一下,图像上能用到的信息(颜色和结构),都用了一下。但是这里还是想简单对比一下ADCensus 和 SGBM的Cost有什么不一样呢,我们以最简单的 CostComputation + WTA来对比,对比结果如下:


    Cost vs

        可以看出,两种Cost的结果还是有差别的,ADCensus的细节和结构保护的好,但是白色噪声也是非常的多,SGBM的Cost虽然细节没有那么好,但是噪声算是较少的。都有优缺点。看你如何选择。

    2. Cost Aggregation

    只要大家阅读立体匹配算法论文就应该知道,代价聚合绝对不止CBCA一种,特别是从高质量聚合方面讲。例如:

        但是他们的耗时也是你肯定的。具体可以在具体来说,就是很难将其普及并转化为科技生产力(高性能运算平台除外)。如果他只能停留在高性能运算平台,或者实验室里面。那么他的社会价值肯定是会打折扣的,只能依靠硬件平台性能的不断提升和优化。所以如何才能做到快速高效的代价聚合呢,CBCA就这样诞生了。最先提出CBCA的论文是:Cross-Based Local Stereo Matching Using Orthogonal Integral Images

    那么CBCA的主要好处有以下几点:

    • 将规则Constant Square Region,变为多边形代价聚合方式,更符合实际场景分布
    • 相对于Adaptive Weight Aggregation,计算量小
    • CBCA使用的Local Support Region,可以在后处理或其他阶段复用,这个很不错
    CBCA

        所以大家也可看出来了,CBCA在对不同像素进行Local Support Region计算的时候,有点像图像分割/区域生长的快速版本。毕竟,真实的图像分割算法还是很耗时的,特别是包含复杂数学公司的算法。那么他又是怎么做到图像分割并降低计算量的呢?通过上面的图,大家应该也能看出一点逻辑,下面就详细解释一下。其实CBCA应该是分Local Support Region计算和Aggregation两个部分,每个部分又分两个步骤,总计4个步骤。

    • Step1:对全图像素建立Upright Cross(十字架),规则见原文
    • Step2:计算像素点P的Local Support Region,先把十字架分为水平方向和竖直方向,固定竖直方向不动,只需要统计竖直区域上的像素点的水平方向范围就可以得到P点的Local Support Region。先固定水平方向,再统计水平方向各点的竖直方向范围也是一样的。类似下面这样:
    计算Local Support Region
    • Step3:Local Support Region水平方向聚合至同一竖直方向
    • Step4:Local Support Region竖直方向完成聚合
    CostAggregation

    3. Scanline Optimization

        扫描先优化部分,这里直接引用作者原文说的:“We employ a multi-direction scanline optimizer based on Hirschm¨uller’s semi-global matching method”。论文中采用了4方向的SGM,单方向的SGM公式如下:


    单方向SGM聚合

    同时,通过左右图邻域像素颜色差D1和D2分别对P1和P2两个参数分成四种情况约束:


    根据邻域颜色信息对P1和P2约束
    最后对四个方向的代价聚合值求平均:
    代价聚合平均

    这部分内容,如果大家看过我之前写的SGBM算法详解,应该比较熟悉,不过多介绍。

    4. Multi-step Disparity Refinement

        这部分主要是指视差图后处理,包括Outlier Detection、Iterative Region Voting、Proper Interpolation、Depth Discontinuity Adjustment、Sub-pixel Enhancement。

    • Outliers Detection
      其实就是左右一致性检测(Left-Right Check),主要目的是检测遮挡区域。
    • Iterative Region Voting
      主要是针对上一个步骤产生的遮挡区域,因为遮挡区域本身就没有视差,所以前面的步骤得到的视差肯定是错误的,现在要通过Iterative Region Voting的方式,对每个遮挡像素计算新的视差值。Iterative Region Voting需要用到CBCA过程中计算的Local Support Region,在该区域内选择出现次数最多的视差值作为遮挡像素的视差值。因为是Iterative,所以论文中给的是重复5次这样的操作。因为,根据Local Support Region 给遮挡区域赋值的时候,也是有约束条件的,比如该区域类遮挡像素太多,或者该区域某视差为最高频率视差,但频率仍然小于指定频率,那么这样的赋值是无效的,因此会通过多次迭代的方式,尽可能的对遮挡区域填充可靠的视差值。也就是下面两个约束条件:


      Iterative Region Voting
    • Proper Interpolation
      我们刚才说了,Iterative Region Voting是要在满足条件的情况下,才能赋值的,那么剩下的Outliers怎么办呢,就要用到下一个步骤Proper Interpolation。Proper Interpolation就是利用邻域颜色信息约束的16方向插值,比较简单,不赘述。
    • Depth Discontinuity Adjustment
      假设上面步骤完成了错误视差的检测和正确视差值填充,那么接下来就到了视差边缘精修的部分,也就是Depth Discontinuity Adjustment 。这个部分主要是以视差图为主,假如某像素点刚好在边缘上(视差图的边缘),那么论文中就直接对比该像素点左右两个像素的代价值,用代价值较小的那个像素点的视差来代替当前视差。对,就是这么简单粗暴。
    • Sub-pixel Enhancement
      完成上述操作以后,就只剩下最后一步了。我们都知道,我们的真实场景时连续表面,而这里只是用了离散的数字来模拟深度,特别是对于斜坡,平面,是很不友好的,会出现视差断层现象。因此,要进行最后一个步骤:Sub-pixel Enhancement,它的计算公式大家可以直接查看论文,这里就不贴出来了。

    5. 结束语

        立体匹配作为计算机视觉领域的热点研究区域,本次介绍的算法从整个流程来看,算是集各家所长,综合得到一个较好的立体匹配算法,还算比较优秀的。而且现在基本是CV + NN都有研究,而且NN的趋势愈演愈烈,但是CV算法也有他的经典之处,不管哪个方向,代码计算和优化重要,但是视差Refine的步骤也很重要,主要看大家的用途是什么,需要大家去多读多想多写代码,慢慢体会。
        好了,今天的内容就分享到这里啦,如果大家有什么问题,可以直接在评论区评论,或者有什么新的论文想交流和了解的,也可以在评论区写出论文名字,大家一起交流学习。
      PS:本文所述论文在github上面是有源码的,大家可以边看论文边看代码,快速学习。

    相关文章

      网友评论

          本文标题:On Building an Accurate Stereo M

          本文链接:https://www.haomeiwen.com/subject/zyiebctx.html