系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
在原理上,是采用一个卷积核与图像进行卷积,下面是一个5X5的平均滤波器,也叫做核(kernel):
将核放在图像的一个像素上,求与邻域内(5×5)的像素和,再取平均数,用这个平均数代替该像素的值。重复以上操作直到将图像的每一个像素值都更新一遍。
OpenCV提供的函数cv2.filter2D()可以实现这种卷积操作。
实现
#%%
import numpy as np
import cv2
img = cv.imread('lena.jpg', 1)
kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(img,-1,kernel)
cv2.imshow('original', img)
cv2.imshow('2D convolution', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
用其像素点邻域范围内像素的平均值代替中心点像素值。这种方法可以使一幅图像模糊,去掉不相关的部分,但是它的缺点是在滤除噪声的同时也会滤掉图像的边缘信息,去失去很多细节。另外,均值滤波不能很好地去除噪声点。特别是椒盐噪声。
3×3的滤波器如图所示:
OpenCV中通过函数cv2.blur()或cv2.boxFilter()实现。
实现
#%%
import cv2
img = cv2.imread('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('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('jiazao.jpg', 0)
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()