这篇文章上次修改于 248 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

图像平滑既图像模糊处理,通常可以用来消除椒盐噪声和高斯噪声等噪声影响,也可以用来后续进行图像锐化操作。

读取图片

img = cv2.imread('lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

image.png
可以看到,读取的图片布满椒盐噪声。

下面通过不同的滤波器观察图片的变化:

均值滤波

均值滤波是所有滤波器中最为普遍和简单的滤波器,其滤波对于图片的每一个部分的权重是相同的

# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

滤波效果:
image.png
可以看出,对于均值滤波,对整张图片的模糊效果很明显,并且没有侧重于具体的哪一个部分,但是,均值滤波对于椒盐噪声并不敏感,也就是去除椒盐噪声的效果并不理想。

方框滤波

# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果与均值滤波类似,同样不是很理想。

高斯滤波

高斯滤波的模板系数与均值滤波不同,均值滤波的系数都为1,而高斯滤波的系数,随着远离模板中心而减小。也就是突出中心点的权重。同时,模板系数之和为1。

# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:
image.png

中值滤波

中值滤波是一种非线性滤波器,其大致的工作原理是一种统计排序滤波,将领域像素按从大到小排列,取中间值覆盖原有的值,可以用来消除孤立的亮点或暗点,因此,该滤波器对去除椒盐噪声的效果要好于其他的滤波器,但对大范围的噪声没有作用。

# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
image.png