一枝独秀不是春

理论恒叨系列

【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计
【理论恒叨】【立体匹配系列】经典PatchMatch: (3)后处理(一致性检查与视差填充)

PatchMatchStereo1是Michael Bleyer等在2011年发表于British Machine Vision Conference(BMVC)上的一篇双目立体匹配算法文章,非常经典,倾斜支持窗的思路打破传统固定窗口式局部匹配的思维桎梏,在Middlebury数据集上获得非常好的匹配效果,一段时间内高居排行榜第一名。更难能可贵的是,它和SGM一样数据泛化能力出色,对大部分数据都能取得不错的结果,所以也被很多商业软件所实现,是真正能够产品化的算法。

本系列博主将为大家介绍经典的PatchMatchStereo算法原理,希望能够对同学们的立体匹配算法研究有所帮助。

本篇的内容是算法的核心模型:倾斜支持窗模型Slanted support windows

【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型

  • 倾斜支持窗Slanted support windows
    • Fronto-parallel windows
    • Slanted support windows
  • Slanted support windows模型

倾斜支持窗Slanted support windows

在介绍倾斜支持窗(Slanted support windows)之前,非常有必要介绍下另一种窗模型:Fronto-parallel windows。

Fronto-parallel windows

Fronto-parallel windows是非常经典的窗口模型,它的含义是立体相机正前方与极线纠正后的像平面平行的窗口,同时也和纠正后每个相机的相机坐标系Z轴垂直。该窗口的特性是:

  • 窗口内的任意线段在左右图像(核线像对)上的投影长度相等。
  • 窗口内的所有空间点的深度一样,由D=bf/dD = bf/dD=bf/d可知空间点在影像上的投影点视差也相同。

这两个特性对矩形窗口匹配来说是非常友好的,使得左右图像以某同名点对为中心的窗口内的所有像素都能一一同名对应,窗口内所有像素存在相同的唯一视差,这样如果纹理条件上佳,则不需要代价聚合,只通过相关系数法等局部相似度算法就能得到不错的结果。

但问题在于,这样的窗口太理想化了,你很难在实际应用中找到这样的场景,更多情况是:场景内可能存在若干个Fronto-parallel windows,也可能一个也没有。但庆幸的是,该窗口为我们提供了很好的研究思路,很多算法都是基于此窗口模型而进一步优化,如SGM、AD-Census,它们基于Fronto-parallel windows计算初始代价值,然后经过代价聚合,对代价进行优化,得到很不错的效果。

另一部分学者则开始另辟蹊径,寻找其他更合理的窗口模型。而且他们做到了,2011年,基于Slanted support windows的PatchMatchStereo1立体匹配算法应运而生。

Slanted support windows

我们先来看一张图:

图中,绿色的线条表示表面的一维表示,红色线段是窗口的一维表示,左边是Fronto-parallel windows示意图,可以看到P是符合Fronto-parallel windows假设的,局部表面是Fronto-parallel的,同一个视差值;而R和S不符合,表面都是倾斜,R是倾斜平面而S是倾斜曲面。右边是Slanted support windows示意图,我们可以观察R和S窗口的变化,Fronto-parallel windows假设下的窗口是和视差维平行的,并不贴合表面走势,而Slanted support windows是很好的贴合表面的。从图中我们可以看出来,Slanted support windows应该是随着表面的朝向而动态变化的,具体是如何变化,下面我会介绍。

另一个区别是,Fronto-parallel windows基于整像素视差,而Slanted support windows基于子像素视差。如Q点,局部表面的视差值不是整数值,如果是Fronto-parallel windows模型,只能匹配整像素视差(Fronto-parallel windows一般采用一元二次拟合来得到子像素精度),而Slanted support windows直接使用子像素位置的窗口,可以更好的贴合Q处的表面。

好了,大概对Slanted support windows有了个初步的印象,但大家估计还是一知半解,所以Slanted support windows模型到底具体是怎么实现的?听博主慢慢介绍。

Slanted support windows模型

上一节,我们猜想到PMS的Slanted support windows应该是随着表面的朝向而动态变化的,而且图中还可以看到Slanted support windows是一个平面窗口而并不是曲面窗口,PMS的出发点是为所有像素点都找到一个属于它的动态的视差平面,设像素点ppp的视差为dpd_pdp​,则ppp的视差平面方程为

