双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:空间域核(又称定义域核,空间系数或空间域)和值域核(又称像素范围域)。
空间域核是由像素位置欧式距离决定的模板权值 ,公式如下:
其中i,j,k,l代表的是坐标点q(i,j)和 p(k,l)。q(i,j)是卷积核模板窗口的其他系数的坐标;p(k,l)为模板窗口的中心坐标点;p(k,l)为高斯函数的标准差。\(\sigma_{d}\)为高斯函数的标准差该核函数属于上面讲解的高斯核函数。从第一个公式可知,\(\omega_{d}\)是计算临近点q到中心点p的临近程度,因此空间域核 是用于衡量空间临近的程度。
值域核是由像素值的差值决定的模板权值\(\omega_{r}\),公式如下:
其中q(i,j)为模板窗口的其他系数的坐标,而f(i,j)表示图像在点a(i,j)处的像素值。p(k,l)为模板窗口的中心坐标点,对应的像素值为f(k,l);\(\sigma_{d}\)为高斯函数的标准差,值域核范围在[0,1]之间。
将上述公式2-12和2-13中的两个模板相乘就得到了双边滤波器的模板权值:
化简的双边滤波器的数据公式可以表示为:
从以上公式可知,双边滤波是综合了高斯滤波和α-截尾均值滤波器的特点,同时考虑了空间域与值域的差别,而高斯滤波和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉像素灰度值的最小值和最大值后再计算均值。
空域权重\(\omega_{d}\)衡量的是p,q两点之间的距离,距离越远权重越低。而值域权重\(\omega_{r}\)衡量的是p,q两点之间的像素值相似程度,越相似权重越大。在图像上直观的理解就是,当图像处于没有边缘跳变的平坦区域,临近像素的像素值得差值较小,对应的值域w_r就比较小接近于1,此时的空域权重\(\omega_{d}\)起主要作用,相当于直接对该区域进行高斯滤波。因此,在平坦区域相当于高斯滤波。在有边缘的区域,相临近的像素的差值较大,对应的值域权重\(\omega_{r}\)就接近于0,导致此处函数下降,即双边滤波的模板权值 w就接近于0。当前像素受到的影响就越小,从而保持了原始图像的边缘细节信息。
这里使用opencv中的bilateralFilter(src=image, d=0, sigmaColor=100, sigmaSpace=15)函数实现图像双边滤波,参数src表示的是图像的输入图像;d是过滤时周围每个像素图像领域的直径;sigmaColor是颜色空间过滤器的sigma值(对应上式 \(\sigma_{r}\),参数越大,会有越远的像素被混合到一起;sigmaSpace是坐标空间滤波器的sigma值(对应上式 \(\sigma_{d}\),参数越大,那些颜色足够相近的的颜色的影响越大。总体的代码如下:
#双边滤波
bilateral_filter_img1 = cv2.bilateralFilter(img, 9, 75, 75)
bilateral_filter_img2 = cv2.bilateralFilter(gasuss_noise_img, 9, 75, 75)
#显示
plt.figure(figsize=(15, 15))
plt.subplot(3, 2, 1), plt.imshow(img)
plt.axis('off'); plt.title('原图')
plt.subplot(3, 2, 2), plt.imshow(gasuss_noise_img)
plt.axis('off'); plt.title('添加随机高斯噪声')
plt.subplot(3, 2, 3), plt.imshow(bilateral_filter_img1)
plt.axis('off'); plt.title('原图双边滤波')
plt.subplot(3, 2, 4), plt.imshow(bilateral_filter_img2)
plt.axis('off'); plt.title('加噪声后双边滤波')
plt.subplot(3, 2, 5), plt.imshow(gasuss_filter_img2)
plt.axis('off'); plt.title('原图高斯滤波')
plt.show()
运行上述代码可得下图所示的结果图,对比第三张图片和其它图片,可以发现双边滤波有很好的祛斑磨皮效果,通过调整代码中的两个sigma参数和半径d可以进一步优化表现。
- 我的微信小程序
- 这是我的微信小程序扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-
评论