【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计

2024-02-24 23:10

本文主要是介绍【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论恒叨系列

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

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

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

上篇博客中,博主介绍了PMS的核心模型Slanted support windows倾斜支持窗模型,本篇则是介绍PMS的视差估计方法:基于PatchMatch的视差估计法

【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计

    • 基于PatchMatch的视差估计法
      • 1 随机初始化
      • 2 迭代传播
        • 空间传播(Spatial Propagation)
        • 视图传播(View Propagation)
        • 时序传播(Temporal Propagation)
        • 平面优化(Plane Refinement)

基于PatchMatch的视差估计法

上篇,我们在结尾提到PatchMatchStereo(PMS)的目的是在一个无边界平面集 F F F找到代价最小的平面,暴力穷举法自然是不可取。PMS巧妙的借用PatchMatch的思路。PatchMatch的基本思想是:在自然图像中,一个有一定大小的像素块内所有像素都可以用同一个平面来近似。这也构成了PMS的基本思想,即图像可看作多个像素块,而每个像素块可有一个近似的视差平面,算法的目标就是要找到图像的所有视差平面。

如何做到呢?步骤如下:

1 随机初始化

随机初始化是PMS寻找视差平面的第一步,即为每个像素随机一个视差平面。PMS期望能够通过该步骤能够在每一个平面区域中至少为1个像素随机到正确平面,有同学此时会有两个疑问:

  • (1)只找到一个像素的正确平面够吗?
  • (2)能达到这个期望吗?万一一个也找不到呢?

博主回答:

  • (1)够,后续PMS会经过多次传播,把该正确平面传播到同一平面区域的其他所有像素。
  • (2)大概率能够达到期望。因为算法为每一个像素都随机一个平面,基数很大,从概率学角度来说,能随机到正确平面的几率是很大的。

那么平面该如何随机呢?大家可能第一时间想到,随机给平面三个参数 a f a_f af b f b_f bf c f c_f cf赋值。这样做的缺点是无法给平面一个范围约束,接触过其他立体匹配算法的同学都知道,很多算法都有一个视差范围,PMS也不例外,不进行范围约束,效率和效果都会受影响。因此PMS的做法是:在视差范围内为每个像素随机一个视差值 z 0 z_0 z0,这样我们就有了平面上的一个点 P ( x 0 , y 0 , z 0 ) P(x_0,y_0,z_0) P(x0,y0,z0),然后随机一个单位向量 n ⃗ = ( n x , n y , n z ) \vec{n}=(n_x,n_y,n_z) n =(nx,ny,nz)作为平面的法线。如此一来, a f a_f af b f b_f bf c f c_f cf便可通过公式: a f = − n x n z a_f=-\frac{n_x}{n_z} af=nznx b f = − n y n z b_f=-\frac{n_y}{n_z} bf=nzny c f = n x x 0 + n y y 0 + n z z 0 n z c_f=\frac{n_xx_0+n_yy_0+n_zz_0}{n_z} cf=nznxx0+nyy0+nzz0来计算。

若固定 n ⃗ = ( 0 , 0 , 1 ) \vec{n}=(0,0,1) n =(0,0,1),则变成Fronto-parallel Windows。若想取整像素精度,则可强制 z 0 z_0 z0为整数值(一般而言 z 0 z_0 z0为浮点数)。

随机视差图大家可以瞅一眼:

下半部分就是随机的结果,可以看到一团乱麻点。上半部分是视差传播后的结果。想必大家就对传播很感兴趣了,别着急,往下看。

2 迭代传播

迭代传播是重头戏,它的基本思想是把随机的所有视差平面中的少数正确的视差平面传播至同一视差平面内的其他像素。算法执行多次迭代,每次迭代执行四个步骤:(1)空间传播(Spatial Propagation)(2)视图传播(View Propagation)(3)时序传播(Temporal Propagation)(4)平面优化(Plane Refinement)。偶数次迭代,从图像左上角像素沿行方向传播至右下角像素;奇数次迭代则和偶数次迭代传播顺序相反,即从右下角像素沿行方向传播至左上角像素。PMS共执行了3次迭代,下图展示了迭代的过程和结果:

很有意思,这样传播三次居然可以得到如此美妙的结果。

急迫的想了解传播是何方神圣!

空间传播(Spatial Propagation)

空间传播背后的思想是空间上相邻的像素极可能有相似的平面。基于此思想,PMS假设像素点 p p p当前的平面为 f p f_p fp,则检查 p p p邻域内的像素 q q q的平面 f q f_q fq是否更适合 p p p,即检查 m ( p , f q ) < m ( p , f p ) m(p,f_q)<m(p,f_p) m(p,fq)<m(p,fp)是否成立,若成立,则把平面 f q f_q fq作为像素 p p p的新平面。在偶数次迭代, q q q p p p的左边和上边像素;在奇数次迭代, q q q p p p的右边和下边像素。

