来源:CSDN

作者:dulingwen

01

简介

我们知道,现有立体匹配算法一般被分类为局部算法、全局算法和半全局算法,其中局部算法和半全局算法是应用最为广泛的。在局部算法中,一个最简单的做法就是采用某种像素相似性度量,比如像素灰度差的绝对值AD,给定左图中的一个点p,在右图中的对应行上(假设输入是已经校正好的图像)搜索与其AD值最小的点q,这样得到的点q就是p在右图中对应的匹配点,p、q的水平坐标差称作视差。然而这种做法所得到的视差图中会包含大量的噪声,即错误的匹配对,原因可能是多方面的,如传感器噪声,左右相机的采集性能差异,图像中存在大面积无纹理、弱纹理或重复纹理,左右相机接收的光照差异(室外环境)等。
一个更好的做法是不直接匹配单个像素,而是匹配像素点所在的区域,这个区域叫做支撑窗口(support window),支撑窗口的尺寸可以是固定的,也可以是自适应变化的。如下式所示,由于支撑窗口内的像素提供了更多的信息,因此可以有效降低匹配歧义。

然而使用支撑窗口的做法是存在问题的,实际上它隐性的遵从了一个假定,即窗口内的所有像素具有相同的视差。然而这个假定在很多情况下并不成立,比如:
A. 窗口内的像素与中心像素位于不同的表面;
B. 窗口所捕获的是一个倾斜表面或曲面,即非平行表面(这个平行指的应该是与相机成像平面平行)。
如下图(a)所示,Q点实际上位于一个亚像素的视差平面上,R位于倾斜平面上,S位于一个弧形表面上:

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

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

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

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

基于上面的想法,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不仅可以直接估计亚像素视差, 还能够精确的重建倾斜表面,甚至能够重建圆形的曲面。

02

算法

1.模型

  算法的目标是计算每一个像素所在的视差平面,一旦得到了,该像素的视差就可以按照下式来计算,其中是平面的参数,是像素坐标和坐标。

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

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

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

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

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

2.基于patch match的视差推理

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

2.1随机初始化

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

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

f

2.2迭代

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

2.2.1空间传播(spatial propogation)

空间传播的思想基础是在位置上相邻的像素一般具有相近的视差。设当前像素的视差平面为其邻域像素的视差平面为,若,则将像素的视差平面赋予像素,在偶数次迭代中,的左侧和上侧的像素,在奇数次迭代中,的右侧和下侧的像素。

2.2.2视图传播(view propogation)

视图传播的思想基础是左(右)图中的像素点与右(左)图中的对应匹配点应当具有相同的视差平面。设左(右)图像素的视差平面为其在右(左)图中的对应像素的视差平面为,若,则将像素的视差平面赋予像素

2.2.3帧间传播(temporal propogation)

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

2.2.4平面细化(plane refinement)

平面细化的目的是通过更新像素的视差平面进一步降低匹配代价。由于平面可以由一个点和一个法向量表示,所以平面的更新可以通过点坐标和法向量的更新来得到。设的最大允许变化量为的最大允许变化量为,然后从中随机选择一项数值来计算,从随机选择三项数值来计算法向量式中用于将向量归一化为单位向量,这样就得到了一个新的平面,若,则将视差平面赋予像素,即

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

3.后处理

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

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

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

03

代码实现

代码地址:https://github.com/fightingcf/patchmatchstereo

04

实验

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


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.

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

