最近学习的过程中接触到了双边滤波这个操作,之前在看hdrnet的时候就已经看到过这样的概念,一直没有认真领会双边滤波这个操作,现在好好看一看。
双边滤波中的双边是指同时考虑两条边,即空间域和值域。对空间域的处理和高斯滤波一样,根据距离远近的不同给予不同的权值。值域则是考虑邻域范围内像素的差值计算出滤波系数,类似于$\alpha$截尾均值滤波器。其公式如下:
权重系数取决于定义域核和值域核,即:
其中定义域核$d(i,j,k,l)=exp(-\frac{(i-k)^2+(j-l)^2}{2\sigma_{d}^2})$,值域核为$r(i,j,k,l)=exp(-\frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2})$
也就是双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板,第一个模板是全局模板,第二个模板需要对每个像素都计算一次。说白了就是第一个模板以距离为因素计算,距离越远权值越小,第二个模板以相似性为因素计算,越不相似权值越小。双边滤波器比高斯滤波器多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素,这样就能对边缘附近的像素值予以保存,但是由于保存过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤除。
opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:1
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
参数意义如下:
src:输入图像
dst:输出图像
d:滤波邻域直径。如果这个值设为负数,那么这个值由参数sigmaColor计算出。
sigmaColor:滤波的色彩空间参数。这个值越大,代表滤波计算邻域内有更多的色彩权重。
sigmaSpace :滤波的距离空间参数。这个值越大,代表当颜色距离相同时,会有更多的点被影响到。如果参数d>0,则邻域大小由d指定,否则,d是sigmaSpace的一个比例结果。
双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。10,则对滤波器影响很小,如果值>
参考:
https://blog.csdn.net/kuweicai/article/details/74502978
https://blog.csdn.net/keith_bb/article/details/54427779