双目立体匹配步骤
1、匹配代价计算
匹配代价是用来衡量候选像素与匹配像素之间的相关性的,代价越小,说明两个像素点之间的相关性越大,是同名点的概率也越大。
所谓同名点,就是左右两幅图像中相对应的点,如下图中红框框起来的点就是同名点。
需要注意的是两幅图中两个像素无论是否是同名点,都是可以进行代价匹配的,无非就是不是同名点的两个像素代价高。也正是这样,之后会遍历搜索相关像素点,计算其代价值后寻找一个代价最小的像素点作为同名点。
其实,在每个像素搜索同名点之前,都会指定一个视差的搜索范围 ,视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。
注意上文红色标注的字,矩阵C是用来存储匹配代价的,其是在视差范围D类进行搜索的,然后把每个像素(每个像素坐标记为(x,y))在各个视差(d)下的匹配代价存储起来。这样可以很清楚的看出矩阵C是一个三维矩阵,结合下图进一步理解。
讲到这里,是不是有一个疑问?这个匹配代价是怎么计算的呢?其实匹配代价的计算有很多种,传统方法中有AD(灰度绝对值差)、NCC(归一化相关系数)等等;在计算机视觉中有CT(Census变换)、MI(互信息法)等等。这些不同的匹配代价计算方法都有着各自的优势和劣势,对不同的数据表现出的效果也不一样,因此,我们在进行立体匹配中选择合适的匹配代价计算方法是非常关键的。
匹配代价计算方法见如下文章:匹配代价计算
2、代价聚合
上文说到匹配代价是用来衡量候选像素与匹配像素之间的相关性的,匹配代价往往是通过两个像素邻域内一定大小窗口的像素来计算,这样计算只考虑了局部信息,很容易受到噪声等因素影响,这样就会导致真实的同名点代价值不是最小,也就错误的找到了同名点。这和代价聚合有什么关系呢?可能你已经猜出了一些,代价聚合的根本目的就是让代价值能够准确的反应像素之间的相关性,说白了,就是让匹配代价计算的效果更好。我们可以通过下面的一组图片直观的感受一下使用代价聚合对图片效果的影响。
可以看出使用了代价聚合后效果还是很明显的,聚合后的图像明显更加接近标准图像(Ground Truth)。
代价聚合其实是建立邻接像素之间的联系,以一定的准则,如相邻像素应该具有连续的视差值,来对代价矩阵进行优化,这种优化往往是全局的,每个像素在某个视差下的新代价值都会根据其相邻像素在同一视差值或者附近视差值下的代价值来重新计算,得到新的DSI,用矩阵S来表示。(矩阵S和矩阵C维度是一致的)
上文红字标注的连续的视差值该怎么理解,下面谈谈视差连续与视差非连续,视差连续代表局部范围内的像素的视差相差很小(1个像素内),是一个连续的变化趋势;而非连续是指局部范围内的像素视差相差很大(超过1个像素),是一个突变的变化趋势。这个局部范围往往是一个矩形的窗口(比如3x3、5x5)。由于视差和深度某种程度上其实是等价的( ,Z为视深度,diff为视差),所以视差连续性背后表达的是空间中目标表面离相机的距离的连续性,如果目标是在连续的表面影像上成像的,则成像范围内视差也是连续的;而如果目标有前景和背景在影像上成像,则前景和背景的交界处,在局部窗口内会是一部分属于前景一部分属于背景,前景和背景离相机的距离就可能相差很大了,视差也会相差很大,即不连续。下面通过下图直观感受一下视差的连续区域与不连续区域。
常用的代价聚合方法有扫描线法、动态规划法、SGM算法中的路径聚合法等。
3、视差计算
视差计算较为简单,它就是通过代价聚合后的矩阵S来确定每个像素的最优视差值,一般采用赢家通吃的算法(WTA)。下图表示某个像素所有视差下的代价值,WTA算法就是选择其中最小的代价所对应的视差作为最优视差。
4、视差优化
通过步骤3的视差计算,可以得到各个像素的视差,即得到一个视差图。视差优化的目的是对步骤3中得到的视差图进行优化,进一步改善视差图的质量,一般采用左右一致性检查算法剔除因为遮挡和噪声而导致的错误视差;采用剔除小连通区域算法来剔除孤立异常点;采用中值滤波、双边滤波等平滑算法对视差图进行平滑;另外还有一些有效提高视差图质量的方法如鲁棒平面拟合、亮度一致性约束、局部一致性约束等也常被使用。
5、小结
上述的四个步骤并不是所有算法都要用上,局部匹配算法的步骤一般包括匹配代价计算、代价聚合和视差计算三个步骤,全局算法则包括匹配代价计算,视差计算与视差优化三个步骤,半全局算法SGM(Semi-Global Matching)则四个步骤都有。
- 点赞
- 收藏
- 关注作者
评论(0)