双目立体匹配算法:Patch Match Stereo实用详解教程相关推荐

  1. 双目立体匹配算法漫谈

    双目立体匹配算法漫谈 双目立体匹配算法漫谈 前提 一些基本假设 框架 matching cost computation cost (support) aggregation;代价聚合 双目立体匹配算 ...

  2. c语言中index函数,MATCH+INDEX函数详解

    原标题:MATCH+INDEX函数详解 小伙伴们好啊,今天和大家分享一个数据查询的最佳搭档--INDEX函数和MATCH函数.这两个函数组合,能够完成VLOOKUP函数和HLOOKUP函数的全部查找功 ...

  3. java8中的lambda表达式实用详解

    java8中的lambda表达式实用详解 1. lambda简介 ​ Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中 ...

  4. book mac pro怎么重装系统_如何在Macbook Pro上安装三系统详解教程?

    苹果笔记本一直深受用户青睐,对于MacBook Pro是2006年发行的笔记本,相信还有很多用户还在使用该款笔记本吧.至于MacBook Pro系统的安装,可能还有很多伙伴都不会吧?不会没关系,下面小 ...

  5. mac linux win三系统安装教程,macbookpro上安装三系统详解教程(macosxwindowslinuxubuntu).doc...

    macbookpro上安装三系统详解教程(macosxwindowslinuxubuntu) macbook pro上安装三系统详解教程(mac os x+windows+linux ubuntu) ...

  6. 多图详解教程:Eclipse 3.6连接Tomcat 7

    多图详解教程:最新版本Java环境Eclipse 3.6连接最新版本开源Web服务器Tomcat 7.假如我们想将Java 的项目自己配环境浏览的话可以来看一下本文. 本文总共分为3大步分别为配置JR ...

  7. PE文件详解(教程1-7)

    PE文件详解(教程1-7) ========================================= PE教程1: PE文件格式一览 PE 的意思就是 Portable Executable ...

  8. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  9. jmeter 导入java,JMeter导入自定义的Jar包的详解教程

    1.简介 原计划这一篇是介绍前置处理器的基础知识的,结果由于许多小伙伴或者童鞋们在微信和博客园的短消息中留言问如何引入自己定义的Jar包呢???我一一回复告诉他们和引入插件的Jar包一样的道理,一通百 ...

最新文章

  1. 更新不了_一个作者在起点中文网写小说,半年更新38万字,还是没签约成功
  2. mongodb windwos 安装(转)
  3. I am the load of my word
  4. C语言矩阵M*N节省空间的算法(附完整源码)
  5. mybatis学习(16):不使用接口的方式
  6. 【Python3练习题 019】 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。...
  7. [转]webMethods公司简介
  8. python飞机大战源码素材包_python实现飞机大战微信小游戏
  9. 重定向,用户管理,密码管理,权限管理
  10. java设置随机数_java设置随机数教程
  11. Dockerfile文件编写官方文档
  12. Mysql 杀死进程 | 解决Lock wait timeout exceeded
  13. 天正服务器不显示,天正画图的时候图形消失看不见了怎么办?
  14. 达人实测:天玑1000和骁龙765g哪个好-天玑1000和骁龙765g对比跑分
  15. [转]一个IT人才的精彩故事
  16. glassfish java ee_GlassFish 3.1.2发布 开源的JavaEE应用服务器
  17. 在VMware上如何创建虚拟机以及安装Linux操作系统
  18. 代理IP的背后原理简单介绍与python写一个获取代理IP的爬虫
  19. Qt界面切换出现闪烁现象
  20. 为时尚早!2019年或才具备关闭2G网络的条件

热门文章

  1. AGG第十一课 agg::ellipse 渲染椭圆和多边形
  2. 道医秘传,开通奇经八脉法!
  3. webSocket浏览器握手不成功(解决)
  4. 9款精致HTML5/jQuery日历时钟控件源码下载(源码请见百度云) 链接:http://pan.baidu.com/s/1geIXe75 密码:7m4a...
  5. NSWindow添加NSViewController
  6. 猎头出500万年薪挖百度某高T,却被对方拒绝!网友:钱不是最重要的!
  7. 美团一面,看看你能否回答上来?
  8. 缓存穿透与击穿问题解决方案
  9. 基于CAP模型设计企业级真正高可用的分布式锁
  10. 图解TCP/UDP原理!秒懂!