【立体匹配】Stereo Processing by Semiglobal Matching and Mutual Information(SGM)

Stereo Processing by Semiglobal Matching and Mutual Information

基于半全局匹配和互信息的立体处理

摘要

本文描述了半全局匹配的立体算法。该算法采用逐像素的基于互信息的匹配代价补偿不同亮度的输入图像。逐像素匹配通过一个平滑约束支持,平滑约束通常表示为全局代价函数。SGM通过从各个方向进行逐像素优化来执行快速近似。讨论还这几到遮挡检测、亚像素求精和多基线匹配。此外,还提出了去除离群值、从结构化环境的特殊问题中恢复以及提出了间隙插值方法。最后,提出了几乎任意大小图像的处理策略和通过正交投影进行视差图像融合的策略。对标准立体图像的比较表明,SGM算法是目前在排名最靠前的算法之中,并且在考虑亚像素的情况下是最好的一个。算法复杂度与像素的数量和视差范围成线性关系,这使得在典型测试图像上的运算时间只有1-2秒。基于MI的匹配代价的深度评估证明了对广泛的亮度变化有较好的容忍度。最后,通过对大型航拍和推扫图像的重建实例验证了本文提出的方法在实际问题中的有效性

1 介绍

2 半全局匹配

半全局匹配方法是基于互信息的逐像素匹配的思想和近似全局,通过结合多个一维约束条件得到的二维平滑约束。该算法采用不同的处理步骤进行描述。其中一些步骤是可选的,这取决于应用情况。

2.1 逐像素匹配代价计算

输入图像被假定已知其中的对极几何模型,但是并不需要是被校正过的,因为有些情况是难以被校正的。例如推扫式图像中。由于平行投影在运动方向上,透视投影与运动方向正交,线性运动使极线变成双曲线[21]非线性运动在航空影像中是不可避免的,导致极线成为一般的曲线和图像不能够被校正[22]
要计算参考图像中某一像素点 p \mathbf{p} p 的匹配代价,需要用到其灰度 I b p I_{b\mathbf{p}} Ibp ,及在待匹配图像的疑似匹配点 q \mathbf{q} q 的灰度 I m q I_{m\mathbf{q}} Imq ,通过 q = e b m ( p , d ) \mathbf{q}=e_{bm}(\mathbf{p},d) q=ebm(p,d) 。函数 e b m ( p , d ) e_{bm}(\mathbf{p},d) ebm(p,d) 代表参考图像中像素 p \mathbf{p} p 和极线参数 d d d 下匹配图像中的极线。对于校正后的图像,且匹配图像在参考图像的右侧,则 e b m ( p , d ) = [ p x − d , p y ] e_{bm}(\mathbf{p},d)=[p_{x}-d,p_{y}] ebm(p,d)=[pxd,py] ,且 d d d 代表视差。
一个重要的方面是考虑匹配区域的大小和形状。匹配的鲁棒性随面积的增大而增强。然而,面积增大后会出现不连续的位置,在不连续位置上违反了视差在区域内恒定的假设,这将导致模糊了物体边界和精细结构。某些形状和技术能够用于减少模糊,但是模糊不能避免[8]。因此,这里不使用在 p \mathbf{p} p 邻域内视差恒定的假设。也就是说只有 I b p I_{b\mathbf{p}} Ibp I m q I_{m\mathbf{q}} Imq 这两个灰度值被用于计算匹配代价。
逐像素代价计算的一个选择是 Brichfield 和 Tomasi 提出的采样不敏感测量[2](简称BT )。代价 C B T ( p , d ) C_{BT}(\mathbf{p},d) CBT(p,d) 通过极线中在每一个方向上的半个像素范围内的像素 p \mathbf{p} p 和像素 q = e b m ( p , d ) \mathbf{q}=e_{bm}(\mathbf{p},d) q=ebm(p,d)的最小灰度差的绝对值进行计算。
另一种匹配代价计算是基于互信息(MI,Mutual Information)[4],它对记录和光照变化不明显。互信息由两个图像各自的熵 H H H以及他们的联合熵来定义:

