文章目录
预备知识
代价空间
C
A
D
(
x
,
y
,
d
)
=
∣
I
L
(
x
,
y
)
−
I
R
(
x
−
d
,
y
)
∣
C_{A D}(x, y, d)=\left|I_{L}(x, y)-I_{R}(x-d, y)\right|
CAD(x,y,d)=∣IL(x,y)−IR(x−d,y)∣
d是移动像素的大小。以左图为基准。下面以左图的一个像素点P为例
- d=0,右图不移动,计算 C A D 0 C_{AD0} CAD0
- d=1,右图向右移动一个像素点,再计算 C A D 1 C_{AD1} CAD1
- d=2,右图向右移动一个像素点,再计算 C A D 2 C_{AD2} CAD2
- …(d++,不断执行)…
- 最后得到代价空间
代价聚合
🔥目的:对代价空间进行滤波,使边界平滑
Box Filtering(均值滤波)
C d A ( p ) = 1 N ∑ q C d ( q ) C_{d}^{A}(p)=\frac{1}{N} \sum_{q} C_{d}(q) CdA(p)=N1q∑Cd(q)
N:窗口像素个数
效果:
Bilateral filter
Bilateral filter就是输入的代价,乘以一个高斯函数,实现平滑
效果:
Cross-based local stereo matching(自适应形状)
任意选取一个像素点,横向、纵向扩张,直到遇到颜色差异较大的地方才停下来。然后在扩张后的像素点,重复上述操作。这样,因为能及时发现边界,就能大概判断出一整块区域
的视差图
🚀Semi-Global Matching
能量函数
E
(
D
)
=
∑
p
(
C
(
p
,
D
p
)
+
∑
q
∈
N
p
P
1
T
[
∣
D
p
−
D
q
∣
=
1
]
+
∑
q
∈
N
p
P
2
T
[
∣
D
p
−
D
q
∣
>
1
]
)
\begin{aligned} E(D)=& \sum_{\mathbf{p}}\left(C\left(\mathbf{p}, D_{\mathbf{p}}\right)+\sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{1} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|=1\right]\right. &\left.+\sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{2} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|>1\right]\right) \end{aligned}
E(D)=p∑
C(p,Dp)+q∈Np∑P1 T[∣Dp−Dq∣=1]+q∈Np∑P2 T[∣Dp−Dq∣>1]
当 D p − D q = 1 D_p-D_q = 1 Dp−Dq=1时,我们就取 ∑ q ∈ N p P 1 T [ ∣ D p − D q ∣ = 1 ] \sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{1} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|=1\right] ∑q∈NpP1 T[∣Dp−Dq∣=1]
当 D p − D q > 1 D_p-D_q > 1 Dp−Dq>1,我们就取 ∑ q ∈ N p P 2 T [ ∣ D p − D q ∣ > 1 ] \sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{2} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|>1\right] ∑q∈NpP2 T[∣Dp−Dq∣>1]
优化步骤
-
计算代价空间;(AD, BT, Census, MI, ….)
-
代价聚合
方向r上的路径代价
L r ( p , d ) = C ( p , d ) + min ( L r ( p − r , d ) L r ( p − r , d − 1 ) + P 1 L r ( p − r , d + 1 ) + P 1 min i L r ( p − r , i ) + P 2 ) − min k L r ( p − r , k ) \begin{aligned} L_{\mathbf{r}}(\mathbf{p}, d)=& C(\mathbf{p}, d)+\min \left(L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, d)\right.\\ & L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, d-1)+P_{1} \\ & L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, d+1)+P_{1} \\ &\left.\min _{i} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, i)+P_{2}\right)-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) \end{aligned} Lr(p,d)=C(p,d)+min(Lr(p−r,d)Lr(p−r,d−1)+P1Lr(p−r,d+1)+P1iminLr(p−r,i)+P2)−kminLr(p−r,k)
当d=0时, L r ( p , d ) = C ( p , d ) − min k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)−minkLr(p−r,k)当|d|=1时, L r ( p , d ) = C ( p , d ) + P 1 − min k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)+P_1-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)+P1−minkLr(p−r,k)
当|d|=i时, L r ( p , d ) = C ( p , d ) + P 2 − min k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)+P_2-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)+P2−minkLr(p−r,k)
L r ( p − r , d ) L_r(p-r,d) Lr(p−r,d)是该像素点左侧,最优代价。即当d=i时,左侧有最优代价,那么就 C ( p , d ) + P 2 C(\mathbf{p}, d)+P_2 C(p,d)+P2
各个方向的总聚合代价
S ( p , d ) = ∑ L r ( p , d ) S(\mathbf{p}, d)=\sum L_{\mathbf{r}}(\mathbf{p}, d) S(p,d)=∑Lr(p,d)
例如opencv收录的sgbm算法,就是计算了下面5条路径的代价 -
WTA
Winner-Take-All,赢家通吃
即我们发现在这条视差方向r上,纵轴(聚合后的代价)最小,那么我们就取出视差值(d=18)
-
视差后处理