式中, afpa_{f_p}afp​​、bfpb_{f_p}bfp​​、cfpc_{f_p}cfp​​为视差平面的3个参数,pxp_xpx​、pyp_ypy​为像素的xyxyxy坐标值。如此又来视差估计问题转换为平面估计问题,立体匹配就是要找出每个像素的最优平面的参数,也就是对每个像素找出聚合代价最小的那个平面:

式中FFF为一个无边界的平面集合,m(p,f)m(p,f)m(p,f)为像素ppp当视差平面为fff时的聚合代价值,计算公式为:

式中,WpW_pWp​是一个以ppp为中心的方形窗口,PMS也应用于时序立体,彼时WpW_pWp​将是一个3D窗口,第3维是连续视频序列帧中的前后帧对应位置像素,这听起来一下子就高端新颖上档次了啊。

w(p,q)w(p,q)w(p,q)是自适应的权值,为了解决edge-fattening问题,edge-fattening做立体匹配的同学一定遇到过:有视差非连续现象出现的边缘位置总是会有一圈连续的错误匹配值,它不是离群误差,而是让边缘扩大了一圈,通过一致性检查等手段都难以剔除。一个典型的例子是匹配张开的手掌,视差图会让手掌在根部粘连起来,如下图右列就是典型的edge-fattening问题。

PMS计算w(p,q)w(p,q)w(p,q)的方法是计算ppp和qqq为同一个平面的可能性,通过颜色的差异来判断,公式如下:

式中,γγγ为自定义参数,∣∣Ip−Iq∣∣,||I_p-I_q||,∣∣Ip​−Iq​∣∣为像素ppp和qqq在RGB空间的L1-distance(就是∣r−r∣+∣g−g∣+∣b−b∣|r-r|+|g-g|+|b-b|∣r−r∣+∣g−g∣+∣b−b∣)。相邻像素颜色差异越大,为同一平面的可能性越小,则w(p,q)w(p,q)w(p,q)越小,合理!

我们再来看最关键的ρρρ。它是在衡量两个像素的不相似性。假设左视图像素qqq的视差平面方程为(afa_faf​,bfb_fbf​,cfc_fcf​),则它的视差值dq=afqx+bfqy+cfd_q=a_fq_x+b_fq_y+c_fdq​=af​qx​+bf​qy​+cf​,在右视图上对应的同名点q′=q−dqq'=q-d_qq′=q−dq​,qqq和q′q'q′的不相似性计算公式为:

式中∣∣▽Iq−▽Iq′∣∣||▽I_q-▽I_{q'}||∣∣▽Iq​−▽Iq′​∣∣为qqq和q′q'q′的梯度之差的绝对值,该式的含义就是两个像素的颜色相差越大、梯度相差越大,则不相似的程度越大,ααα参数为自定义参数,在颜色和梯度之间做一个平衡。注意到根据平面算出来的视差值是小数值,所以像素q′q'q′的位置不是整数而是小数,它的颜色值和梯度值通过线性内插得到。

参数τcolτ_{col}τcol​和τgradτ_{grad}τgrad​为自定义截断参数,为了让遮挡区的像素代价计算更鲁棒,意思就是不能让代价过大,保持在一个良好的局部范围内。

以上,我们便了解如何计算像素ppp在视差平面为fpf_pfp​时的聚合代价m(p,f)m(p,f)m(p,f),从而可以判定fpf_pfp​的孰好孰坏而做出最优的选择(选择代价最小的fpf_pfp​自不必说)。

自然不能在一个无边界平面集FFF里用暴力穷举法搜索最小值。如何搜索,是PMS另一个及其出彩且与众不同的地方,同学们请听下回分解。

哈哈,放一张图吊下胃口:

下载完整源码,点击进入: https://github.com/ethan-li-coding/PatchMatchStereo.git
欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,给颗小星星,Follow 我!感激不尽!

码上实战系列

【码上实战】【立体匹配系列】经典PatchMatch: (1)框架
【码上实战】【立体匹配系列】经典PatchMatch: (2)主类
【码上实战】【立体匹配系列】经典PatchMatch: (3)随机初始化
【码上实战】【立体匹配系列】经典PatchMatch: (4)代价计算
【码上实战】【立体匹配系列】经典PatchMatch: (5)迭代传播
【码上实战】【立体匹配系列】经典PatchMatch: (6)后处理

博主简介:
Ethan Li 李迎松(知乎:李迎松)
武汉大学 摄影测量与遥感专业博士

主方向立体匹配、三维重建

2019年获测绘科技进步一等奖(省部级)

爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com

个人微信:

欢迎交流!

关注博主不迷路,感谢!
博客主页:https://ethanli.blog.csdn.net/


  1. Bleyer M , Rhemann C , Rother C . PatchMatch Stereo - Stereo Matching with Slanted Support Windows[C]// British Machine Vision Conference 2011. ↩︎ ↩︎

【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型相关推荐

  1. 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)

      半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...

  2. 【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)

    理论恒叨系列 [理论恒叨][立体匹配系列]经典SGM:(1)匹配代价计算之互信息(MI) [理论恒叨][立体匹配系列]经典SGM:(2)匹配代价计算之Census变换 [理论恒叨][立体匹配系列]经典 ...

  3. 【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换

    理论恒叨系列 [理论恒叨][立体匹配系列]经典SGM:(1)匹配代价计算之互信息(MI) [理论恒叨][立体匹配系列]经典SGM:(2)匹配代价计算之Census变换 [理论恒叨][立体匹配系列]经典 ...

  4. 【理论恒叨】【立体匹配系列】经典AD-Census: (1)代价计算

    下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上 ...

  5. 【理论恒叨】【立体匹配系列】经典AD-Census: (3)扫描线优化(Scanline Optimization)

    下载AD-Census完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论,如果觉得博主代码质量不错,右上 ...

  6. 论文阅读《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》(PMS-双目立体匹配)

    论文地址:PatchMatch Stereo - Stereo Matching with Slanted Support Windows 问题提出   局部匹配方法在计算匹配代价中是基于Fronto ...

  7. 论文阅读笔记:《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》

    论文下载: PatchMatch Stereo - Stereo Matching with Slanted Support Windows 摘要 1.1 思路  像素区域可以用近似的平面来模拟. ( ...

  8. 论文阅读笔记《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》

    摘要 介绍 算法 1 模型 2 通过PatchMatch方法来计算视差 3 后处理 4 为全局方法建立一个数据项 实验结果 摘要 一般的局部立体方法是在一个具有整型数值视差的支持窗口中进行匹配.其中隐 ...

  9. PatchMatch Stereo - Stereo Matching with Slanted Support Windows

    Tips MVS: Multi-View Stereo Abstract 思路:一般的局部立体方法是一个具有整形数值视察(disparity)的支持镜头进行匹配,其中有一个隐藏的假设:再支持区域的像素 ...

最新文章

  1. 一个程序员的成长的六个阶段(转载)
  2. 正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能
  3. 图灵机器人-Java/Android
  4. JAVA-单例模式的几种实现方式
  5. 2017年4月11日
  6. centos 安装配置ftp服务器
  7. 【精解】Exchange Server 2007群集连续复制
  8. Spring初学(一)
  9. c#使用PdfiumViewer展示、打印pdf文档
  10. Python函数参数传递:传值还是传引用
  11. nginx+Tomcat实现动静分离架构
  12. sftp 安全文件传输
  13. UVA10990 Another New Function【欧拉函数打表】
  14. 【java笔记】继承与多态
  15. nginx限制请求之一:(ngx_http_limit_conn_module)模块
  16. 设计模式 (七) 适配器模式
  17. C3P0连接池配置和实现详解
  18. openpyxl python 框线_Openpyxl对单元格应用边框
  19. c++配合Cheat Engine实现cs1.6外挂
  20. 无锡工艺技术计算机信息管理论文,无锡工艺职业技术学院05/06学年第一学期.doc...

热门文章

  1. 逆向一个IOS CrackMe
  2. 《张成功项目管理记》一评审:让问题止步,让下游放心
  3. DeepFashion实现服装检测搭配
  4. SQL将汉字转化为字母全拼以及简拼
  5. 重大利好!印度国家支付公司批准WhatsApp在UPI上建立支付服务!
  6. Conditions
  7. 洞悉规模化敏捷框架 Scrum@Scale 、LeSS 、SAFe (上篇)
  8. TestFlight 如何获取邀请码
  9. 高精地图在互联网行业的应用与发展
  10. Tessent Ijtag 第二章节 什么是ICL文件