M I I 1 , I 2 = H I 1 + H I 2 − H I 1 , I 2 MI_{I_{1},I_{2}}=H_{I_{1}}+H_{I_{2}}-H_{I_{1},I_{2}} MII1,I2=HI1+HI2HI1,I2

熵是通过计算相关图像的概率分布 P P P得到:

H I = − ∫ 0 1 P I ( i ) log ⁡ P I ( i ) d i H_{I}=-\int_{0}^{1}P_{I}(i)\log{P_{I}(i)di} HI=01PI(i)logPI(i)di

H I 1 , I 2 = − ∫ 0 1 ∫ 0 1 P I 1 , I 2 ( i 1 , i 2 ) log ⁡ P I 1 , I 2 ( i 1 , i 2 ) d i 1 d i 2 H_{I_{1},I_{2}}=-\int_{0}^{1}\int_{0}^{1}P_{I_{1},I_{2}}(i_{1},i_{2})\log{P_{I_{1},I_{2}}(i_{1},i_{2})di_{1}di_{2}} HI1,I2=0101PI1,I2(i1,i2)logPI1,I2(i1,i2)di1di2

对于配准良好的图像,联合熵 H I 1 , I 2 H_{I_{1},I_{2}} HI1,I2较低因为一个图像能够被另一幅图像预测,这与低信息相对应。这增加了他们的互信息。在立体匹配的情况下,一幅图像需根据视差图像 D D D来进行修正,为了匹配另一幅图像,使得两幅图像中对应的像素处于相同的位置,也就是 I 1 = I b I_{1}=I_{b} I1=Ib 而且 I 2 = f D ( I m ) I_{2}=f_{D}(I_{m}) I2=fD(Im)
式(1)对整个图像进行计算并且需要有一个先验的视差图。同时防止MI的使用变成逐像素匹配代价。kim等人[6]利用泰勒展开将联合熵 H I 1 , I 2 H_{I_{1},I_{2}} HI1,I2的计算转化为对像素的求和运算。有关推导的细节,请参阅他们的论文。因此,联合熵的计算表示为一个依赖于像素 p \mathbf{p} p对应灰度的数据项的和的形式:

H I 1 , I 2 = ∑ p h I 1 , I 2 ( I 1 p , I 2 p ) . H_{I_{1},I_{2}}=\sum_{\mathbf{p}}h_{I_{1},I_{2}}(I_{1\mathbf{p}},I_{2\mathbf{p}}). HI1,I2=phI1,I2(I1p,I2p).

数据项 h I 1 , I 2 h_{I_{1},I_{2}} hI1,I2由对应灰度的联合概率分布 P I 1 , I 2 P_{I_{1},I_{2}} PI1,I2计算。对应像素的个数为 n n n。通过一个二维高斯卷积(由 ⊗ g ( i , k ) \otimes{g(i,k)} g(i,k))有效的执行Parzen估计[6]

h I 1 , I 2 ( i , k ) = − 1 n log ⁡ ( P I 1 , I 2 ( i , k ) ⊗ g ( i , k ) ) ⊗ g ( i , k ) . h_{I_{1},I_{2}}(i,k)=-\frac{1}{n}\log{(P_{I_{1},I_{2}}(i,k)\otimes{g(i,k)})\otimes{g(i,k)}}. hI1,I2(i,k)=n1log(PI1,I2(i,k)g(i,k))g(i,k).

对应灰度的概率分布由操作 T [ ] T[] T[]来定义,这里如果参数为真就是1,不是就为0,

