在这篇OpenCV文章中,我们将学习使用双边滤波的OpenCV图像平滑。
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)
dst | 它是目标或输出图像 |
d | 像素的领域直径,可由sigmaColor和sigmaColor计算得到。 |
sigmacolor | 颜色空间的标准方差,一般越大越好。 |
sigmaspace | 坐标空间的标准方差(像素单位),一般越小越好。 |
如果需要,也可以使用borderType。
这行代码用于读取图像,请确保在工作目录中添加了图像。
image = cv2.imread('linuxmi.com.jpg')
在这里,我们将创建双边过滤。
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被传递,那么无限等待下去,直到有按键按下。
现在运行完整的代码,结果如下。