OpenCV空间滤波

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


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


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

# use filter2D
image = 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 interface
image = 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参数,即标准差,它会直接影响到低通滤波的带宽。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值