P I 1 , I 2 ( i , k ) = − 1 n ∑ p T [ ( i , k ) = ( I 1 p , I 2 p ) ] . P_{I_{1},I_{2}}(i,k) = -\frac{1}{n}\sum_{\mathbf{p}}T[(i,k)=(I_{1\mathbf{p}},I_{2\mathbf{p}})]. PI1,I2(i,k)=n1pT[(i,k)=(I1p,I2p)].

整个计算过程如图1所示。待配准图像 I m I_{m} Im根据初始视差图 D D D进行修正。这可以通过一个简单的查询在图像 I m I_{m} Im内的所有像素 p \mathbf{p} p通过 e b m ( p , D p ) e_{bm}(\mathbf{p},D_{\mathbf{p}}) ebm(p,Dp)。然而,应该注意避免由于遮挡而在图像 I m I_{m} Im中的双重对应。 P P P的计算根据公式(6)是通过计算所有灰度组合的像素个数,除所有对应像素的个数。之后根据公式(5),高斯平滑是通过卷积实现。我们发现,使用小内核(即 7 × 7 7\times7 7×7)与大内核的结果几乎一样,但是计算的更快。对每一个结果元素做对数运算。因为0的对数没有意义,所有零元素都被一个很小的数值说替代。之后再进行一次高斯平滑有效的生成一个数据项 h I 1 , I 2 h_{I_{1},I_{2}} hI1,I2的查找表。

基于MI匹配代价的计算

Kim等人认为,熵 H I 1 H_{I_{1}} HI1是恒定,熵 H I 2 H_{I_{2}} HI2由于视差图像仅仅是重新分布了 I 2 I_{2} I2的灰度,几乎也是恒定的。因此, h I 1 , I 2 ( I 1 p , I 2 p ) h_{I_{1},I_{2}}(I_{1\mathbf{p}},I_{2\mathbf{p}}) hI1,I2(I1p,I2p)作为代价计算的两个灰度。然而,如果遮挡被考虑进来那么 I 1 I_1 I1 I 2 I_2 I2中的一些灰度就没有对应项。这些灰度不能够被包含在计算中,这将导致熵 H I 1 H_{I_{1}} HI1 H I 2 H_{I_{2}} HI2。除了这一理论证明之外,我们还发现在代价计算中加入这些熵能够略微改善目标边界。

H I = ∑ p h I ( I p ) , H_{I}=\sum_{\mathbf{p}}h_{I}(I_{\mathbf{p}}), HI=phI(Ip),

h I = − 1 n log ⁡ ( P I ( i ) ⊗ g ( i ) ) ⊗ g ( i ) h_{I} =-\frac{1}{n}\log{(P_{I}(i)\otimes{g(i)})\otimes{g(i)}} hI=n1log(PI(i)g(i))g(i)

概率分布 P I P_{I} PI只能在覆盖对应区域内计算,而一定不要在覆盖整个 I 1 I_1 I1 I 2 I_2 I2图中计算(否则,遮挡将被忽略,且 H I 1 H_{I_{1}} HI1 H I 2 H_{I_{2}} HI2将几乎恒定)。只要把联合概率分布中相应的行和列相加,也就是, P I 1 ( i ) = ∑ k P I 1 , I 2 ( i , k ) P_{I_{1}}(i)=\sum_{k}{P_{I_{1},I_{2}}(i,k)} PI1(i)=kPI1,I2(i,k)。互信息的最终定位为:

M I I 1 , I 2 = ∑ p m i I 1 , I 2 ( I 1 p , I 2 p ) MI_{I_{1},I_{2}}=\sum_{\mathbf{p}}mi_{I_{1},I_{2}}(I_{1\mathbf{p}},I_{2\mathbf{p}}) MII1,I2=pmiI1,I2(I1p,I2p)

m i I 1 , I 2 ( i , k ) = h I 1 ( i ) + h I 2 ( k ) − h I 1 , I 2 ( i , k ) . mi_{I_{1},I_{2}}(i,k) = h_{I_{1}}(i)+ h_{I_{2}}(k)- h_{I_{1},I_{2}}(i,k). miI1,I2(i,k)=hI1(i)+hI2(k)hI1,I2(i,k).