视图传播(View Propagation)

了解立体匹配的同学都知道一致性检查,同名像对会有相同的视差值,PMS也利用这一点,认为同名像对会有相似的视差平面。还是假设像素点 p p p当前的平面为 f p f_p fp,则在右视图上找到同名点为 p p p的像素 p ′ p' p f p ′ f_{p'} fp p ′ p' p的视差平面转换至左视图坐标系后的平面,若 m ( p , f p ′ ) < m ( p , f p ) m(p,f_{p'})<m(p,f_p) m(p,fp)<m(p,fp),则把平面 f p ′ f_{p'} fp作为像素 p p p的新平面。

时序传播(Temporal Propagation)

时序传播比较特殊,它仅仅用于视频序列的立体匹配,它所基于的假设是相邻帧同一位置的像素大概率有相似的平面,该假设还是比较合理的,在视频序列中前后帧的移动量一般都很小。同样,假设像素点 p p p当前的平面为 f p f_p fp,前后帧和 p p p位置相同的像素为 p ′ p' p f p ′ f_{p'} fp p ′ p' p的视差平面,若 m ( p , f p ′ ) < m ( p , f p ) m(p,f_{p'})<m(p,f_p) m(p,fp)<m(p,fp),则把平面 f p ′ f_{p'} fp作为像素 p p p的新平面。

平面优化(Plane Refinement)

平面优化目标是通过优化视差平面 f p f_p fp的参数而进一步减小像素 p p p的聚合代价值 m ( p , f p ) m(p,f_p) m(p,fp)

PMS将 f p f_p fp转换为点加法向量的表达方式,并设置两个参数: Δ z 0 m a x Δ_{z_0}^{max} Δz0max Δ n m a x Δ_{n}^{max} Δnmax Δ z 0 m a x Δ_{z_0}^{max} Δz0max为点 P ( x 0 , y 0 , z 0 ) P(x_0,y_0,z_0) P(x0,y0,z0)的z-坐标的可变化范围, Δ n m a x Δ_{n}^{max} Δnmax为法向量 n ⃗ \vec{n} n 各分量的可变化范围。在 [ − Δ z 0 m a x , Δ z 0 m a x ] [-Δ_{z_0}^{max},Δ_{z_0}^{max}] [Δz0max,Δz0max]范围内随机一个值 Δ z 0 Δ_{z_0} Δz0加到 z 0 z_0 z0上得 z 0 ′ = z 0 + Δ z 0 z_0'=z_0+Δ_{z_0} z0=z0+Δz0,由此得到新的点 P ′ ( x 0 , y 0 , z 0 ′ ) P'(x_0,y_0,z_0') P(x0,y0,z0);随后,在 [ − Δ n m a x , Δ n m a x ] [-Δ_{n}^{max},Δ_{n}^{max}] [Δnmax,Δnmax]范围内随机3个值组成向量 Δ n ⃗ \vec{Δ_{n}} Δn ,计算新的法向量 n ′ ⃗ = u ( n ⃗ + Δ n ⃗ ) \vec{n'}=u(\vec{n}+\vec{Δ_{n}}) n =u(n +Δn ) u u u为取单位向量。新的点 P ′ P' P和法向量 n ′ ⃗ \vec{n'} n 组成新的平面 f p ′ f_{p'} fp,若 m ( p , f p ′ ) < m ( p , f p ) m(p,f_{p'})<m(p,f_p) m(p,fp)<m(p,fp),则把平面 f p ′ f_{p'} fp作为像素 p p p的新平面。

平面优化步骤也是迭代进行的,初始设置 Δ z 0 m a x = m a x d i s p / 2 Δ_{z_0}^{max}=maxdisp/2 Δz0max=maxdisp/2 m a x d i s p maxdisp maxdisp为设置的最大视差值)、 Δ n m a x = 1 Δ_{n}^{max}=1 Δnmax=1。每次迭代后,设置 Δ z 0 m a x = Δ z 0 m a x / 2 Δ_{z_0}^{max}=Δ_{z_0}^{max}/2 Δz0max=Δz0max/2 Δ n m a x = Δ n m a x / 2 Δ_{n}^{max}=Δ_{n}^{max}/2 Δnmax=Δnmax/2,由此来逐渐缩小搜索空间。迭代终止条件为 Δ z 0 m a x = 0.1 Δ_{z_0}^{max}=0.1 Δz0max=0.1

好了,本篇就介绍到此,内容不多,但很核心,大家消化消化。本篇展现了PatchMatchStereo的思维核心,结合上篇,基本就对PatchMatchStereo有一个较为全面的了解了。下篇我们将要介绍的是PMS的后处理(Post-Processing)部分,并给出一些实验结果。

下载完整源码,点击进入: 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: (2)基于PatchMatch的视差估计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743666

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(