论文地址:PatchMatch Stereo - Stereo Matching with Slanted Support Windows
问题提出
局部匹配方法在计算匹配代价中是基于Fronto Parallel Windows 进行的,而Fronto Parallel Windows 隐含两个假设:
- 窗口内所有点在三维空间的深度相同。
- 窗口内任意线段在核线像对(经立体校正后的图像对)的投影长度相等。
但这样的假设在某些情况下是不合理的,如下图所示
若窗口内的任意A、B两点在三维空间中处于同一个深度如图右侧所示,则A、B两点在左右视图上的投影点线段 a 1 b 1 = a 2 b 2 a_{1}b_{1}=a_{2}b_{2} a1b1=a2b2,此时左视图支撑窗口中的所有点在右视图中都有一一对应的匹配点。此时计算出的匹配代价时可以正确反映真实的状况。
若A、B点的深度不一致,则 a 1 b 1 ≠ a 2 b 2 a_{1}b_{1}\neq a_{2}b_{2} a1b1=a2b2,则该支撑窗口不能很好反应左右视图该点的匹配代价值。
如原文中Figure 1(a)所示,绿线代表物体表面,红色线段表示窗口。P点的窗口符合Fronto Parallel Windows假设,当物体表面倾斜或者表面为曲面时,R点和S点是不符合该假设。Figure 1(b)为Slanted Support Windows,这样的倾斜窗口能更好贴合物体表面。此外,平行窗口基于整数视差计算匹配代价,然后基于一元二次拟合的方式得到亚像素精度的匹配代价,而倾斜窗口可以直接基于亚像素像素视差计算匹配代价,如Q点所示。
从Figure2 可知:基于平行窗口计算的深度值会出现明显断层而基于倾斜窗口可以更好计算得到更平滑的深度值。
算法思想
PatchMatchStereo的核心想法是为所有的像素点分别找到一个属于该像素的视差平面,用这个视差平面来计算该点的视差值,若像素点的坐标为
(
p
x
,
p
y
)
(p_{x}, p_{y})
(px,py),则根据该点的视差平面方程来计算该点的视差值如式(1)所示。
d
p
=
a
f
p
p
x
+
b
f
p
p
y
+
c
f
p
(1)
d_{p}=a_{f_{p}} p_{x}+b_{f_{p}} p_{y}+c_{f_{p}}\tag{1}
dp=afppx+bfppy+cfp(1)
式中,
a
f
p
、
b
f
p
、
c
f
p
a_{f_{p}} 、b_{f_{p}} 、c_{f_{p}}
afp、bfp、cfp为视差平面的参数,立体匹配的目标从视差估计问题转换为了平面估计问题,为每个像素点找到最优视差平面,约束条件为聚合代价最小。聚合代价函数如式(2)所示:
f
p
=
arg
min
f
∈
F
{
m
(
p
,
f
)
}
(2)
f_{p}=\underset{f \in F}{\arg \min } \{m(p, f)\}\tag 2
fp=f∈Fargmin{m(p,f)}(2)
式中,F为一个无边界的平面集合,
m
(
p
,
f
)
m(p, f)
m(p,f)表示视差平面为f时像素p的聚合代价。
m
(
p
,
f
)
m(p, f)
m(p,f)如式(3)所示:
m
(
p
,
f
)
=
∑
q
∈
W
p
w
(
p
,
q
)
⋅
ρ
(
q
,
q
−
(
a
f
q
x
+
b
f
q
y
+
c
f
)
)
(3)
m(p, f)=\sum_{q \in W_{p}} w(p, q) \cdot \rho\left(q, q-\left(a_{f} q_{x}+b_{f} q_{y}+c_{f}\right)\right)\tag 3
m(p,f)=q∈Wp∑w(p,q)⋅ρ(q,q−(afqx+bfqy+cf))(3)
式中,
W
p
W_{p}
Wp为以像素点p为中心的方形窗口,若使用于时序图像中,则
W
p
W_{p}
Wp是一个3D窗口。
w
(
p
,
q
)
w(p,q)
w(p,q)是自适应权值,为了解决edge-fattening问题(视差非连续区域的边缘位置会出现一圈连续的错误匹配点,这样的点会让边缘扩大一圈)。其中,
w
(
p
,
q
)
w(p, q)
w(p,q)是用来衡量p点和q点在同一个平面的可能性,如式(4)所示:
w
(
p
,
q
)
=
e
−
∥
I
p
−
I
q
∥
γ
(4)
w(p, q)=e^{-\frac{\left\|I_{p}-I_{q}\right\|}{\gamma}}\tag 4
w(p,q)=e−γ∥Ip−Iq∥(4)
式中,
γ
\gamma
γ为超参数,
∣
∣
I
p
−
I
q
∣
∣
||I_{p}-I_{q}||
∣∣Ip−Iq∣∣是p与q像素在颜色空间的L1距离(|r-r|+|g-g|+|b-b|),若两点的颜色差异越大,则两点处于同一平面的可能性更小。
式3中的
ρ
\rho
ρ函数用于衡量两个像素间的不相似性。若左视图中q的视差平面方程为
(
a
f
,
b
f
,
c
f
)
(a_{f}, b_{f}, c_{f})
(af,bf,cf),则其视差值为
d
q
=
a
f
p
x
+
b
f
q
y
+
c
f
d_{q}=a_{f}p_{x} + b_{f}q_{y}+c_{f}
dq=afpx+bfqy+cf,右视图对应的同名点
q
′
=
q
−
d
q
q_{'}=q-d_{q}
q′=q−dq,则p与q的不相似度计算如式(5)所示:
ρ
(
q
,
q
′
)
=
(
1
−
α
)
⋅
min
(
∣
∣
I
q
−
I
q
′
∥
,
τ
c
o
l
)
+
α
⋅
min
(
∥
∇
I
q
−
∇
I
q
′
∥
,
τ
grad
)
(5)
\rho\left(q, q^{\prime}\right)=(1-\alpha) \cdot \min \left(\left||I_{q}-I_{q^{\prime}}\right\|, \tau_{c o l}\right)+\alpha \cdot \min \left(\left\|\nabla I_{q}-\nabla I_{q^{\prime}}\right\|, \tau_{\text {grad }}\right)\tag 5
ρ(q,q′)=(1−α)⋅min(∣∣Iq−Iq′∥,τcol)+α⋅min(∥∇Iq−∇Iq′∥,τgrad )(5)
式(5)中,
∣
∣
∇
I
q
−
∇
I
q
′
∣
∣
||\nabla I_{q}-\nabla I_{q^{\prime}}||
∣∣∇Iq−∇Iq′∣∣为
q
q
q点与
q
′
q^{\prime}
q′的梯度差的绝对值,两者的颜色差异越大,则梯度差越大,不相似度越大。
α
\alpha
α为超参数,在颜色空间和梯度之间做一个平衡。
此外,根据式(1)得到的视差
d
q
d_{q}
dq为小数,则通过
q
′
=
q
−
d
q
q_{'}=q-d_{q}
q′=q−dq计算得到的
q
′
q^{\prime}
q′为小数,颜色值
I
q
′
I_{q^{\prime}}
Iq′和颜色梯度值
∇
I
q
′
\nabla I_{q^{\prime}}
∇Iq′需要使用线性插值得到。
式(5)中,
τ
c
o
l
和
τ
g
r
a
d
\tau_{col}和\tau_{grad}
τcol和τgrad为截断参数,为了使代价值保持在一定范围内。
算法框架
通过上面的分析,PatchMatchStereo目的是在无边界平面集里找到代价最小的视差平面,PMS借鉴了PatchMatch的思路,在自然图像中,一个有一定大小的像素块内所有的像素可以用一个平面来近似。这也是PMS的基本思想,一个图像可以看做是多个像素块,每个像素块拥有一个近似的视差平面,PMS的目的是招待所有像素块的视差平面。
PMS算法流程:
1、随机初始化
为每个像素初始化一个视差平面,在视差范围内为每一个像素随机一个视差值
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}=\left(n_{x}, n_{y}, n_{z}\right)
n=(nx,ny,nz)作为平面的法线。则有:
a
f
=
−
n
x
n
z
、
b
f
=
−
n
y
n
z
、
c
f
=
n
x
x
0
+
n
y
y
0
+
n
z
z
0
n
z
(6)
a_{f} = - \frac{n_{x}}{n_{z}}、b_{f} = -\frac{n_{y}}{n_{z}}、c_{f} = \frac{n_{x}x_{0}+n_{y}y_{0}+n_{z}z_{0}}{n_{z}}\tag 6
af=−nznx、bf=−nzny、cf=nznxx0+nyy0+nzz0(6)若固定
n
⃗
=
(
0
,
0
,
1
)
\vec{n}=(0,0,1)
n=(0,0,1),则倾斜窗口退化为平行窗口,强制
z
0
z_{0}
z0为整数时,则退化为只能取整数视差值。
2、迭代传播
迭代传播的目的是将随机的所有视差平面中的少数正确的视差平面传播到同一视差平面内的其他像素。迭代传播包含以下四个步骤:(1)空间传播(Spatial Propagation)(2)视图传播(View Propagation)(3)时序传播(Temporal Propagation)(4)平面优化(Plane Refinement)。在偶数迭代中,从左上角像素开始,以主行顺序遍历像素,直到到达右下角像素。在奇数迭代中,从右下角像素开始,然后在左上角停止。运行三次迭代。运行过程如下图所示:
(1)空间传播(Spatial Propagation)
空间传播基于空间上相邻的像素可能具有相似的视差平面的假设。假设像素p所在的视差平面为 f p f_{p} fp,检查p邻域内的像素q所在平面是否更适合p,即 m ( p , f q ) < ? m ( p , f p ) m(p,f_{q})\stackrel{?}{<} m(p,f_{p}) m(p,fq)<?m(p,fp),若成立,则将 f q f_{q} fq更新为像素p的新平面。在偶数迭代中,考虑左相邻点和上相邻点,而在奇数迭代中,检查右相邻点和下相邻点。
(2)视图传播(View Propagation)
视图传播基于同名点像素对具有相似的视差平面的假设。假设像素p所在的视差平面为 f p f_{p} fp,p的同名点像素为 p ′ p^{\prime} p′, f p ′ f_{p^{\prime}} fp′为 p ′ p^{\prime} p′所在的视差平面转换为左视图坐标系后的平面,检查 m ( p , f p ′ ) < ? m ( p , f p ) m(p,f_{p^{\prime}})\stackrel{?}{<} m(p,f_{p}) m(p,fp′)<?m(p,fp),若成立,则将 f p ′ f_{p^{\prime}} fp′更新为像素p的新平面,其核心思想为:同名点之间的视差平面应该是一致的,如果不一致,那使用代价聚合最低的视差平面作为视差平面。
(3)时序传播(Temporal Propagation)
时序传播仅用于视频序列的立体匹配,基于相邻帧的同一位置的像素可能具有相似的视差平面的假设。假设像素p所在的视差平面为 f p f_{p} fp,前后帧相同位置点像素为 p ′ p^{\prime} p′, f p ′ f_{p^{\prime}} fp′为 p ′ p^{\prime} p′所在的视差平面,检查 m ( p , f p ′ ) < ? m ( p , f p ) m(p,f_{p^{\prime}})\stackrel{?}{<} m(p,f_{p}) m(p,fp′)<?m(p,fp),若成立,则将 f p ′ f_{p^{\prime}} fp′更新为像素p的新平面。
(4)随机分配
平面优化是为了通过优化视差平面 f p f_{p} fp的参数进一步减少像素p的聚合代价 m ( p , f p ) m(p, f_{p}) m(p,fp),其核心思想是在已有的视差平面向量的参数基础上,在设定的搜索空间中使用二分查找,查找更好的法向量来更新当前的视差平面,步骤如下:
- 将 f p f_{p} fp平面方程转换为点和法向量的表达形式;
- 设置两个参数 Δ z 0 max 和 Δ n max \Delta_{z_{0}}^{\max }和\Delta_{n}^{\max } Δz0max和Δnmax。其中 Δ z 0 max \Delta_{z_{0}}^{\max } Δz0max表示点 P ( x 0 , y 0 , z 0 ) P(x_{0}, y_{0}, z_{0}) P(x0,y0,z0)的z坐标的可变范围, Δ n max \Delta_{n}^{\max } Δnmax为法向量 n ⃗ \vec{n} n各分量的可变范围;
- 初始值 Δ z 0 max = maxdisp / 2 \Delta_{z 0}^{\max }=\text { maxdisp } / 2 Δz0max= maxdisp /2,(maxdisp为设置的最大视差值)、 Δ n max = 1 \Delta_{n}^{\max }=1 Δnmax=1。
- 当 Δ z 0 max > 0.1 \Delta_{z 0}^{\max }> 0.1 Δz0max>0.1执行循环。
- 在 [ − Δ z 0 max , Δ z 0 max ] \left[-\Delta_{z 0}^{\max }, \Delta_{z 0}^{\max }\right] [−Δz0max,Δz0max]范围内随机生成1个值 Δ z 0 \Delta_{z_{0}} Δz0加到 z 0 z_{0} z0上,有: z 0 ′ = z 0 + Δ z 0 z_{0}^{\prime}=z_{0}+\Delta_{z_{0}} z0′=z0+Δz0,得到新的点 P ′ ( x 0 , y 0 , z 0 ′ ) P^{\prime}\left(x_{0}, y_{0}, z_{0}^{\prime}\right) P′(x0,y0,z0′);
- 在 [ − Δ z 0 max , Δ z 0 max ] \left[-\Delta_{z 0}^{\max }, \Delta_{z 0}^{\max }\right] [−Δz0max,Δz0max]范围内随机生成3个值 Δ n ⃗ \vec{\Delta_{n}} Δn,计算新的法向量 n ′ → = u ( n ⃗ + Δ n ⃗ ) \overrightarrow{n^{\prime}}=u\left(\vec{n}+\vec{\Delta_{n}}\right) n′=u(n+Δn), u u u取单位向量。新的点 P ′ P^{\prime} P′和新的法向量 n ′ → \overrightarrow{n^{\prime}} n′组成新的平面 f p ′ f_{p^{\prime}} fp′, m ( p , f p ′ ) < ? m ( p , f p ) m(p,f_{p^{\prime}})\stackrel{?}{<} m(p,f_{p}) m(p,fp′)<?m(p,fp),若成立,则将 f p ′ f_{p^{\prime}} fp′更新为像素p的新平面;
- 设置 Δ z 0 max = Δ z 0 max / 2 、 Δ n max = Δ n max / 2 \Delta_{z 0}^{\max }=\Delta_{z 0}^{\max } / 2 、 \Delta_{n}^{\max }=\Delta_{n}^{\max } / 2 Δz0max=Δz0max/2、Δnmax=Δnmax/2,减小搜索空间,跳转到第5步。
3、后处理
后处理操作包括一致性检查和视差填充。
- 通过左右一致性检查进行咬合处理。对于每个像素 p p p,计算其在另外一个视图的匹配点 p ′ p^{\prime} p′,检查 ∣ d p − d p ′ ∣ ≤ 1 |d_{p}-d_{p^{\prime}}|\le 1 ∣dp−dp′∣≤1,若不成立,则像素p无效。
- 填充无效视差,对于一个无效的视差p,向左和向右侧搜索最近有效像素,记录两个点的平面
f
l
f^{l}
fl和
f
r
f^{r}
fr,分别用
f
l
f^{l}
fl和
f
r
f^{r}
fr来计算p点的视差值,选择视差值小的平面f作为p点的平面(选择较低视差的原因在于遮挡发生在背景处,选择离镜头比较近的点所在的平面来计算无效点的视差),该填充方案外推了平面,而不是像通常那样复制恒定的视差。因此,也可以在这个阶段正确地处理倾斜的表面。然而,该策略在视差图中生成水平条纹(因为只考虑了水平的方向来填充无效点)。为了减弱这个问题,我们对填充的视差应用加权中值滤波器。中值滤波器的权重掩模由等式(4)所示:
w ( p , q ) = e − ∥ I p − I q ∥ γ w(p, q)=e^{-\frac{\left\|I_{p}-I_{q}\right\|}{\gamma}} w(p,q)=e−γ∥Ip−Iq∥
γ \gamma γ和窗口大小和前面使用相同的设置。(时序信号使用3D加权中值滤波器),所有在左/右一致性检查中幸存的像素不受此操作的影响。后处理之前和之后的视差图如图下图所示:
小结
- PatchMatchStereo区别于传统的立体匹配算法,模型不是直接估计视差而是估计该像素点所在的最优视差平面。
- PatchMatchStereo具有两个优点:(1)可计算亚像素视差;(2)可以处理倾斜表面和较好地拟合曲面;
- 由于需要迭代传播,算法时间复杂度较高,算法运行效率较低。