这就引出了MI匹配代价的定义:

C M I ( p , d ) = − m i I b , f D ( I m ) ( I b p , I m q ) , C_{MI}(\mathbf{p},d)=-mi_{I_{b},f_{D}(I_{m})}(I_{b\mathbf{p}},I_{m\mathbf{q}}) , CMI(p,d)=miIb,fD(Im)(Ibp,Imq),

q = e b m ( p , d ) . \mathbf{q}=e_{bm}(\mathbf{p},d). q=ebm(p,d).

剩下的问题是视差图需要为了修正 I m I_{m} Im m i ( ) mi() mi()能够被计算前得到。Kim等人提出了一种迭代求解方法,中随机视差图开始计算代价 C M I C_{MI} CMI。这个代价之后用于图像的匹配和新视差图的计算,作为下一个迭代的基础。迭代的次数相当少(如例3),因为,由于像素个数很多,尽管错误的视差图(如,随机生成)也可以很好的估计概率分布 P P P。这种解决方案非常适合与图割等迭代立体算法,但是这将不必要的增加非迭代算法的运行时间。
因为初始视差的一个粗略估计已经足够估计 P P P,因此可以在第一次迭代中使用快速相关基础算法。在这种情况下,只有最后一次迭代才会使用更精确、更耗时的方法。但是这将涉及实现两个不同的立体视觉方法。使用单一方法看起来更优雅。
因此,提出了一种分层计算方法,递归地使用以半分辨率计算的视差图像作为初始视差。如果算法的整体复杂度是 O ( W H D ) O(WHD) O(WHD)(宽 × \times × × \times ×视差范围),然后运行一半分辨率减少比率是 2 3 = 8 2^3=8 23=8。从分辨率为1\16的随机视差图像开始,最初计算三次迭代将会将总体运行时间增加比率为,
1 + 1 2 3 + 1 4 3 + 1 8 3 + 3 1 1 6 3 ≈ 1.14. 1+\frac{1}{2^3}+\frac{1}{4^3}+\frac{1}{8^3}+3\frac{1}{16^3}\approx1.14. 1+231+431+831+316311.14.
因此,分层计算的 C M I C_{MI} CMI的理论运行时间只会比 C B T C_{BT} CBT慢百分之14,忽略了MI计算和图像缩放的开销。值得注意的是,低分辨率下的视差图像仅用于估计高分辨率下的概率分布 P P P和计算高分辨率下的代价 C M I C_{MI} CMI。其他的一切都是从头计算的,以避免错误从低分辨率传递到高分辨率。
分层MI(HMI)计算的实现需要收集所有由初始视差定义的所谓对应(也就是说,从之前的层次级别或一开始随机的进行放大)。根据对应关系,概率分布 P P P通过公式(6)进行计算。 P P P的大小是灰度个数的平方,这大小是恒定的(例如, 256 × 256 256\times256 256×256)。后续的操作包括 P P P的高斯卷积和对数的计算。由于 P P P的大小不变,其复杂度取决于所谓对应的集合。因此, O ( W H ) O(WH) O(WH)其中 W W W是图像的宽度, H H H是图像的高度。

2.2 代价聚合

逐像素代价计算通常是模糊的,并且由于噪声等因素的存在,错误匹配能够很容易得到比正确匹配更小的代价。为此,增加一个额外的约束,通过惩罚临近视差的变化来保证平滑。逐像素代价和平滑约束通过定义基于视差 D D D的能量 E ( D ) E(D) E(D)

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 ] ) E(D)=\sum_{\mathbf{p}}{ \left({ C(\mathbf{p},D_{\mathbf{p}})+\sum_{\mathbf{q}\in{N_{\mathbf{p}}}}P_{1}{\rm{T}}[|D_{\mathbf{p}}-D_{\mathbf{q}}|=1]+ \sum_{\mathbf{q}\in{N_{\mathbf{p}}}}P_{2}{\rm{T}}[|D_{\mathbf{p}}-D_{\mathbf{q}}|>1]}\right)} E(D)=pC(p,Dp)+qNpP1T[DpDq=1]+qNpP2T[DpDq>1]

