必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达65e38d389eab38a2a34bdc3219965324.jpeg

本文对立体匹配算法:Patch Match Stereo实用进行了教程详解。

作者丨3D视觉开发者社区

01

简介

我们知道,现有立体匹配算法一般被分类为局部算法、全局算法和半全局算法,其中局部算法和半全局算法是应用最为广泛。在局部算法中,一个最简单的做法就是采用某种像素相似性度量,比如像素灰度差的绝对值AD,给定左图中的一个点p,在右图中的对应行上(假设输入是已经校正好的图像)搜索与其AD值最小的点q,这样得到的点q就是p在右图中对应的匹配点,p、q的水平坐标差称作视差。然而这种做法所得到的视差图中会包含大量的噪声,即错误的匹配对,原因可能是多方面的,如传感器噪声,左右相机的采集性能差异,图像中存在大面积无纹理、弱纹理或重复纹理,左右相机接收的光照差异(室外环境)等。

一个更好的做法是不直接匹配单个像素,而是匹配像素点所在的区域,这个区域叫做支撑窗口(support window),支撑窗口的尺寸可以是固定的,也可以是自适应变化的。如下式所示,由于支撑窗口内的像素提供了更多的信息,因此可以有效降低匹配歧义。

4ce8b2c7c99956a377b6d0d514b87758.png

然而使用支撑窗口的做法是存在问题的,实际上它隐性的遵从了一个假定,即窗口内的所有像素具有相同的视差。然而这个假定在很多情况下并不成立,比如:

A. 窗口内的像素与中心像素位于不同的表面;
B. 窗口所捕获的是一个倾斜表面或曲面,即非平行表面(这个平行指的应该是与相机成像平面平行)。
如下图(a)所示,Q点实际上位于一个亚像素的视差平面上,R位于倾斜平面上,S位于一个弧形表面上:

‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍539ce3a3e2781e225272b6aa57e16e04.png‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

许多研究人员主要关注的是A中所描述的情况,为了解决这种问题,一个比较有效的做法是对窗口内的像素采用自适应权重进行匹配,如下式所示,这样的方法可以很好的避免edge fattening(边缘平滑)问题:

6a3052f406132eafca3515fff570b02b.png

权重计算所使用的方法可以是类似双边滤波的核函数:

b0cd081488da753cfcecb438a99de7bb.png

也可以是基于测地线距离的核函数:

123ff3dea565ad1bb41e7aaa2d017f31.png

那么如何解决B中的问题呢?我们知道空间中任意一点都可以认为是在一个唯一的平面上,如下式所示,该平面的参数为

27aaaf88fde2655d4950f9920bc3aa1a.png

9c90c9dccdecc2b215879330dceb4f7c.png

基于上面的想法,2011年Michael Bleyer 提出了一个相当新颖的立体匹配算法叫PMS,该算法的主要思想是对每一个像素计算一个独立的最优3D视差空间平面,如果该像素位于一个曲面上,那么该平面代表曲面在该像素点处的切面,在这个基础上,用于匹配的支撑窗口就是not fronto-parallel support window,简称slanted support window。这样一来问题的挑战就转移到了如何为每一个像素点在所有可能的视差空间平面中挑选出最优的视差平面。

显然视差平面的数量是无限多的,因此通过遍历所有的视差平面来寻找最优平面是不可能的。Michael Bleyer 找到了一个巧妙的方法解决这个问题,那就是采用Patch Match的思想,Patch Match本身是一个高效求解近似最近邻场(Nearest neighbor filed)的方法,主要包括初始化、空间传播、随机搜索三个步骤。除了Patch Match中的空间传播外,作者还另外提出了视图传播和帧间传播(用于连续的视频帧)能够更好的帮助算法收敛。如下图所示,利用PMS不仅可以直接估计亚像素视差, 还能够精确的重建倾斜表面,甚至能够重建圆形的曲面。

bc26a85678ac4eded9352c0938c1b912.png

02

算法

1.模型

算法的目标是计算每一个像素所在的视差平面ecb19568cc96d0f81a0818e5f06a2d25.png,一旦得到了78222d0b1c5c086ede0628f4917ce8f8.png,该像素的视差就可以按照下式来计算,其中30d35e7bab3d7f37f2441c40e2f25c2e.png1bfa46dcd247cd53a2eb4b29bb20bf56.png8012db7bc68e442d44399a626cc00513.png是平面8065681c9a73d64cc20bc2284808c75f.png的参数,c901de87a2aa55697b66fa9c40854043.png是像素0ae1056241ed01f0ff5182ed9bef663a.pngb890e5b06fc716f03530ebcf7107d699.png坐标和9bd456e5ddd1a62f8d54537bf3071d7f.png坐标。

