论文地址:On Building an Accurate Stereo Matching System on Graphics Hardware
问题提出
基于SGM的方法速度快,但精度不高,基于PMS算法的精度高,但速度慢,为此提出一个在精度和速度取一个平衡的算法。AD-census算法将局部算法和版局部算法相结合,包含一下四个步骤:1、初始代价计算;2、代价聚合;3、扫描线优化;4、视差优化;
算法框架
1、初始代价计算
AD-Census结合了AD(Absolute Different)法和Census法来计算全图的初始匹配代价。
AD算法如式1所示:
C
A
D
(
p
,
d
)
=
1
3
∑
i
=
R
,
G
,
B
∣
I
i
l
e
f
t
(
p
)
−
I
i
r
i
g
h
t
(
p
d
)
∣
(1)
C_{A D}(p, d)=\frac{1}{3} \sum_{i=R, G, B}\left|I_{i}^{left}(p)-I_{i}^{right}(p^{d})\right|\tag1
CAD(p,d)=31i=R,G,B∑
Iileft(p)−Iiright(pd)
(1)
C
A
D
(
p
,
d
)
C_{A D}(p, d)
CAD(p,d)表示左视图p点和视差为d时对应右视图
p
d
p^{d}
pd点之间三个颜色分量差的绝对值的平均值,若左右视图为灰度图像,则直接计算像素灰度值之差的绝对值。
Census算法是基于窗口计算局部特征的方法,分别计算左右窗口中邻域像素和中心像素的大小关系,展开为1维后使用汉明距离计算两个窗口之间的距离。窗口特征计算如式2所示:
C
s
(
x
,
y
)
=
⨂
i
=
−
n
′
n
′
⨂
j
=
−
m
′
m
′
ξ
(
I
(
x
,
y
)
,
I
(
x
+
i
,
y
+
j
)
)
(2)
C_{s}(x, y)=\bigotimes_{i=-n^{\prime}}^{n^{\prime}} \bigotimes_{j=-m^{\prime}}^{m^{\prime}} \xi(I(x, y), I(x+i, y+j))\tag2
Cs(x,y)=i=−n′⨂n′j=−m′⨂m′ξ(I(x,y),I(x+i,y+j))(2)
上式表示计算
(
x
,
y
)
(x,y)
(x,y)处,窗口大小为
n
′
∗
m
′
n^{\prime}*m^{\prime}
n′∗m′的特征,其中,
ξ
(
x
,
y
)
\xi(x, y)
ξ(x,y)如式3所示:
ξ
(
x
,
y
)
=
{
0
if
x
≤
y
1
if
x
>
y
(3)
\xi(x, y)=\left\{\begin{array}{ll} 0 & \text { if } x \leq y \\ 1 & \text { if } x>y \end{array}\right.\tag3
ξ(x,y)={01 if x≤y if x>y(3)
census算法基于汉明距离计算点
(
x
,
y
)
(x,y)
(x,y)和视差为d的右视图点
(
x
−
d
,
y
)
(x-d, y)
(x−d,y)的匹配代价如式4所示:
C
(
x
,
y
,
d
)
=
Hamming
(
C
s
l
(
x
,
y
)
,
C
s
r
(
x
−
d
,
y
)
)
(4)
\mathrm{C}(x, y, d)=\operatorname{Hamming}\left(C_{s l}(x, y), C_{s r}(x-d, y)\right)\tag4
C(x,y,d)=Hamming(Csl(x,y),Csr(x−d,y))(4)
Census算法基于窗口内的相对亮度差计算匹配代价,对左右视图光照不一致和噪声具有较强的鲁棒性,对弱纹理区域也具有较好的效果,但Census算法对于重复的纹理区域会产生歧义,而AD算法是基于单像素邻域亮度来计算匹配代价,可以在一定程度上缓解重复纹理的歧义性问题。
AD-Census算法将AD算法和Census算法结合,为了解决尺度不一致问题(AD算法基于亮度差,范围为[0-255],Census算法基于汉明距离,范围为[0, N], N为窗口中心点的邻域元素个数),需要将两个代价归一化到同一个区间内,如式5所示:
C
(
p
,
d
)
=
ρ
(
C
c
e
n
s
u
s
(
p
,
d
)
,
λ
c
e
n
s
u
s
)
+
ρ
(
C
A
D
(
p
,
d
)
,
λ
A
D
)
(5)
\begin{aligned} C(\mathbf{p}, d)=& \rho\left(C_{c e n s u s}(\mathbf{p}, d), \lambda_{c e n s u s}\right)+ \rho\left(C_{A D}(\mathbf{p}, d), \lambda_{A D}\right) \end{aligned}\tag5
C(p,d)=ρ(Ccensus(p,d),λcensus)+ρ(CAD(p,d),λAD)(5)
其中归一化函数
ρ
(
c
,
λ
)
\rho(c, \lambda)
ρ(c,λ)如式6所示,其中
λ
\lambda
λ为控制参数,将AD算法算出的结果和Census算法算出的结果都归一化到[0, 1]的范围内,
C
(
p
,
d
)
C(p, d)
C(p,d) 的范围为 [0, 2]。
ρ
(
c
,
λ
)
=
1
−
exp
(
−
c
λ
)
(6)
\rho(c, \lambda)=1-\exp \left(-\frac{c}{\lambda}\right)\tag6
ρ(c,λ)=1−exp(−λc)(6)
AD-Census效果如图1:
2、十字交叉域代价聚合
十字交叉域代价聚合在论文《Cross-Based Local Stereo Matching Using Orthogonal Integral Images》中提出,这种代价聚合方式基于相邻颜色相近的像素视差值相似的假设,CBCA的目标是找到像素p周围和p像素颜色相近的像素集合,并使用像素集求p点的聚合代价。原始的十字交叉域代价聚合包含两个步骤:1、十字交叉域构造(cost construction)2、支撑区域代价聚合(cost aggregation)
(1)十字交叉域构造
十字交叉域表示每个像素都有一个十字臂,臂上的所有像素颜色(亮度)和该像素颜色(亮度)相近。基于p点构建十字交叉域时,确定上下左右四点的十字骨架,由像素相似性来确定骨架长度,骨架满足尽可能长,且骨架内的像素和p点的像素差值不超过设定的阈值。同理,由p沿着竖向骨架遍历q点产生横臂。其构造方式瞒住两个规则:
- 像素的十字臂以像素为中心往左右及上下延伸,碰到颜色(亮度)和该像素差别大于 τ \tau τ 时停止延伸。
- 臂长度小于设定的最大长度
L
L
L 。
其中颜色差异衡量如式7所示:
D c ( p l , p ) = max i = R , G , B ∣ I i ( p l ) − I i ( p ) ∣ (7) D_{c}\left(p_{l}, p\right)=\max _{i=R, G, B}\left|I_{i}\left(p_{l}\right)-I_{i}(p)\right|\tag7 Dc(pl,p)=i=R,G,Bmax∣Ii(pl)−Ii(p)∣(7)
距离差异衡量如式8:
D s ( p l , p ) = ∣ p l − p ∣ (8) D_{s}\left(p_{l}, p\right)=\left|p_{l}-p\right|\tag8 Ds(pl,p)=∣pl−p∣(8)
当目标像素p的十字交叉臂构建完成后,基于十字交叉臂构建支撑区域:
遍历十字交叉臂的竖直臂上的点q,基于每个q构建横臂 H ( q ) H(q) H(q),所有 H ( q ) H(q) H(q)的并集的点记为p点的支撑区域(support region)。
(2)支撑区域代价聚合
当像素p的支撑区域构造完之后,对不同的视差d层,分两步进行代价聚合:
- 对十字臂上所有像素,将其水平臂上的像素代价值相加,存储为临时值;
- 对十字臂上所有像素,将其竖直臂上的像素在第一步存储的临时值相加,得到该像素最终的聚合代价值,为了消除支撑区域大小对聚合代价值的影响,将聚合代价除以支撑域的总像素数,一般迭代4次,得到较好的效果。
(3)AD-Census改进版十字交叉域构造
十字交叉域构建过程中,颜色差异阈值 τ \tau τ 和最长臂长阈值 L L L 起着决定性作用,在大的弱纹理区域,需要使用更大的 L L L 和 τ \tau τ 值来得到邻域中更多的信息的像素,让结果更稳健 ,但简单增大 L L L 和 τ \tau τ 会在视差非连续区域带来更多的噪声。基于此,AD-Census改进的规则如下(以左臂延伸为例):
- D c ( p l , p ) < τ 1 and D c ( p l , p 1 + ( 1 , 0 ) ) < τ 1 D_{c}\left(p_{l}, p\right)<\tau_{1} \text { and } D_{c}\left(p_{l}, p_{1}+(1,0)\right)<\tau_{1} Dc(pl,p)<τ1 and Dc(pl,p1+(1,0))<τ1
- D s ( p l , p ) < L 1 D_{s}\left(p_{l}, p\right)<L_{1} Ds(pl,p)<L1
- D c ( p l , p ) < τ 2 , if L 2 < D s ( p l , p ) < L 1 , S . T . τ 2 < τ 1 a n d L 2 < L 1 D_{c}\left(p_{l}, p\right)<\tau_{2}, \text { if } L_{2}<D_{s}\left(p_{l}, p\right)<L_{1},\quad S.T.\;\; \tau_{2}<\tau_{1}\quad and\quad L_{2}<L_{1} Dc(pl,p)<τ2, if L2<Ds(pl,p)<L1,S.T.τ2<τ1andL2<L1
规则1增加了前向扩展过程中,相邻像素的差异不能大于阈值 τ 1 \tau_{1} τ1避免扩展过程中穿过边缘像素。规则2中的 L 1 L_{1} L1 比原来的 L更大,使得在弱纹理区域可以包含很大的区域,但增加了规则3来限制,当阈值大于距离阈值 L 2 L_{2} L2 时小心地拓展,需要满足颜色差异小于更小的颜色阈值 τ 2 \tau_{2} τ2 时才能继续扩展臂长,但臂长要限定在 L 1 L_{1} L1内。改进后的规则可以避免臂的延伸穿过边缘像素,同时使弱纹理有更长的臂同时又不会让所有像素的臂过长。
(4)AD-Census改进版代价聚合
原来的代价聚合迭代4次,都是先对水平方向进行求和,再对竖直方向进行求和。而AD-Census中,在奇数迭代次数中先横向求和,再竖向求和;在偶数迭代次数中先竖向求和,再横向求和,如此交替进行,会得到更加鲁棒的聚合结果。
3、扫描线优化
AD-Census学习了SGM的代价聚合方式,想要进一步提高代价的准确性,减少匹配错误(在SGM中此步骤称为代价聚合),优化的方向为4个方向,左右上下。像素p沿着r方向的优化公式如式9所示:
C
r
(
p
,
d
)
=
C
1
(
p
,
d
)
+
min
[
C
r
(
p
−
r
,
d
)
C
r
(
p
−
r
,
d
−
1
)
+
P
1
C
r
(
p
−
r
,
d
+
1
)
+
P
1
min
i
C
r
(
p
−
r
,
i
)
+
P
2
]
−
min
k
L
r
(
p
−
r
,
k
)
(9)
C_{r}(p, d)=C_{1}(p, d)+\min \left[\begin{array}{c} C_{r}(p-r, d) \\ C_{r}(p-r, d-1)+P_{1} \\ C_{r}(p-r, d+1)+P_{1} \\ \underset{i}{\min} C_{r}(p-r, i)+P_{2} \end{array}\right]-\min_{k} L_{r}(p-r, k)\tag9
Cr(p,d)=C1(p,d)+min
Cr(p−r,d)Cr(p−r,d−1)+P1Cr(p−r,d+1)+P1iminCr(p−r,i)+P2
−kminLr(p−r,k)(9)
其中r表示路径聚合方向上单位步长,
p
−
r
p-r
p−r 表示路径上前一个像素。第一项为匹配代价,属于数据项;第二项是平滑项,
C
r
(
p
−
r
,
d
)
C_{r}(\mathrm{p}-\mathrm{r}, d)
Cr(p−r,d) :表示如果路径上前一个像素的最优视差和当前像素的最优视差相同,则不加惩罚;
C
r
(
p
−
r
,
d
−
1
)
+
P
1
和
C
r
(
p
−
r
,
d
+
1
)
+
P
1
C_{r}(\mathrm{p}-\mathrm{r}, d-1)+P_{1}和C_{r}(\mathrm{p}-\mathrm{r}, d+1)+P_{1}
Cr(p−r,d−1)+P1和Cr(p−r,d+1)+P1 :表示如果路径上前一个像素的最优视差和当前像素的最优视差相差1,则做
P
1
P_{1}
P1惩罚、
min
i
C
r
(
p
−
r
,
i
)
+
P
2
\min _{i} C_{r}(\mathrm{p}-\mathrm{r}, i)+P_{2}
miniCr(p−r,i)+P2:表示表示如果路径上前一个像素的最优视差和当前像素的最优视差相差大于1,则做
P
2
P_{2}
P2惩罚,取三者中的最小值;第三项是为了保证新的路径代价不超过数值上限。
AD-Census在
P
1
和
P
2
′
P_{1} 和 P^{\prime}_{2}
P1和P2′ 的设定上进行改进,在SGM中,这两个值是预设的固定值,式9中所用的
P
2
P_{2}
P2是根据
P
2
=
P
2
′
I
p
−
I
q
P_{2}=\frac{P^{\prime}_{2}}{I_{p}-I_{q}}
P2=Ip−IqP2′自适应调整的。而在AD-Census中,
P
1
和
P
2
P_{1} 和 P_{2}
P1和P2 不只与左视图的相邻像素点之间的颜色(灰度)差
D
1
=
D
c
(
p
,
p
−
r
)
D_{1}=D_{c}(p, p-r)
D1=Dc(p,p−r)有关,还与右视图对应同名点
p
d
p_{d}
pd 的相邻像素颜色(灰度)差
D
2
=
D
c
(
p
d
,
p
d
−
r
)
D_{2}=D_{c}(p_{d}, p_{d}-r)
D2=Dc(pd,pd−r)有关。具体规则如下:
- P 1 = Π 1 , P 2 = Π 2 , i f D 1 < τ S O a n d D 2 < τ S O P_{1}=\Pi_{1}, \;\;\;\;\;P_{2}=\Pi_{2} ,\;\;\;\;\; \;if \;D_{1}<\tau_{S O} \;and\;D_{2}<\tau_{S O} P1=Π1,P2=Π2,ifD1<τSOandD2<τSO
- P 1 = Π 1 / 4 , P 2 = Π 2 / 4 , i f D 1 < τ S O a n d D 2 > τ S O P_{1}=\Pi_{1} / 4, \;\;P_{2}=\Pi_{2} / 4 ,\;\; if \;D_{1}<\tau_{S O}\;and\; D_{2}>\tau_{S O} P1=Π1/4,P2=Π2/4,ifD1<τSOandD2>τSO
- P 1 = Π 1 / 4 , P 2 = Π 2 / 4 , i f D 1 > τ S O a n d D 2 < τ S O P_{1}=\Pi_{1} / 4,\;\; P_{2}=\Pi_{2} / 4 ,\;\; if \;D_{1}>\tau_{S O}\;and\;D_{2}<\tau_{S O} P1=Π1/4,P2=Π2/4,ifD1>τSOandD2<τSO
- P 1 = Π 1 / 10 , P 2 = Π 2 / 10 , i f D 1 > τ S O a n d D 2 > τ S O P_{1}=\Pi_{1} / 10, P_{2}=\Pi_{2} / 10 ,\; if \;D_{1}>\tau_{S O}\;and\;D_{2}>\tau_{S O} P1=Π1/10,P2=Π2/10,ifD1>τSOandD2>τSO
其中, Π 1 、 Π 2 \Pi_{1}、\Pi_{2} Π1、Π2为设定的固定阈值, τ S O \tau_{S O} τSO为设定的颜色差阈值。四条规则分别代表什么意义?首先明确, P 1 和 P 2 P_{1}和P_{2} P1和P2是在路径前一个点取最小代价的视差值和当前点的视差值相差1以上时才给于惩罚(相邻点视差值应该相似,但是现在路径上一个点和当前点的视差值不一致,所以要给予惩罚)。
- 规则1表示,该点在左右视图上和路径上前一个点的颜色差异都很小,理论上前一个点和当前点的应该处于同一个视差平面,视差应该一样。但是很违背常理,前一个点和当前点的视差相差1以上,所以 P 1 和 P 2 P_{1}和P_{2} P1和P2 给个最大的惩罚。
- 规则2和3表示,该点在左右视图的同名点中有一个点和路径上前一个点的颜色差异很小,另一个点和前一个点的差异挺大,说明有一定的概率这个点可能是边缘点,所以视差有差异是可以原谅的,所以给的惩罚比规则1的小。
- 规则4表示,该点在左右视图上,都与路径上前一个像素点的颜色差异很大,说明大概率这个点是边缘点,所以大概率视差有差异的,是正常状况,所以给个较小的惩罚。
最后,四个方向的优化代价取平均值,赋给像素p,如式10所示:
C
2
(
p
,
d
)
=
1
4
∑
r
C
r
(
p
,
d
)
(10)
C_{2}(\mathbf{p}, d)=\frac{1}{4} \sum_{\mathbf{r}} C_{\mathbf{r}}(\mathbf{p}, d)\tag{10}
C2(p,d)=41r∑Cr(p,d)(10)
4、视差优化
(1)离群点检测(Outlier Dectection)
这里的离群点检测就是左右一致性检查,将不匹配点分为遮挡区域(occlusion region)和误匹配区域(mismatch region)。
(2)局部迭代投票(Iterative region Voting)
对于无效像素p的十字交叉支撑域内所有可靠像素,统计
[
0
,
d
m
a
x
]
[0, d_{max}]
[0,dmax]范围视差分布直方图
H
p
H_{p}
Hp(直方图高度为像素个数),数量最多的视差值记为
d
p
∗
d^{*}_{p}
dp∗,可靠像素数量记为
S
p
S_{p}
Sp。如果可靠像素的数量足够多,且得票最多的视差值得票足够多,则把
d
p
∗
d^{*}_{p}
dp∗ 赋值给p像素。即如式11所示:
d
p
:
=
d
p
∗
i
f
S
p
>
τ
S
a
n
d
H
p
(
d
p
∗
)
S
p
>
τ
H
(11)
d_{p} := d^{*}_{p}\;\;\;if\;S_{\mathbf{p}}>\tau_{S}\;and\; \frac{H_{\mathbf{p}}\left(d_{\mathbf{p}}^{*}\right)}{S_{\mathbf{p}}}>\tau_{H}\tag{11}
dp:=dp∗ifSp>τSandSpHp(dp∗)>τH(11)
式中,
τ
S
和
τ
H
\tau_{S}和\tau_{H}
τS和τH为预设的阈值,以上步骤迭代5次,每次迭代成功赋值的像素p设置为可靠像素,为下一轮迭代提供有效的视差值。
(3)Proper Interpolation(视差填充)
对于保留下来的无效像素p,在一定范围内沿周围16个方向搜索最近的可靠像素的视差值:对于遮挡区域像素p,选择所有搜索到的可靠像素的视差中最小的值(因为遮挡像素一般在背景,背景离相机远,也就是视差小)。对于误匹配像素p,在搜索到的可靠像素的集合中选择和p颜色最相近的像素的视差赋值给p;经过(2)和(3)的实验结果如下图所示:
(4)视差非连续区域调整(Depth Discontinuity Adjustment)
此步的目的是进一步优化视差非连续区域的视差值。
- 对视差图做边缘检测。
- 对于边缘上的像素p,其视差值为
D
p
D_{p}
Dp,记录其左右两边像素
p
l
和
p
r
p_{l}和p_{r}
pl和pr 的视差值
D
p
l
和
D
p
r
D_{p_{l}}和D_{p_{r}}
Dpl和Dpr ,如果该边缘点左右两点的视差对应的匹配代价比边缘点对应视差的匹配代价小,则用最小的匹配代价的点的视差来替代边缘点的视差。也就是对边缘上的像素值进行微调,选择左右两边使其代价更小的那个视差值。实验结果如下图所示:
(5)子像素优化(sub-pixel Enhancement)
子像素优化用一元二次拟合。如式11所示:
d
∗
=
d
−
C
2
(
p
,
d
+
)
−
C
2
(
p
,
d
−
)
2
(
C
2
(
p
,
d
+
)
+
C
2
(
p
,
d
−
)
−
2
C
2
(
p
,
d
)
)
(11)
d^{*}=d-\frac{C_{2}\left(\mathbf{p}, d_{+}\right)-C_{2}\left(\mathbf{p}, d_{-}\right)}{2\left(C_{2}\left(\mathbf{p}, d_{+}\right)+C_{2}\left(\mathbf{p}, d_{-}\right)-2 C_{2}(\mathbf{p}, d)\right)}\tag{11}
d∗=d−2(C2(p,d+)+C2(p,d−)−2C2(p,d))C2(p,d+)−C2(p,d−)(11)
式中
d
=
D
L
(
p
)
,
d
+
=
d
+
1
,
d
−
=
d
−
1
d=D_{L}(p), d_{+}=d+1, d_{-}=d-1
d=DL(p),d+=d+1,d−=d−1。