文章目录
- 前言
- 一、PatchMatchStereo是什么?
- 1.随机初始化
- 2.迭代传播
- 2.1空间传播
- 2.2视图传播
- 2.3帧间传播
- 2.4平面细化
- 二、PatchMatchStereo立体匹配算法实现
前言
PatchMatchStereo是Michael Bleyer等在2011年发表于British Machine Vision Conference(BMVC)上的一篇双目立体匹配算法文章,和AD-census、SGM都是非常经典的算法,PMSstereo原文链接在此,可以直接下载阅读。PatchMatch Stereo - Stereo Matching with Slanted Support Windows
参考文献:必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程
【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计
一、PatchMatchStereo是什么?
PatchMatchStereo的思路主要是使用和传统固定窗口式不同的倾斜支持窗进行局部立体匹配,在Middlebury数据集上获得非常好的匹配效果,一段时间内高居排行榜第一名。更难能可贵的是,它和SGM一样数据泛化能力出色。
倾斜支持窗原理李博讲的已经很清楚啦【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
PMS巧妙的借用PatchMatch的思路。PatchMatch的基本思想是:在自然图像中,一个有一定大小的像素块内所有像素都可以用同一个平面来近似。这也构成了PMS的基本思想,即图像可看作多个像素块,而每个像素块可有一个近似的视差平面,算法的目标就是要找到图像的所有视差平面。感兴趣的同学可以阅读一下:PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing
1.随机初始化
PMS的出发点是为所有像素点都找到一个属于它的动态的视差平面,设像素点p 的视差为dp,则p 的视差平面方程为:
随机初始化是PMS寻找视差平面的第一步,即为每个像素随机一个视差平面。PMS期望能够通过该步骤能够在每一个平面区域中至少为1个像素随机到正确平面,后续PMS会经过多次传播,把该正确平面传播到同一平面区域的其他所有像素。原则上是可以直接对平面图片的三个参数af、bf、cf进行随机赋值,但是这样做无法保证在可允许的视差空间中进行均等的采样,且对效率和效果都有影响,故PSM的做法是:设定视差范围[0,dmax],从中选取一个视差值z0,这样我们就有了平面上的一个点P ( x0 , y0 , z0 ),然后随机一个单位向量
n
⃗
\vec n
n= ( nx , ny , nz ) 作为平面法线,则af、bf、cf就可以解出:
注:
若固定
n
⃗
\vec n
n = ( 0 , 0 , 1 ) 则变成Fronto-parallel Windows。
若想取整像素精度,则可强制 z0为整数值(一般而言 z0为浮点数)。
2.迭代传播
如图所示,它的基本思想是把随机的所有视差平面中的少数正确的视差平面传播至同一视差平面内的其他像素。迭代过程中,每一个像素将经历4个阶段:空间传播、视图传播、帧间传播、平面细化,一般先处理左图,然后再处理右图。在偶数次迭代中从左上到右下依次遍历每一个像素,在奇数次迭代中,则顺序相反。
2.1空间传播
空间传播的思想是在空间上相邻的像素一般具有相近的视差,PMS假设像素点p 当前的平面为 fp,其邻域内像素q当前的平面也为 fp,判断是否m(p,fp)<m(p,fq),若是则用 fp作为q的视差平面。
m(p,f)为像素p当视差平面为f 时的聚合代价值,详细解释还是参考李博博客【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
注:
偶数次迭代,p是q左侧或者上面的像素 , ↓↑ →←
奇数次迭代,p是q右侧或者下面的像素 , ↓↑↓ →←→
2.2视图传播
视图传播的思想基础是左(右)图中的像素点与右(左)图中的对应匹配点应当具有相同的视差平面(一致性检查,同名像对会有相同的视差值)。假设像素点p当前的平面为fp,在右视图上找到同名点p ′的平面为 fp ′,若m(p,fp ′)<m(p,fp),则把平面fp ′ 作为像素p的新平面。
2.3帧间传播
帧间传播主要用于视频序列中,它所基于的假设是相邻帧同一位置的像素大概率有相似的平面,假设像素点p当前的平面为fp
,前后帧和p位置相同的像素为p ′ ,fp ′ 为p ′的视差平面,若m(p,fp ′)<m(p,fp),则把平面fp ′作为像素p的新平面。
2.4平面细化
平面细化的目的是通过更新像素p = ( x0 , y0)的视差平面fp进一步降低匹配代价。由于平面图片可以由一个点fp和一个法向量
n
⃗
\vec n
n表示,所以平面的更新可以通过点坐标和法向量的更新来得到。z0和
n
⃗
\vec n
n的最大变化量为z0-max,然后在[-
Δ
\Delta
Δz0max,
Δ
\Delta
Δz0max]范围内随机一个值
Δ
\Delta
Δz0加到z0得到z0‘,由此得到新的点P’= ( x0 , y0 , z0 '),然后在[-
Δ
\Delta
Δz0max,
Δ
\Delta
Δz0max]中随机三个值来计算新的法向量
n
⃗
′
\vec n'
n′ = u(
n
⃗
\vec n
n+
Δ
\Delta
Δn),u为将向量归一化的单位。新的点p‘和新的向量
n
⃗
′
\vec n'
n′组成新的平面fp ′ ,若m(p,fp ′)<m(p,fp),则把平面fp ′作为像素p的新平面。
平面优化步骤也是迭代进行的,初始设置
Δ
\Delta
Δz0max = maxdisp/2(maxdispmaxdispmaxdisp为设置的最大视差值)、
Δ
\Delta
Δnmax =1,每次迭代后,设置
Δ
\Delta
Δz0max /2,
Δ
\Delta
Δnmax /2由此来逐渐缩小搜索空间,直到
Δ
\Delta
Δz0max <0.1停止迭代。
假如像素当前的视差平面是完全错误的,初次迭代使用较大的搜索范围就有可能将其转移到正确平面附近,之后的迭代中不断的缩小搜索范围,使得视差平面在当前平面附近捕获视差细节,能够适用于弧形表面。
二、PatchMatchStereo立体匹配算法实现
借鉴githubPatchMatchStereo大佬的代码,已经测试好,方便大家使用,链接放到下面啦,自行下载就好啦。
基于python的PatchMatchStereo立体匹配算法实现
直接修改自己的图片路径就好啦,这里的50是指的最大视差dmax。其他参数大家也可以自行调整一下,就不细说啦,直接放效果图