第一项是对于视差 D D D的所有像素匹配代价之和。第二项添加了一个惩罚函数 P 1 P_{1} P1,针对 p \mathbf{p} p邻域 N p N_{\mathbf{p}} Np内的所有像素 q \mathbf{q} q,对于视差变化非常小的地方(例如,1个像素)。第三项,添加了一个更大的常数惩罚 P 2 P_{2} P2,对于较大的视差变化。采用一个小的惩罚对于小的视差变化能够适应倾斜或弯曲的表面。常数惩罚对于所有大的变化(也就是说,与它们大大小无关)保持不连续[23]。当灰度发生变化时,不连续往往是可见的。这是利用 P 2 P_{2} P2适应灰度梯度来实现的,就是说,在参考图像 I b I_{b} Ib内像素 q \mathbf q q和邻域内像素 p \mathbf p p P 2 = P 2 ′ ∣ I b p − I b q ∣ P_{2} = \frac{P^{'}_{2}}{|I_{b\mathbf{p}}-I_{b\mathbf{q}}|} P2=IbpIbqP2。然而,我们需要确保 P 2 ≥ P 1 P_{2}\ge P_{1} P2P1
立体匹配问题现在能够被表述为寻找使能量 E ( D ) E(D) E(D)最小化的视差图 D D D。不幸的是,这种全局最小化在二维当中是NP完全问题,对于许多不连续保持的能量[23]。于此相反,在一维情况下,利用DP可以在多项式时间内有效地实现图像沿某一行的最小化[2],[15]。然而,DP解决方案容易遭受条纹[1],由于在二维图像中很难将单个图像行之间的一维优化关联起来。问题是,在一个方向上非常强的约束,即沿着图像行,与在另一个方向上没有约束或弱得多的约束相结合,即沿着图像列。
这就导致了从各个方向平均聚合匹配代价的新方法。聚合(平滑)代价 S ( p , d ) S(\mathbf{p},d) S(p,d)对于一个像素 p \mathbf{p} p和视差 d d d,是通过累加所有一维最小代价路径中的代价,路径以在视差d处以像素p为终点,如图2所示。这些路径通过视差空间,作为直线被投影到参考图像内,但是作为非直线映射到对应的待匹配图像,根据沿路径的视差变化。值得注意的是,只需要路径的代价而不需要路径本身。
在这里插入图片描述
代价 L r ′ L_{\mathbf{r}}^{\prime} Lr沿着在像素 p \mathbf{p} p r \mathbf{r} r方向上在视差 d d d的路径累加,被递归的表示为:
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 , r ) + P 2 ) . L_{\mathbf{r}}^{\prime}(\mathbf{p},d)=C(\mathbf{p},d)+\min(L_{\mathbf{r}}^{\prime}(\mathbf{p}-\mathbf{r},d)),\\ L_{\mathbf{r}}^{\prime}(\mathbf{p}-\mathbf{r},d-1)+P_{1},\\ L_{\mathbf{r}}^{\prime}(\mathbf{p}-\mathbf{r},d+1)+P_{1},\\ \min_{i}L_{\mathbf{r}}^{\prime}(\mathbf{p}-\mathbf{r},r)+P_{2}). Lr(p,d)=C(p,d)+min(Lr(pr,d)),Lr(pr,d1)+P1,Lr(pr,d+1)+P1,iminLr(pr,r)+P2).
逐像素匹配代价 C C C能够是 C B T C_{BT} CBT或者 C M I C_{MI} CMI。方程的剩余部分添加了之前路径上的像素 p − r \mathbf{p}-\mathbf{r} pr的最低代价,包括对不连续的适当惩罚。这实现了公式(11)沿着任意的一维路径。这个代价并不执行可视或排序约束,因为对于与极限不同的路径,这两个概念都不能被实现。因此,该方法比传统的DP解法更相似与扫描线优化[1]
L ′ L^{\prime} L的值会沿着路径一直增加,这将导致得到非常大的值。然而,公式(12)能够被修改通过减去整个项内先前像素的最小路径代价:

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 ⁡ i L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p},d)=C(\mathbf{p},d)+\min(L_{\mathbf{r}}(\mathbf{p}-\mathbf{r},d)),\\ L_{\mathbf{r}}(\mathbf{p}-\mathbf{r},d-1)+P_{1},\\ L_{\mathbf{r}}(\mathbf{p}-\mathbf{r},d+1)+P_{1},\\ \min_{i}L_{\mathbf{r}}(\mathbf{p}-\mathbf{r},i)+P_{2})-\min_{i}L_{\mathbf{r}}(\mathbf{p}-\mathbf{r},k) Lr(p,d)=C(p,d)+min(Lr(pr,d)),Lr(pr,d1)+P1,Lr(pr,d+1)+P1,iminLr(pr,i)+P2)iminLr(pr,k)

