基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读
基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读
- 声明
- 问题提出
- 问题建模
- 通过PatchMatch获取平面参数——Inference via PatchMatch
- 1. 随机初始化(Random Initialization)
- 2. 迭代传播(Iteration)
- 2.1 空间传播(Spatial Propagation)
- 2.2 视图传播(View Propagation)
- 2.3 时序传播(Temporal Propagation)
- 2.4 平面优化(Plane Refinement)
- 总结
- 参考文献和资料
声明
本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。
问题提出
在局部立体匹配方法中,支持窗口(a support window)位于reference图像某一像素点的中间位置,并且在target图像中支持窗口会通过移动来找到颜色差异最小的点,作为该点的匹配对应点。在这个问题过程中,存在一个隐含的假设——即支持窗口内的所有像素都具有恒定的视差。但实际情况往往不是这样,一是支持窗口包含位于与中心像素不同的表面上的像素(也就是支持窗口中的像素可能在场景中处于不同表面),二是支持窗口有可能位于倾斜的表面。自适应支持权重方法(the adaptive support weight strategy)利用离散视差上的正面平行窗口(fronto-parallel windows at discrete disparities)很好地解决了问题一,重建的1维结果如下图(a)所示;但是可以看到,这种方法只能为点P找到最佳的支持窗口,因为点P的表面部分在全值视差1处与正面平行平面(the fronto-parallel plane)重合,很明显现实场景中很少能满足这样的情况。对于位于亚像素视差处的点Q、位于倾斜平面的点R以及位于球形平面的点S均无法用正面平行平面找到合适的支持窗口。
这样就引出了本文的策略,即在每一个像素点都计算一个单独的3D平面并且应用在待投影的支持区域。如上图(b)所示,这使得生成的支持窗口明显改善,能够完整的表示点P、Q、R所在的平面,而且对于S点处的平面,在实验中(如下图(c)所示)也显示具有较好的效果。在下图(a)具有高度倾斜以包含球形物体的走廊场景中,本文的方法(c)展现了比正面平行平面方法(b)更好的性能。
在本文中,作者提出了一种基于PatchMatch的算法,用以有效解决在每个像素处寻找一个好的倾斜支持平面(a good slanted support plane),与其他方法不同的是,该方法并不重建整个立体代价体——对于一个无限标签空间包含所有的3D平面是不可能的,而是巧妙地遍历其中一部分。PatchMatch是一种近似的稠密最近邻算法,即对于一个图像的每个patch计算第二个图像中相似颜色的patch的整数值向量(x,y)。并且使用随机搜索和传播的PatchMatch思想,在一个平面的极线上寻找最近邻点,这能够有效的处理倾斜表面和亚像素精度的问题。
问题建模
对于两幅图像的每个点对ppp,搜寻一个平面fpf_pfp,一旦fpf_pfp被搜索到,就可以计算ppp点的视差值dp=afppx+bfppy+cfpd_p=a_{f_p}p_x+b_{f_p}p_y+c_{f_p}dp=afppx+bfppy+cfp,其中afpa_{f_p}afp、bfpb_{f_p}bfp和cfpc_{f_p}cfp是平面fpf_pfp的三个参数,pxp_xpx和pyp_ypy是点p的横纵坐标。最后希望找到的平面fpf_pfp应该是所有可能平面中聚合匹配代价(aggregated matching costs)最小的平面之一:fp=argminf∈Fm(p,f)f_p=\text{argmin}_{f\in \mathcal{F}}m(p, f)fp=argminf∈Fm(p,f),其中F\mathcal{F}F代表大小为无限的所有平面的集合——但是这个无限的标签空间无法简单地检查所有可能的标签。平面fff的匹配像素ppp的聚合代价为:m(p,f)=∑q∈Wpw(p,q)⋅ρ(q,q−(afppx+bfppy+cfp))m(p,f)=\sum_{q\in W_p}w(p,q)·\rho(q,q-(a_{f_p}p_x+b_{f_p}p_y+c_{f_p}))m(p,f)=q∈Wp∑w(p,q)⋅ρ(q,q−(afppx+bfppy+cfp)),其中WpW_pWp表示以像素ppp为中心的方形窗口,权重函数w(p,q)w(p,q)w(p,q)用于克服边缘肥大问题(edge-fattening problem)并实现自适应支持权重思想。其通过查看像素的颜色来计算ppp和qqq位于同一平面上的可能性,即如果颜色相似,它会返回高值:w(p,q)=e−∣∣Ip−Iq∣∣γw(p,q)=e^{-\frac{||I_p-I_q||}{\gamma}}w(p,q)=e−γ∣∣Ip−Iq∣∣。函数ρ\rhoρ是在衡量两个像素的不相似性。假设左视图像素q的视差平面方程为(afp,bfp,cfp)(a_{f_p},b_{f_p},c_{f_p})(afp,bfp,cfp)则它的视差值dp=afppx+bfppy+cfpd_p=a_{f_p}p_x+b_{f_p}p_y+c_{f_p}dp=afppx+bfppy+cfp,在右视图上的对应点q′=q−dqq'=q-d_qq′=q−dq,则q和q′q'q′的不相似性计算公式为:ρ(q,q′)=(1−α)⋅min(∣∣Iq−Iq′∣∣,τcol)+α⋅min(∣∣ΔIq−ΔIq′∣∣,τgrad)\rho(q,q')=(1-\alpha)·min(||I_q-I_{q'}||,\tau_{col})+\alpha·min(||\Delta I_q-\Delta I_{q'}||,\tau_{grad})ρ(q,q′)=(1−α)⋅min(∣∣Iq−Iq′∣∣,τcol)+α⋅min(∣∣ΔIq−ΔIq′∣∣,τgrad)式中∣∣ΔIq−ΔIq′∣∣||\Delta I_q-\Delta I_{q'}||∣∣ΔIq−ΔIq′∣∣为q和q′q'q′的梯度之差的绝对值,该式的含义就是两个像素的颜色相差越大、梯度相差越大,则不相似的程度越大;α\alphaα参数为自定义参数,在颜色和梯度之间做一个平衡。注意到根据平面算出来的视差值是小数值,所以像素q′q'q′的位置不是整数而是小数,它的颜色值和梯度值通过线性内插得到。参数τcol\tau_{col}τcol和τgrad\tau_{grad}τgrad为自定义截断参数,为了让遮挡区的像素代价计算更鲁棒,意思就是不能让代价过大,保持在一个良好的局部范围内。
至此得到了一个完整定义的代价函数用来衡量一个平面表示的好坏,在匹配时应当选择代价最小的平面;但是由于空间中存在着无限个平面,所以不能简单的利用穷举的方法来搜寻,而是需要PatchMatch的思想来搜索。
通过PatchMatch获取平面参数——Inference via PatchMatch
PatchMatch的基本思想是:在自然图像中,一个有一定大小的像素块内所有像素都可以用同一个平面来近似。这也构成了PMS的基本思想,即图像可看作多个像素块,而每个像素块可有一个近似的视差平面,算法的目标就是要找到图像的所有视差平面。
1. 随机初始化(Random Initialization)
初始化的规则为:在给定的视差范围内每个像素随机生成一个视差值z0z_0z0,这样就得到了一个随机平面上的点P=(x0,y0,z0)P=(x_0,y_0,z_0)P=(x0,y0,z0),紧接着生成一个随机的单位向量n⃗=(nx,ny,nz)\vec{n}=(n_x,n_y,n_z)n=(nx,ny,nz)作为平面的法线,就可以得到平面的三个参数值:af=−nxnza_f=-\frac{n_x}{n_z}af=−nznx,bf=−nynzb_f=-\frac{n_y}{n_z}bf=−nzny,cf=nxx0+nyy0+nzz0nzc_f=\frac{n_xx_0+n_yy_0+n_zz_0}{n_z}cf=nznxx0+nyy0+nzz0,初始化后的平面视差值为上图(a)右中下方的“雪花点”。
2. 迭代传播(Iteration)
一次迭代过程中,每个像素点会运行四个阶段:(1)空间传播(2)视图传播(3)时序传播(4)平面优化,首先处理左帧的所有像素,然后处理右图像的所有像素。在偶数迭代中,我们从左上角的像素开始,按行优先顺序遍历像素,直到到达右下角的像素;在奇数迭代中,我们颠倒顺序,即我们从右下角的像素开始,在左上角的像素处停止。
2.1 空间传播(Spatial Propagation)
这种传播形式背后的想法是空间相邻像素可能具有相似的平面,令ppp表示当前像素,fpf_pfp表示其对应平面,接下来评估将ppp分配给空间邻近点qqq的对应平面fqf_qfq是否能够提高代价函数的值,如果m(p,fq)<m(p,fp)m(p,f_q)<m(p,f_p)m(p,fq)<m(p,fp),则令fp:=fqf_p:=f_qfp:=fq,在偶数迭代中,我们考虑左邻和上邻,而在奇数迭代中,检查右邻和下邻。
2.2 视图传播(View Propagation)
接着利用左右视差图之间存在的强相干性,即视图中的像素及其另一个视图中的匹配点可能具有相似的平面;根据当前平面检查第二个视图中所有将当前像素ppp作为匹配点的像素,对于像素ppp的某个对应点p′p'p′以及其平面fp′f_{p'}fp′,若m(p,fp′)<m(p,fp)m(p,f_{p'})<m(p,f_p)m(p,fp′)<m(p,fp),则令fp:=fp′f_p:=f_{p'}fp:=fp′。
2.3 时序传播(Temporal Propagation)
这种传播形式只能在处理立体视频序列时使用,该思路假设当前视频帧的像素ppp和前一个或连续图像中相同坐标的像素p′p'p′可能具有相似的平面。若m(p,fp′)<m(p,fp)m(p,f_{p'})<m(p,f_p)m(p,fp′)<m(p,fp),则令fp:=fp′f_p:=f_{p'}fp:=fp′。
2.4 平面优化(Plane Refinement)
该步骤的目的是通过优化位于像素点p=(x0,y0)p=(x_0,y_0)p=(x0,y0)的视差平面fpf_pfp参数以便进一步降低代价函数的值。首先将fpf_pfp转换为点+法线向量的表示方法,并且提出两个新参数:
- Δz0max\Delta^{max}_{z_0}Δz0max——定义了3D点z轴坐标z0z_0z0的最大变化范围,紧接着在[−Δz0max,Δz0max][-\Delta^{max}_{z_0},\Delta^{max}_{z_0}][−Δz0max,Δz0max]区间内随机取一个值Δz0\Delta_{z_0}Δz0作为修正:z0′=z0+Δz0z_0'=z_0+\Delta_{z_0}z0′=z0+Δz0,由此得到新的3D点P′=(x0,y0,z0′)P'=(x_0,y_0,z_0')P′=(x0,y0,z0′);
- Δnmax\Delta^{max}_nΔnmax——定义了法向量n⃗\vec{n}n各分量的可变化范围,然后,在[−Δz0n,Δz0n][-\Delta^{n}_{z_0},\Delta^{n}_{z_0}][−Δz0n,Δz0n]区间内随机取三个值组成法向量修正Δ⃗n\vec{\Delta}_nΔn:n′⃗:=u(n⃗+Δn⃗)\vec{n'}:=u(\vec{n}+\vec{\Delta_n})n′:=u(n+Δn);
通过修正后的P′P'P′和n′⃗\vec{n'}n′,计算并比较代价函数,若m(p,fp′)<m(p,fp)m(p,f'_p)<m(p,f_p)m(p,fp′)<m(p,fp),则令fp:=fp′f_p:=f'_pfp:=fp′。
平面优化步骤是迭代进行的,初始设置Δz0max=maxdisp/2\Delta^{max}_{z_0}=maxdisp/2Δz0max=maxdisp/2(maxdisp为设置的最大视差值),Δnmax=1\Delta^{max}_{n}=1Δnmax=1;每次迭代后,设置Δz0max=Δz0max/2\Delta^{max}_{z_0}=\Delta^{max}_{z_0}/2Δz0max=Δz0max/2,Δnmax=Δnmax/2\Delta^{max}_{n}=\Delta^{max}_{n}/2Δnmax=Δnmax/2,由此来逐渐缩小搜索空间。
总结
以上就是PatchMatch匹配算法中的创新部分,论文里还有一小节是讲视差后处理的,由于后处理的方法很多,常见的就几种,每个匹配算法或多或少都会用到几种后处理的方法,所以在具体的算法解读中就不做赘述,而是会单独介绍一下常见的后处理方法。本人已经开学,所以时间精力有限,接下来可能会将SGM和PatchMatch的代码注释更完,紧接着就会进行其他方面的学习,欢迎大家一同学习讨论~
参考文献和资料
[1]78. 三维重建12-立体匹配9,经典算法PatchMatchStereo
[2]【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
[3]PatchMatch Stereo - Stereo Matching with Slanted Support Windows
基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读相关推荐
- 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读
基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...
- 算法学习笔记22:贪心算法
目录 贪心算法:如何用贪心算法实现Huffman压缩编码 如何理解"贪心算法" 贪心算法实战分析 1.分糖果 2. 钱币找零 3. 区间覆盖 解答开篇 内容小结 贪心算法:如何用贪 ...
- 算法学习笔记五 斐波那契数列
斐波那契数列 一.最基本的 所以,只要知道这个数列的前两项,就可以求出之后所有项了. 核心部分(最简单的递推方法,但是范围是n<=48,否则会超时and溢出): #include <cst ...
- 算法学习笔记五:最短路径
题目描述 卫斯理小说经常提及外星人,比如蓝血人. 在土星星球有很多城市,每个城市之间有一条或多条飞行通道, 但是并不是所有的路都是很安全的,每一条路有一个安全系数 s,s 是在 0和1 间的实数 (包 ...
- 【图论学习笔记五】贪心算法
优化问题的算法通常会通过一系列的步骤,在每一个步骤通过一系列的选择.一个贪婪算法总是目前看起来最好的选择.也就是说,它做出局部最优选择,希望选择将导致全局最优的解决方案.贪心算法并不总是能得到最优解, ...
- 【算法学习笔记五】平摊分析
平摊分析 平摊分析是分析一个操作序列以显示每个操作的平均成本很小的任何策略,即使序列中的单个操作可能很昂贵.不同于平均案例分析:1)不涉及概率;2)保证最坏情况下各操作的平均性能. 三种常见的平摊方法 ...
- 【算法学习笔记】一、算法基础
根据参考:labuladong的算法小抄 我上次看过一点[labuladong的算法小抄],做过一些笔记,感觉没时间练也没记住,这次得好好从头看看了. 文章目录 一.框架思维 二.数据结构的存储方式 ...
- 图解算法学习笔记(一): 算法简介
本章内容: 编写第一种查找算法--二分查找. 学习如何谈论算法的运行时间--大O表示法. 1) 算法是一组完成任务的指令,任何代码片段都可视为算法. 2)二分查找:一种查找算法,其输入是一个有序的元素 ...
- Havel–Hakimi算法学习笔记(哈维尔算法)详细【Python】
问题 来源离散数学的图论中 第一个接触到的算法:Havel–Hakimi算法 (哈维尔算法) 判断一个非负序列是否为某无向简单图的度数列的方法(Pyhton代码) 前提提要 1.无向简单图 首先先了解 ...
最新文章
- 网络推广专员浅析站内网络推广引流怎样做?
- mysql数据库怎么安装到自己的电脑上?
- 鹰眼系统原理_山东首家露天焚烧鹰眼监控系统在我镇投入使用
- Type mismatch: cannot convert from int to Object错误
- perl 正则表达式 引擎_Perl 5引擎概述
- varnish几个工具命令行工作情况
- 报表通过url向数据集传参
- java桥牌发牌算法
- mid制作乐谱_CuteMIDI简谱打谱软件(midi音乐制作器)V8.5.1 安装版
- git idea提交代码的步骤
- python实现人脸识别系统_python使用opencv实现人脸识别系统
- java 编程题 实现双色球抽奖游戏中奖号码的生成
- 高通SDX12:基于sgm4151x的充电IC代码架构
- 网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!...
- Java代码审计手册(1)
- 硬件结构框架_北桥_带宽
- 查看服务器所有进程信息,怎么查看服务器上的所有进程
- spring-boot自定义yml读取
- 计算几何之用叉乘求多边形面积
- Day1 命名规范 静态函数 构造析构 指针引用
热门文章
- 网线中哪几根真正有用?
- JS输出所有的水仙花数
- 手把手教你如何玩转Solr(包含项目实战)[转载]
- TensorFlow 1.4.0 正式发布;GitLab 许可证从 CLA 切换到 DCO
- CodeForces 82A Double Cola
- c语言中输入x分段函数值,c语言程序改错:输入x,计算并输出分段函数y的值.0 x0...
- 离散数学:用python解决逻辑推理问题
- 渗透测试-web渗透本质–信息收集
- qq里面cap字符_特殊符号大全
- BlackBerry网站无法建立下载连接的处理办法