OpenCV 提供了四种模糊技术,但其本质上还是在卷积。第一个是使用平均,第二个是使用高斯模糊,三个是使用中值模糊。第四个也就是本文的双边滤波。
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成:
一个函数由像素欧式距离决定滤波器模板的系数
另一个函数由像素的灰度差值决定滤波器的系数
下面是OpenCV平滑图像双边滤波的完整代码
import cv2
import matplotlib.pyplot as plt
image = cv2.imread('lena.tif')
bil_blur = cv2.bilateralFilter(image,13,75,75)
#转换图像从bgr到rgb
cvt_orig = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cvt_blur = cv2.cvtColor(bil_blur, cv2.COLOR_BGR2RGB)
plt.subplot(121)
plt.imshow(cvt_orig)
plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.imshow(cvt_blur)
plt.title('Bilateral Image')
plt.xticks([]), plt.yticks([])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
为了达到这个目的,我们要使用这张图,我们想要平滑这张图
使用双边滤波。
这是用于双边滤波的语法。
cv2.bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)
bil_blur = cv2.bilateralFilter(image,13,75,75)
因为我们要在Matplotlib中显示我们的图像,所以Matplotlib使用RGB(红、绿、蓝)颜色系统,而OpenCV使用BGR(蓝、绿、红)颜色系统,所以我们需要将BGR颜色转换为RGB。如果我们不这样做,颜色就会变混乱。
cvt_orig = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cvt_blur = cv2.cvtColor(bil_blur, cv2.COLOR_BGR2RGB)
注意:cv2.waitKey()是一个键盘绑定函数。它的参数是以毫秒为单位的时间。
该函数为任何键盘事件等待指定的毫秒。如果您在此时间内按下任何键,程序将继续。如果0被传递,那么无限等待下去,直到有按键按下。
现在运行完整的代码,结果如下。
Ubuntu 22.04 更换国内源 清华源 阿里源 中科大源 163源 - 64,863 浏览Ubuntu 22.04 终于支持 MS RDP 协议进行远程桌面控制 - 46,533 浏览我们推荐最稳定的 5 个 Linux 发行版 - 19,225 浏览CutefishOS:媲美macOS的Manjaro Linux社区体验版 - 17,241 浏览12个针对Linux和编程的最佳文本编辑器[2021版] - 16,843 浏览如何在 Ubuntu 上安装 Go 语言编程环境 - 12,278 浏览4款最佳 CentOS Linux 替代发行版(桌面和服务器) - 12,170 浏览如何在 Ubuntu 20.04/22.04 上安装 GCC 编译器 - 11,899 浏览2022 年适合初学者的 10 个最佳 Linux 发行版 - 11,068 浏览Ubuntu 20.04 与 22.04:两个 LTS 版本之间发生了哪些变化? - 11,004 浏览
Linux迷与您分享关于开源的新鲜事,Linux、编程、大数据、运维和数据库教程。
大家好,我是 当年的大师兄,Linux迷的站长,是使用桌面版的Linux爱好者。在业余时间写作,并希望与Linux初学者和爱好者分享一些有用的技巧。