d1b1d87801d3f30621974935daefe930.png

待求解的视差平面bbefc64c36adfed6380c5919b41597df.png是在所有可能的平面中使得聚合匹配代价e45552d6644e25d20c3c274b94e81fcc.png最小的那一个平面:

2f244a49092621383a92146815ae2532.png

其中F表示所有视差平面的集合。由于集合内元素的数目是无限的,所以不可能像传统的局部匹配算法那样,通过检查所有的平面来找到聚合代价最小的那一个平面(传统的局部算法是在一个有限的离散视差空间中进行搜索的)。像素8d41715aa9101f4c9d33179b6f42d6cd.png在视差平面961d7bf8c04f8fb599c1037c37a4ccc3.png下的聚合代价是按照下式来计算的:

5e63367ebb2bbf0154fc2758565fdc6b.png

这里4580bea823cd2ac49521315d412c149b.png表示中心位置在p处的矩形窗口。如果应用在视频中,这里的矩形窗口就由2D变成了3D,其中第三维代表前一帧或者后一帧。权重函数5c94ef37c76c5750c797a4ee83a9f622.png采用了自适应权重,目的是为了降低egde-fattenning问题:

1a86580abdb47891ce75cdeb2c9073ac.png

式中95507fab76f56d4dd2376d965fd032c7.png是一个人为指定的参数,080e8e3c487ae76dab8860fe998116b6.png表示像素001198876d9a8a156a934d7584e3da0a.png和像素040dffcf4c584f339c9d1ffca69a39d2.jpeg在RGB颜色空间中的6dc140bc0ce25e382a288084521e3bb5.png距离。当然,你也可以使用其他的权重函数,只要它能提升效果就行。函数71a6d9b30338b7dbab6898e1415607e4.png用来度量待匹配像素对之间的相似性,这里采用的方法是:

dca2ae2a316833852006ae9a566a2273.png

在上式中,dddde1f683e4fc86cd7e76f1f438bbb2.png是通过c2f2cf66467a194ae3d43991df1c8462.png的视差计算出来的,所以286e103b03385cbc203f7d28e7fa2544.png值在一个连续的实数区间内,它的颜色和梯度可以通过近邻像素进行线性插值得到。参数944da83de95014768e00302c315644d0.png用于平衡颜色项和梯度项的比重。截断参数31e332b5a8bc8ccb38180dbe10879653.png6f315c4a09cc0e5e8bfea5a8cb26251c.png可以增强匹配代价在遮挡区域内的鲁棒性。

2.基于patch match的视差推理

有了以上的铺垫,现在最重要的问题就是如何通过最小化匹配代价来为每一个像素找到一个最优的3D视差平面。这个问题可以通过patch match来解决:首先对所有像素的视差平面进行随机初始化或根据某些先验信息进行初始化,然后基于迭代传播(空间传播、视图传播、帧间传播、平面细化)不断地更新所有像素的平面参数。patch match的优点是只要至少有一个像素的初始化视差平面位于或接近最优平面,就可以找到剩余所有像素的最优平面。


2.1随机初始化

patch match的第一步就是对左右视图的视差平面进行随机初始化,原则上是可以直接对平面68d89d66f6404a3c540641f2f92bef4a.png的三个参数a36bc65ae0143d2d0cda78ba0cc58858.png9b3e128a4a5fb53cc9d74cadf618e1e6.png53cbace5275ce533fdfbfd3868c4b50f.png进行随机赋值,但是这样做无法保证在可允许的视差空间中进行均等的采样。因此需要对像素406c870c2c5447e97cef9d5a892cc5e0.png设定一个视差搜索区间69c0a0b597fa459bd38ba516862dc935.png(注意这个区间是连续的),然后从该区间中随机挑选一个视差值3d4f9056ac6f524b226b0dd38e6d731f.png作为该像素的初始视差,这样就得到了视差空间中的一个点eece0ab0ad39b7b7f4cc85a866c317ae.png,有了点P,只要再得到一个单位法向量1177f58a0df6c9f843e25149cd5d997c.png就能计算出平面参数:

