本文内容部分引用下面文章
https://blog.csdn.net/weixin_36558054/article/details/74832494
https://blog.csdn.net/u011285477/article/details/52077199
双边滤波器就是对窗口内像素进行距离加权和亮度加权。双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。
双边滤波器中输出 (i,j) ( i , j ) 位置的像素值 g g 依赖依赖于邻域内像素值 f f 的加权组合( k,l k , l 表示邻域像素位置):
主要功能是在给定的滑动窗口大小下,对每个窗口内的像素值进行相加求和,均值滤波的快速算法。
包滤波器的其主要功能是:在给定的滑动窗口大小下,对每个窗口内的像素值进行快速相加求和。
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[i−1]−buff[x−1]+buff[x+m−1] 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
引导滤波主要参看https://blog.csdn.net/aichipmunk/article/details/20704681