预备知识
代价空间
C A D ( x , y , d ) = ∣ I L ( x , y ) − I R ( x − d , y ) |
d是移动像素的大小。以左图为基准。下面以左图的一个像素点P为例
1.d=0,右图不移动,计算C A D 0
2.d=1,右图向右移动一个像素点,再计算C A D 1
3.d=2,右图向右移动一个像素点,再计算C A D 2
4.…(d++,不断执行)…
5.最后得到代价空间
代价聚合
🔥目的:对代价空间进行滤波,使边界平滑
Box Filtering(均值滤波)
N:窗口像素个数
效果:
Bilateral filter
Bilateral filter就是输入的代价,乘以一个高斯函数,实现平滑
效果:
Cross-based local stereo matching(自适应形状)
任意选取一个像素点,横向、纵向扩张,直到遇到颜色差异较大的地方才停下来。然后在扩张后的像素点,重复上述操作。这样,因为能及时发现边界,就能大概判断出一整块区域的视差图
🚀Semi-Global Matching
能量函数
当D p − D q = 1 时,我们就取∑ q ∈ N p P 1 T [ ∣ D p − D q ∣ = 1 ]
当D p − D q > 1 时,我们就取∑ q ∈ N p P2 T [ ∣ D p − D q ∣ >1 ]
优化步骤
1.计算代价空间;(AD, BT, Census, MI, ….)
2.代价聚合
方向r上的路径代价
当d=0时,L r ( p , d ) = C ( p , d ) − mink L r ( p − r , k )
当|d|=1时,L r ( p , d ) = C ( p , d ) + P 1 − mink Lr ( p − r , k )
当|d|=i时,L r ( p , d ) = C ( p , d ) + P 2 − mink L r ( p − r , k )
Lr ( p − r , d )是该像素点左侧,最优代价。即当d=i时,左侧有最优代价,那么就C ( p , d ) + P 2
各个方向的总聚合代价
S ( p , d ) = ∑ L r ( p , d )
例如opencv收录的sgbm算法,就是计算了下面5条路径的代价
3.WTA
Winner-Take-All,赢家通吃
即我们发现在这条视差方向r上,纵轴(聚合后的代价)最小,那么我们就取出视差值(d=18)
4.视差后处理