22f92cb9e5fb3e7e769e0697b1f42e3c.png

如果想要使用fronto-parallel window,可以将法向量设定为dea6b35be3051b4cd34c4411bf77e2b3.png,如果想关闭亚像素估计,可以将1fc9aec1ce593bcadec5b5a79e26bcde.png限制在离散的整数范围内取值。

f3907320a51e2e95f84cd5c005b194dec.png

2.2迭代

如下图所示,迭代过程中,每一个像素将经历4个阶段:空间传播、视图传播、帧间传播、平面细化,一般先处理左图,然后再处理右图。在偶数次迭代中从左上到右下依次遍历每一个像素,在奇数次迭代中,则顺序相反。

16a0a2827a816ea67a25413f7b447eba.png

2.2.1空间传播(spatial propogation)

空间传播的思想基础是在位置上相邻的像素一般具有相近的视差。设当前像素8c7b7fd04aa0b070b3e003e0fe20736d.png的视差平面为4dbd77585ea318c6570992fc5545a4f2.png其邻域像素518a0ca8cbd45c5443fc3d448f486986.png的视差平面为2bf0f11bee0f511bc8600725ed6c3670.png,若82b5896bc0d09a4cb4727f7eee96e22a.png,则将像素e1cbf0cbb9e9b494e587a47e48e11206.png的视差平面582a58758b504aadf64d066f75de1731.png赋予像素e9f0ab666e31dcafbf4dc888c6a65685.png,在偶数次迭代中,233bcd0c60800f9c7c96c6f1e580db96.png9c659c72607565fc0907b2a61a13e68e.png的左侧和上侧的像素,在奇数次迭代中,f0645adc5b62ec22916e57ee1be82b7f.png445d26782ea23b2c6548ed6b717226f5.png的右侧和下侧的像素。

2.2.2视图传播(view propogation)

视图传播的思想基础是左(右)图中的像素点与右(左)图中的对应匹配点应当具有相同的视差平面。设左(右)图像素02efec0fcfd0238b3fb9d73218b69128.png的视差平面为59e1e94b0ce1fb501ca7e27bc0a3956c.png其在右(左)图中的对应像素6f0449ec549a22a4b0d5b2c908aee67f.png的视差平面为eb9cd5ddd23958810633814b7356d6bb.png,若a68554f69502b669ec34de4ca519be4e.png,则将像素b5bfcde622be5740cc5c919305c54461.png的视差平面f2ad3df9c14bdd672e92b594770a5f64.png赋予像素03804ad90bcd0c8e2fafa85ed7450e20.png

2.2.3帧间传播(temporal propogation)

帧间传播主要用于视频序列中,其思想基础是当前帧的像素8ecaa050996bdd94b6f7fd961b01ee64.png与其相邻帧的像素e9210495d2c9cc47afb2688857c56919.png的坐标相同,那么它们应当拥有相近的视差平面。很明显这个假设在帧率较高的视频中是成立的。设当前帧像素959f021bef8cf3d0d88e0dc8e30a5584.png视差平面为da68c25dd2c77d2686a85f4f20b2d596.png,其前一帧或后一帧的像素74003dd4bcf7d053b2bb8b85ba30f33d.png的视差平面为a9e64d7095a41d9ecceb70905e62b271.png,若b83fc4e689f7b8658b2d1225367e1cb7.png,则将像素5489114fb61233e317572362cc6104fd.png的视差平面赋予像素e323c447baeaa0a2e5667ae1cd5db4ad.png

2.2.4平面细化(plane refinement)

平面细化的目的是通过更新像素472ce9752934a096c1a24d93b06c00b0.png的视差平面8f8fed9d71625816e66997eb10f231e5.png进一步降低匹配代价。由于平面0c63ef8c3e2c16962fcb45e41755db04.png可以由一个点8ac0434cd7d7d15ae1aea8eba52df29a.png和一个法向量1efd848a3bcbe4341807590c38fc8257.png表示,所以平面的更新可以通过点坐标和法向量的更新来得到。设a1dfaa447c524d27ac720024f1cbd610.png的最大允许变化量为38da5b7eaaa173f23d5c3a523e08312f.pnge7f405bce7933614fce5584fb7268ac7.png的最大允许变化量为8fb69fe015c503f37f1d7893a76c1e58.png,然后从abbaaeb2d74934123f429ff8714767cc.png中随机选择一项数值e8a3d06259245b017a0ee48a843b5543.png来计算c6147689f579b92d89c8d57d5dde7c36.png,从51121fbf72e1297a7826aa15429e9ba6.png随机选择三项数值来计算法向量f5f9896cf313e8cd87b37141e4251a7a.png式中029695125c997970973026648d4dd10c.png用于将向量归一化为单位向量,这样就得到了一个新的平面626b1cdad9b838a66fd2451298c94866.png,若ec055282cbc9451ff137e2ba80850b19.png,则将视差平面9f3b3b345f43fa4a7ec6239daf352f54.png赋予像素cfa6c8bc678572fd77473ac51053d1bc.png,即629df7961fe013989f87f1a6da332514.png

