立体匹配 之 代价聚合 滤波器篇

立体匹配 之代价聚合 滤波器

本文内容部分引用下面文章
https://blog.csdn.net/weixin_36558054/article/details/74832494
https://blog.csdn.net/u011285477/article/details/52077199

一、双边滤波(BilateralFilter)

双边滤波器就是对窗口内像素进行距离加权和亮度加权。双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。
双边滤波器中输出 (i,j) ( i , j ) 位置的像素值 g g 依赖依赖于邻域内像素值 f f 的加权组合( k,l k , l 表示邻域像素位置):

g(i,j)=k,lf(k,j)w(i,j,k,l)k,lw(i,j,k,l) g ( i , j ) = ∑ k , l f ( k , j ) w ( i , j , k , l ) ∑ k , l w ( i , j , k , l )

权重系数 w(i,j,k,l) w ( i , j , k , l ) 取决于定义域核 d d 与值域核 r r 的乘积:
d(i,j,k,l)=exp((ik)2+(jl)22σ2d), d ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 ) ,

r(i,j,k,l)=exp(||f(i,j)f(k,l)||22σ2r), r ( i , j , k , l ) = e x p ( − | | f ( i , j ) − f ( k , l ) | | 2 2 σ r 2 ) ,

w(i,j,k,l)=exp((ik)2+(jl)22σ2d||f(i,j)f(k,l)||22σ2r) w ( i , j , k , l ) = e x p ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 − | | f ( i , j ) − f ( k , l ) | | 2 2 σ r 2 )

二、包滤波Box Filter

主要功能是在给定的滑动窗口大小下,对每个窗口内的像素值进行相加求和,均值滤波的快速算法。
包滤波器的其主要功能是:在给定的滑动窗口大小下,对每个窗口内的像素值进行快速相加求和。
Boxfilter的初始化过程如下:
1. 给定一张图像,宽高为 (M,N) ( M , N ) ,确定待求矩形模板的宽高 (m,n) ( m , n ) ,如图紫色矩形。图中每个黑色方块代表一个像素,红色方块是假想像素。
2. 开辟一段大小为M的数组,记为 buff b u f f , 用来存储计算过程的中间变量,用红色方块表示
3. 将矩形模板(紫色)从左上角 (0,0) ( 0 , 0 ) 开始,逐像素向右滑动,到达行末时,矩形移动到下一行的开头 (0,1) ( 0 , 1 ) ,如此反复,每移动到一个新位置时,计算矩形内的像素和,保存在数组A中。以 (0,0) ( 0 , 0 ) 位置为例进行说明:首先将绿色矩形内的每一列像素求和,结果放在 buff b u f f 内(红色方块),再对蓝色矩形内的像素求和,结果即为紫色特征矩形内的像素和,把它存放到数组A中,如此便完成了第一次求和运算。
4. 每次紫色矩形向右移动时,实际上就是求对应的蓝色矩形的像素和,此时只要把上一次的求和结果减去蓝色矩形内的第一个红色块,再加上它右面的一个红色块,就是当前位置的和了,用公式表示 sum[i]=sum[i1]buff[x1]+buff[x+m1] s u m [ i ] = s u m [ i − 1 ] − b u f f [ x − 1 ] + b u f f [ x + m − 1 ]
5. 当紫色矩形移动到行末时,需要对 buff b u f f 进行更新。因为整个绿色矩形下移了一个像素,所以对于每个buff[i], 需要加上一个新进来的像素,再减去一个出去的像素,然后便开始新的一行的计算了。

opencv代码:

costVol[ d ] = BoxFilter( costVol[ d ], 3 );//实现7 x 7 box filter

引导滤波(GuiderFilter)

引导滤波主要参看https://blog.csdn.net/aichipmunk/article/details/20704681

你可能感兴趣的:(立体匹配)