这种修改不会改变视差空间的实际路径,因为对于像素p的所有视差,减除的值都是常数。因此,最小值的位置不会改变。然而,它的上限可以给出,为 L ≤ C m a x + P 2 L \le C_{max}+P_{2} LCmax+P2
代价 L r L_{\mathbf{r}} Lr是对所有方向 r \mathbf r r的路径进行累加。路径的数量至少8条并且对于要想很好的覆盖二维图像需要16条。在后一种情况下,非水平、垂直或者对角线的路径的实现方法是先水平或竖直走一步,然后对角线走一步。

S ( p , d ) = ∑ r L r ( p , d ) . S(\mathbf p,d)=\sum_{\mathbf r}L_{\mathbf r}(\mathbf p,d). S(p,d)=rLr(p,d).

对于16路径, S S S上限容易确定为 S ≤ 16 ( C m a x + P 2 ) S\le16(C_{max}+P_{2}) S16(Cmax+P2)
一个有效的实现将预先计算逐像素匹配代价 C ( p , d ) C(\mathbf p,d) C(p,d),如果有必要,在MI值的情况下,通过一个因子 s s s按比例缩小到11位整数值,就是, C m a x &lt; 2 11 C_{max}&lt;2^{11} Cmax<211。缩放到11位保证聚合代价在之后的计算中不会超过11位的限制。所有代价都存储在一个16位大小为 W × H × D W\times H\times D W×H×D的数组 C [ ] C[] C[]。因此, C [ p , d ] = s C ( p , d ) C[\mathbf p,d]=sC(\mathbf p,d) C[p,d]=sC(p,d)。第二个相同大小的16位整数数组 S [ ] S[] S[]用于存储聚合代价值。数组初始化为0。从图像边界所有像素 b {\mathbf b} b的每个方向 r {\mathbf r} r通过 L r ( b , d ) = C [ b , d ] L_{\mathbf{r}}(\mathbf{b},d)=C[\mathbf{b},d] Lr(b,d)=C[b,d]开始计算。根据公式(13)沿正向遍历路径。对于路径上每个被访问的像素 p \mathbf p p,代价 L r ( p , d ) L_{\mathbf{r}}(\mathbf{p},d) Lr(p,d)被加入到每个视差 d d d S [ b , d ] S[\mathbf b,d] S[b,d]值。
由于前一个像素的最小成本,计算公式(13)在每个像素上需要 O ( D ) O(D) O(D)步,例如, min ⁡ k L r ( p − r , k ) \min_{k}L_{r}(\mathbf p-\mathbf r,k) minkLr(pr,k),对于像素的所有视差都是常数且能够被预先计算。每个像素恰好被访问16次,导致总复杂度为 O ( W H D ) O(WHD) O(WHD)。规则的结构和简单的操作,即添加和比较,允许采用基于整数的SIMD2汇编语言指令进行并行计算。

