详解立体匹配系列经典SGM: (6) 视差填充

2020 年 8 月 10 日 计算机视觉life

点击上方“计算机视觉life”,选择“星标”

快速获得最新干货

作者李迎松授权发布,武汉大学 摄影测量与遥感专业 博士

https://ethanli.blog.csdn.net/article/details/105065660

科学是一个精益求精的过程。


详解立体匹配系列经典SGM: (1) 框架与类设计
详解立体匹配系列经典SGM: (2) 代价计算
详解立体匹配系列经典SGM: (3) 代价聚合
详解立体匹配系列经典SGM: (4) 视差计算、视差优化
详解立体匹配系列经典SGM: (5) 视差优化
代码已同步于Github开源项目:
https://github.com/ethan-li-coding/SemiGlobalMatching


抱歉同学们,视差优化的完结篇被我安排成了一个系列篇,实在是SGM太过经典,每一点我都想拿出来单独成篇,作者在视差优化模块的确安排了很多子模块,每个模块都有其存在的意义。上一篇我们学习了怎么做一些常规的视差优化操作:一致性检查、唯一性约束、去除小连通区等。本篇我们来说一说视差填充。
我们再次整理下整个优化的子模块,让大家思路更清晰一些:

  • 1. 子像素拟合(Subpixel)

  • 2. 一致性检查(Left/Right Consistency Check)

  • 3. 唯一性约束(Uniqueness)

  • 4. 剔除小连通区(Remove Peaks)

  • 5. 中值滤波(Median Filter)

  • 6. 弱纹理区优化

  • 7. 填补空洞

本篇我们讲的是第7点。即填补空洞,也就是视差图填充。

先看看本篇最后的实验成果,让大家有个初探的兴趣:

上图一看,大家就明白What is 视差填充了,那我们就进主题吧。

视差填充,即给视差图的无效区域像素分配一个有效值。填充之前要问两个问题:

  • 1. 无效区是否一视同仁?

  • 2. 有效值哪里来?

本文前两个小节就是回答这两个问题。

遮挡区和误匹配区

回答第一个问题,无效区是否一视同仁? 答案是NO!需要区分遮挡区和误匹配区。

遮挡区:由于前景遮挡而在左视图上可见但在右视图上不可见的像素区域。

误匹配区:位于非遮挡区域的错误匹配像素区域。

从定义可以看出,其实两者都是错误匹配像素区域,我们的主要目的是为了把遮挡区拿出来单独成一类,因为遮挡区比较特殊,它们位于视差非连续区域,一侧是前景,视差值较大,一侧是背景,视差值较小,它理应和背景像素视差更为接近,而和前景视差相差较大,所以填补时应该尽量选择周围背景像素的视差,避免选择前景像素。

误匹配区则不同,它们并不在遮挡区,邻域像素都位于一个连续的视差表面,视差是连续的,所以填补时可以考虑邻域内的所有像素。

总之,在填充前,我们要做个判断,哪些像素是遮挡区,哪些像素是误匹配区。

作者是通过如下方法来判断遮挡区的:

(1)像素是通过各种优化操作而判定的无效像素。
(2)左影像像素在右影像上的匹配像素为