这是我参与更文挑战的第6天,活动详情查看: 更文挑战
OpenCV
是一个C++
库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python
中常使用OpenCV
库实现图像处理。
本文将介绍如何在Python3
中使用OpenCV
实现对图像的滤波处理:
参考:
Opencv4 官方文档 : docs.opencv.org/4.2.0/
前文
在通信工程中,滤波是对输入信号进行卷积处理的一个过程。
卷积( 输入信号 ,卷积模板 ) 卷积模板/掩膜 的不同决定了不同的滤波方式,也因此产生了高通、低通、带通、带阻等基本的滤波方式。
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
图像滤波等效于对图像的每个像素进行卷积运算,原函数为图像像素,卷积核为滤波器,计算结果为滤波后图像。
OpenCV
提供的函数cv2.filter2D()
可以实现这种卷积操作。
常用的滤波器包括:
- 线性滤波器
- 均值滤波:滤波结果=原像素邻域内所有像素的平均值
- 高斯滤波:滤波结果=原像素邻域内所有像素的加权平均值
- 非线性滤波器
- 中值滤波:滤波结果=原像素邻域内所有像素的中值(可以有效去除椒盐噪声)
普通的图像卷积
下面是一个3X3
的平均滤波器,也叫做核(kernel
):
将核放在图像的一个像素上,求与邻域内(3×3
)的像素和,再取平均数,用这个平均数代替该像素的值。重复以上操作直到将图像的每一个像素值都更新一遍。
代码实现:
import cv2
import numpy as np
img = cv2.imread('E:\\demo\\lena.jpg')
kernel = np.ones((3,3),np.float32)/9
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow('original', img)
cv2.imshow('2D convolution', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码
输出为:
均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8
个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。但是它的缺点是在滤除噪声的同时也会滤掉图像的边缘信息,去失去很多细节。另外,均值滤波不能很好地去除噪声点。特别是椒盐噪声。
OpenCV
中通过函数cv2.blur()
或cv2.boxFilter()
实现。
3×3
的滤波器如图所示:
5×5
的滤波器如图所示:
代码如下:
import cv2
img = cv2.imread('E:\\demo\\lena.jpg')
blur1 = cv2.blur(img,(3,3))
blur2 = cv2.blur(img,(5,5))
cv2.imshow('3*3 Mean filtering', blur1)
cv2.imshow('5*5 Mean filtering', blur2)
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码
输出为:
高斯滤波
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果。
高斯滤波对比均值滤波,其不同在于它的滤波器的模板系数随着距离模板中心的增大而减小。
(高斯滤波服从二维高斯分布)。
OpenCV
中通过函数cv2.GaussianBlur()
实现,如果有需要的话可以使用函数cv2.getGaussianKernel()
创建高斯内核。
代码如下:
import cv2
img = cv2.imread('E:\\demo\\lena.jpg')
# 0是指根据窗口大小,来计算高斯函数标准差
GaussianBlur1 = cv2.GaussianBlur(img,(3,3),0)
GaussianBlur2 = cv2.GaussianBlur(img,(5,5),0)
cv2.imshow('3*3 Gaussian filtering', GaussianBlur1 )
cv2.imshow('5*5 Gaussian filtering', GaussianBlur2 )
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码
输出为:
中值滤波
使用像素点邻域附近的像素的中值代替该点的像素值。通俗点来说,在这个像素的左边找五个像素点,右边找五个像素点,将这些像素进行排序,排序过后产生一个中值,用中间大小的值,来代替该像素的值。
中值滤波可以有效的去除斑点和椒盐噪声。但是效率低,其运算时间 为均值滤波的五倍以上。
在OpenCV
中,可以使用函数cv2.medianBlur()
进行实现中值滤波。
代码如下:
import cv2
img = cv2.imread('E:\\demo\\lena.jpg')
medianBlur1 = cv2.medianBlur(img,3)
medianBlur2 = cv2.medianBlur(img,5)
cv2.imshow('original', img)
cv2.imshow('3*3 median filtering', medianBlur1 )
cv2.imshow('5*5 median filtering', medianBlur2 )
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码
输出为:
本月将陆续推出相关系列文章,
篇篇精彩,尽请关注。