2.3 视差计算

对应参考图像 I b I_{b} Ib的视差图像 D b D_{b} Db被定义为局部立体方法通过寻找每一个像素 p \mathbf p p上对应最小代价的视差 d d d,即, m i n d S [ p , d ] min_{d}S[\mathbf p,d] mindS[p,d]。对于亚像素估计,通过邻域代价拟合出二次曲线,即,在下一个更高和更低的视差,并计算出最小值的位置。使用二次曲线只有在相关使用平方差的和,理论上才是合理的。然而,由于计算使用它作为一个近似。这支持快速计算。
视差图像 D m D_{m} Dm对应于匹配图像能够被决定从相同代价通过遍历极线对应匹配图像像素 q \mathbf q q。再次,选择视差 d d d,即, min ⁡ d S [ e m b ( q , d ) , d ] \min_dS[e_{mb}(\mathbf{q},d),d] mindS[emb(q,d),d]。然而,代价聚合步骤并不对称地处理参考图像和匹配图像。如果 D m D_{m} Dm是从头开始计算,可以期望得到稍好一点的结果。也就是说,通过再次执行逐像素匹配和代价聚合,但是 I m I_{m} Im作为参考图像且 I b I_{b} Ib作为匹配图像。这取决于应用程序是否可以接受通过增加运行时间来得到稍微好一点的对象边界。离群值从 D b D_{b} Db D m D_{m} Dm中滤掉通过使用一个 3 × 3 3\times3 3×3的小窗口中值滤波。
D b D_{b} Db D m D_{m} Dm的计算,用过执行一致性检查来确定遮挡和错误匹配。每个 D b D_{b} Db的视差跟与它对应的 D m D_{m} Dm中的视差相比较。视差被设置为无效( D i n v D_{inv} Dinv)如果都不同:
D p = { D b p , i f ∣ D b p − D m q ∣ ≤ 1 , D i n v , o t h r e w i s e . D_{\mathbf p}= \left\{\begin{array}{lr} D_{b\mathbf p}, &amp; if|D_{b\mathbf p}-D_{m\mathbf q}|\leq1,\\ D_{inv}, &amp; othrewise. \end{array}\right. Dp={Dbp,Dinv,ifDbpDmq1,othrewise.
一致性检查强制执行唯一性约束,只允许一对一的映射。视差计算和一致性检测需要对每个视差处的每个像素进行一定次数的访问。因此,这一步骤的复杂度还是 O ( W H D ) O(WHD) O(WHD)
图3概述了SGM核心算法包括MI的分层计算的所有处理步骤。
处理步骤概述

2.4 多基线匹配

该算法可以通过计算参考图像与所有匹配图像之间的对应关系的一个组合的像素匹配代价,扩展到多基线匹配。然而,遮挡问题必须在逐像素匹配层面上解决,就是说,在聚合之前,这是非常不稳定的。因此,多基线匹配是通过参考图像与所有匹配图像之间的逐对匹配来实现的。一致性检测(2.3节)是在成对匹配后使用的,用于消除遮挡处的错误匹配和其他多种不匹配。最后,视差图的结果融合通过考虑单个尺度。
视差 D k D_k Dk是参考图像 I b I_b Ib与匹配图像 I m k I_{mk} Imk的匹配结果。根据一些系数 t k t_k tk,对图像 D k D_k Dk的视差进行了不同的缩放。如果所有图像都相互校正,这个系数与 I b I_b Ib I m k I_{mk} Imk之间基线的长度是线性的,也就是说,如果所有的图像都被投影到一个与所有光学中心距离相同的平面上。由此,差异标准化为 D k p t k \frac{D_k{\mathbf{p}}}{t_k} tkDkp
视差值的融合是通过计算加权平均视差,其中用 t k t_k tk作为权重。可能的离群值被丢弃,通过考虑那些某一像素所有像素视差中值附近一个像素范围内的视差。
D p = ∑ k ∈ V p D k p ∑ k ∈ V p t k , D_{\mathbf{p}}=\frac{\sum_{k\in{V_{\mathbf p}}}D_{k\mathbf p}}{\sum_{k\in{V_{\mathbf p}}}t_k}, Dp=kVptkkVpDkp,
V p = { k ∣ ∣ D k p t k − m e d i D i p i i ≤ 1 t k ∣ } , V_{\mathbf p}=\left\{k|\left| \frac{D_{k\mathbf p}}{t_k}-med_i{\frac{D_{i\mathbf p}}{i_i}}\leq\frac{1}{t_k}\right|\right\}, Vp={ktkDkpmediiiDiptk1},
这种解决方法由于中值增强了鲁棒性,同时由于加权平均而提高了准确性。此外,如果有足够的待匹配图像可用,则可以强制设置 V p V_{\mathbf p} Vp的最小值,以增加由此残生的差异的可靠性。不符合条件的像素被设置为无效。如果基于互信息进行多层计算,则在每个层次内对所提出的视差图像进行融合,以计算下一层次的视差图。
一种方法是将参考图像与所有 k k k个匹配图像成对匹配,并通过访问每个像素将他们结合起来。因此,所有必要步骤的整体复杂性对于多基线匹配是 O ( K W H D ) O(KWHD) O(KWHD),这里 K K K是待匹配图像的个数。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
立体匹配算法中的SGBM是指Stereo Processing by Semiglobal Matching and Mutual Information,它是一种全局匹配算法。相比于局部匹配算法,SGBM在匹配效果上表现更好,但同时也具有更高的复杂度。SGBM的原理主要参考了Stereo Processing by Semiglobal Matching and Mutual Information算法。在实际应用中,立体匹配算法应该在极线/立体校正后应用,以获得最佳效果。 在Python中,可以使用OpenCV库来实现SGBM算法的立体匹配。OpenCV提供了相关的接口和函数用于处理立体匹配。可以通过调用cv2.StereoSGBM_create()函数来创建一个SGBM对象,并使用该对象的compute()函数来计算立体匹配的结果。在计算之前,需要预先对图像进行极线/立体校正以及其他必要的预处理操作。 以下是一个使用Python和OpenCV实现SGBM算法的简单示例代码: ```python import cv2 # 读取左右两张图像 left_image = cv2.imread('left_image.png', 0) right_image = cv2.imread('right_image.png', 0) # 创建SGBM对象 sgbm = cv2.StereoSGBM_create() # 设置SGBM参数 sgbm.setMinDisparity(0) sgbm.setNumDisparities(16) sgbm.setBlockSize(5) sgbm.setDisp12MaxDiff(1) sgbm.setUniquenessRatio(10) sgbm.setSpeckleWindowSize(100) sgbm.setSpeckleRange(32) # 计算立体匹配 disparity_map = sgbm.compute(left_image, right_image) # 显示立体匹配结果 cv2.imshow('Disparity Map', disparity_map) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了左右两张图像,并创建了一个SGBM对象。然后,通过设置SGBM对象的参数,如最小视差、视差范围、块大小等,来对算法进行配置。接下来,我们使用compute()函数来计算立体匹配的结果。最后,我们将计算得到的视差图像显示出来。 请注意,这只是一个简单的示例代码,实际使用中可能需要根据具体情况进行参数调整和其他额外的处理步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [立体匹配成像算法BM,SGBM,GC,SAD一览](https://blog.csdn.net/Yong_Qi2015/article/details/120520626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [三维重建(10)之立体匹配算法详解:BM、SGBM](https://blog.csdn.net/yohnyang/article/details/127706084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值