3D视觉之立体匹配(Stereo Matching)

3D视觉之立体匹配(Stereo Matching)

1、概念

立体匹配也称作视差估计(disparity estimation),或者双目深度估计。其输入是一对在同一时刻捕捉到的,经过极线校正的左右图像 I_lI_r 。而它的输出是由参考图像(一般以左图作为参考图像)中每个像素对应的视差值所构成的视差图 d。视差是三维场景中某一点在左右图像中对应点位置的像素级差距。如下图:

如果能够得到视差图d,即可根据公式 z=(b\times f )/ d 获得深度图。

2、背景概念

在具体介绍立体匹配任务前,还要简单介绍一些背景知识。对极几何(epipolar-geometry)。

对极几何是对立体视觉建模的一种方式,或者称之为一种约束,这样才能使得立体匹配问题有一个最优解。立体匹配综述 。

对于不同的立体摄像机模型,视差矢量的结构也有所不同。在平行式立体视觉模型中,由于两摄像机的光轴互相平行,导致左右图像间的对应极线相互平行,且位于相同的图像水平扫描线上。因而视差矢量平行于图像的水平扫描线,此时视差矢量实际上退化为标量,如图所示;在汇聚式视觉模型中,左右图像间的对应极线不再平行,因而视差矢量也就不平行于图像水平扫描线,视差矢量的两分量都不为零,如下图所示。

汇聚式视觉模型
平行式立体视觉模型

对于汇聚型立体视觉模型,我们通常通过极线校正的方式将其转换成平行视觉模型,从而将向量d转换为标量。

3、立体匹配的基本流程

立体匹配可划分为四个步骤:匹配代价计算、代价聚合、视差计算和视差优化参见

原文链接:双目立体匹配算法详解_Gavinmiaoc的博客-CSDN博客_立体匹配

3.1、匹配代价计算

匹配代价计算的目的是衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。

每个像素在搜索同名点之前,往往会指定一个视差搜索范围D(Dmin ~ Dmax),视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。

匹配代价计算的方法有很多,传统的摄影测量中,使用灰度绝对值差(AD,Absolute Differences)1、灰度绝对值差之和(SAD,Sum of Absolute Differences)、归一化相关系数(NCC,Normalized Cross-correlation)等方法来计算两个像素的匹配代价;计算机视觉中,多使用互信息(MI,Mutual Information)法2 3、Census变换(CT,Census Transform)法4 5、Rank变换(RT, Rank Transform)法6 7、BT(Birchfield and Tomasi)法8 等作为匹配代价的计算方法。不同的代价计算算法都有各自的特点,对各类数据的表现也不尽相同,选择合适的匹配代价计算函数是立体匹配中不可忽视的关键步骤。

图1 DSI示意图(C(x,y,d)代表像素(x,y)在视差为d时的匹配代价)

这个过程可以视为对深度估计问题空间的初步建模。因为经过矫正之后的立体图片对,参考图像中的某个像素,其对应像素应该在该像素的平行位置。根据一个深度确定两个像素后,即可以用上述的若干种方法计算匹配代价。

3.2、代价聚合

代价聚合的根本目的是让代价值能够准确的反映像素之间的相关性。上一步匹配代价的计算往往只会考虑局部信息,通过两个像素邻域内一定大小的窗口内的像素信息来计算代价值,这很容易受到影像噪声的影响,而且当影像处于弱纹理或重复纹理区域,这个代价值极有可能无法准确的反映像素之间的相关性,直接表现就是真实同名点的代价值非最小。

而代价聚合则是建立邻接像素之间的联系,以一定的准则,如相邻像素应该具有连续的视差值,来对代价矩阵进行优化,这种优化往往是全局的,每个像素在某个视差下的新代价值都会根据其相邻像素在同一视差值或者附近视差值下的代价值来重新计算,得到新的DSI,用矩阵S来表示。

实际上代价聚合类似于一种视差传播步骤,信噪比高的区域匹配效果好,初始代价能够很好的反映相关性,可以更准确的得到最优视差值,通过代价聚合传播至信噪比低、匹配效果不好的区域,最终使所有影像的代价值都能够准确反映真实相关性。常用的代价聚合方法有扫描线法、动态规划法、SGM算法中的路径聚合法等。

这一过程可以理解为是对第一步建模方法的优化。

图1:代价聚合前后视差图示意图

3.3、Step3 视差计算

视差计算即通过代价聚合之后的代价矩阵S来确定每个像素的最优视差值,通常使用赢家通吃算法(WTA,Winner-Takes-All)来计算,如图2所示,即某个像素的所有视差下的代价值中,选择最小代价值所对应的视差作为最优视差。这一步非常简单,这意味着聚合代价矩阵S的值必须能够准确的反映像素之间的相关性,也表明上一步代价聚合步骤是立体匹配中极为关键的步骤,直接决定了算法的准确性。

图2 赢家通吃(WTA)算法示意图

3.4、视差优化

视差优化的目的是对上一步得到的视差图进行进一步优化,改善视差图的质量,包括剔除错误视差、适当平滑以及子像素精度优化等步骤,一般采用左右一致性检查(Left-Right Check)算法剔除因为遮挡和噪声而导致的错误视差;采用剔除小连通区域算法来剔除孤立异常点;采用中值滤波(Median Filter)、双边滤波(Bilateral Filter)等平滑算法对视差图进行平滑;另外还有一些有效提高视差图质量的方法如鲁棒平面拟合(Robust Plane Fitting)、亮度一致性约束(Intensity Consistent)、局部一致性约束(Locally Consistent)等也常被使用。

由于WTA算法所得到的视差值是整像素精度,为了获得更高的子像素精度,需要对视差值进行进一步的子像素细化,常用的子像素细化方法是一元二次曲线拟合法,通过最优视差下的代价值以及左右两个视差下的代价值拟合一条一元二次曲线,取二次曲线的极小值点所代表的视差值为子像素视差值。如图3所示。

局部匹配算法的步骤一般包括匹配代价计算、代价聚合和视差计算三个步骤,全局算法则包括匹配代价计算,视差计算与视差优化三个步骤,半全局算法SGM则四个步骤都有。

发布于 2020-07-18 09:46