OpenCV空间滤波

来源:互联网 发布:mac dns自动获取 编辑:程序博客网 时间:2024/05/22 01:32

滤波是数字图像处理中的基础概念,可以在空间域和频域进行。本文主要讲讲使用OpenCV如何在空间域对图像进行滤波。关于滤波的数学理论,这里不再描述,有很多书籍有详细的介绍。


通俗来讲,滤波就是使用一个滤波器核(就是一个矩阵)对数字图像数据(另一个矩阵)进行处理,处理的过程就是使用滤波器核的中心,分别放在图像的每一个像素上,然后通过中心像素的领域像素,对中心像素进行修改。常见的一种解释,就是把滤波器核当做一块毛玻璃,我们将毛玻璃从图像上滑过,记录下来毛玻璃透过来的图像,这就是我们滤波后的图像。


OpenCV使用filter2D方法对图像进行滤波,为了演示滤波,这里使用三个比较特殊的滤波器核进行实验。还有很多有意思的滤波器,大家可以网上看看。

# use filter2Dimage = cv2.imread(r"pics/lena.png", cv2.IMREAD_GRAYSCALE)kernel1 = np.array([    [-1, -1, -1],    [-1, 9, -1],    [-1, -1, -1],])image1 = cv2.filter2D(image, -1, kernel1)kernel2 = np.array([    [-1, -1, -1],    [-1, 8, -1],    [-1, -1, -1],])image2 = cv2.filter2D(image, -1, kernel2)kernel3 = np.array([    [-2, -1, 0],    [-1, 1, 1],    [0, 1, 2],])image3 = cv2.filter2D(image, -1, kernel3)plt.subplot(232), plt.imshow(image, 'gray'), plt.title('origin')plt.subplot(234), plt.imshow(image1, 'gray'), plt.title('filter1')plt.subplot(235), plt.imshow(image2, 'gray'), plt.title('filter2')plt.subplot(236), plt.imshow(image3, 'gray'), plt.title('filter3')plt.show()

三个滤波器分别如kernel1-3所示,第一个核是锐化核,图像锐化会增强图像的边缘及灰度跳变的部分,第二个核是一个边缘检测核,可以检测图像的边缘,最后一个核会让图像显示出浮雕的效果。


filter2D必须至少传入三个参数,分别代表原图像,结果图像的深度(一个像素数据所占的位数,传递-1表示和原图像采用一样的深度)以及滤波器核。上面的代码运行的结果如图所示:



使用filter2D可以使用任意的核进行滤波,更加灵活。


图像处理领域有一些常用的滤波方式(图像模糊),直接提供了相应的接口。看下面的例子,待处理的图像是Lena图像带有椒盐噪声的图片

# use blur interfaceimage = cv2.imread(r"pics/lena_with_noisy.jpeg", cv2.IMREAD_GRAYSCALE)blur_image = cv2.blur(image, (5, 5))gaussian_image = cv2.GaussianBlur(image, (5, 5), 0.8)median_image = cv2.medianBlur(image, 5)bilateral_image = cv2.bilateralFilter(image, 5, 5, 5)plt.subplot(231), plt.imshow(image, 'gray'), plt.title('lena_with_noisy')plt.subplot(232), plt.imshow(blur_image, 'gray'), plt.title('blur_image')plt.subplot(233), plt.imshow(gaussian_image, 'gray'), plt.title('gaussian_image')plt.subplot(234), plt.imshow(median_image, 'gray'), plt.title('median_image')plt.subplot(235), plt.imshow(bilateral_image, 'gray'), plt.title('bilateral_image')plt.show()

上面的代码分别使用了均值滤波(blur),高斯滤波(GaussianBlur),中值滤波(medianBlur)以及双边滤波(bilateralFilter)。运行效果如图所示:



可以看到,对于去除椒盐噪声,使用均值滤波和中值滤波可以得到比较好的结果,但是高斯滤波和双边滤波则不是很好。


上面接口的参数可以查看OpenCV的接口文档,必须有的参数一般包括原图像和核的尺寸,对于高斯滤波和双边滤波需要添加相应的sigma参数,即标准差,它会直接影响到低通滤波的带宽。