这一步需要经过多次迭代才能完成,初始时设定42b7aa72dec3b0f5bc40f9f9d90e56ba.png4784e73ae4dd7b6be322f089c4dc8835.png,然后每次迭代完后,将c07bc2afdb73ccca95840eaad111cf27.png,直到05ab5da6c183d922f6480c1a18aac226.png迭代停止。假如像素当前的视差平面是完全错误的,初次迭代使用较大的搜索范围就有可能将其转移到正确平面附近,之后的迭代中不断的缩小搜索范围,使得视差平面在当前平面附近捕获视差细节,能够适用于弧形表面。

后处理部分首先对左右视差图执行左右一致性检验,在小于设定阈值的情况下该视差点就会被设定为无效点,然后进行填充。填充的方法是搜索无效点左侧最近邻和右侧最近邻的有效像素点,设它们的视差平面分别为8e20414cda1710070f63d84c47f9b407.png7331226d97350a719614ca84caff86a9.png,选择其中视差较小的那一个平面赋给当前无效点。之所以选择小的那一个是因为无效点多为遮挡区域的点,而遮挡区域往往处于背景之中。这样的缺点就是容易导致视差图中产生水平条纹,为了减轻水平条纹,可以对视差做加权中值滤波,滤波核的参数458261dd9d63392fd136648e5edf1285.png与匹配阶段所使用的参数相同。

4.为全局算法构建数据项

全局算法对于遮挡区域和无纹理区域的处理要优于局部算法,所以本文提出的匹配代价还可以应用到全局算法当中,只不过此时将无法在使用连续的视差平面。下图显示了局部算法对于纹理匮乏的图像匹配失败,而全局算法却很好的处理了这种情况。

9d185360aa7960fed23b8b55bcb8d7c7.png

03

代码实现

代码地址:

https://github.com/fightingcf/patchmatchstereo

04

实验

这里选择了MiddleBurry数据集中图像进行实验,效果如下图,可以看到该算法生成的视差图是稠密的,而且边缘保持的非常好,整体视差精度较高。

2cbd865ad2d3ae543e8c73ea967ffb0f.png
14aa08aab76f270fac07441ce8a3e6f3.png
cdd85aaebb33e2254eaadf23805daf0c.png

05

总结

1.PMS算法不同于传统的局部算法,它不是直接估计视差,而是估计视差平面,而且利用patch match思想在无限多的视差平面中来推理出最优视差平面。因此它的两个最大的优点是:(1)能够直接计算亚像素视差;(2)能够处理倾斜表面和曲面,这是其他局部算法所不具备的。

2.PMS算法的性能比较有限,虽然在middleburry上表现的确惊艳,但是在处理室外场景时鲁棒性不是特别好,特别是对于较高的图像噪声、大面积的弱纹理或重复纹理等(当然其他的算法也不能很好的处理),其效果一般弱于SGM和ELAS等算法。


3.PMS算法的速度比较慢,因为它的所有处理流程都是顺序性的,不能并行处理,目前已经有一些算法改进了PMS中的传播方式使其能够并行处理,并应用于GPU,这里给出论文名称《Massively Parallel Multiview Stereopsis by Surface Normal Diffusion》。

参考资料:
1.PatchMatch Stereo - Stereo Matching with Slanted Support Windows,Michael Bleyer, Christoph Rhemann, Carsten Rother.
2.Stereo Matching—State-of-the-Art and Research Challeng,Michael Bleyer, Christian Breiteneder.
3.Massively Parallel Multiview Stereopsis by Surface Normal Diffusion, Silvano Galliani, Katrin Lasinger, Konrad Schindler.

本文只做学术分享,如有侵权,联系删除

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

 
 

889fb6c381bb4bb452b92e80dbf7d673.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值