空域噪声滤波器(均值滤波器、排序统计滤波器)
均值滤波–cv2.blur(原始图像,核大小),指任意一点的像素值,都是周围 N*M 个像素值的均值。均值滤波器的特点为:随着核大小逐渐变大,会让图像变得更加模糊;如果设置为核大小为(1,1),则结果就是原始图像。均值滤波器的模板由标准像素平均和加权平均之分。如下图所示:
两个3x3平滑(均值)滤波器模板。每个模板前面的乘数等于1除以所有系数之和,这是计算平均值所要求的。
排序滤波器是一种非线性空间滤波器,这种滤波器的响应以滤波器包围的图像区域中所包含的像素的排序为基础,然后使用统计排序结果决定的值代替中心像素的值,这一类中最著名的滤波器是中值滤波器,本实验报告以中值滤波器为例,进行统计排序滤波器算法实现。
中值滤波–cv2.medianBlur(src, ksize)。这里的核大小 ksize 必须是奇数,将该点周围的像素点包括本身,按次序排列,取中位数作为点的像素值。中值滤波器的特点为:随着核大小逐渐变大,会让图像变得更加模糊;核必须是大于 1 的奇数,如 3、5、7 等;在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如 3、5、7 ,9等,对比均值滤波函数用法。
中值滤波器应用广泛,因为与大小相同的线性平滑滤波器相比,它能有效地降低某些随机噪声,且模糊度要小得多。对于单极和双极冲激噪声,中值滤波器的效果更好,但多次使用中值滤波器会使用图像模糊。
其他排序滤波器
最大值滤波器可用于找到图像中的最亮点,或用于消弱与明亮区域相信的暗色区域。此外由于胡椒噪声的值很低,因此可用这种滤波器来降低胡椒噪声。
最小值滤波器用于找到图像中的最暗点,或用于削弱与暗色区域的明亮区域。此外,还可通过最小运算降低盐粒噪声。
中点滤波器是统计排序滤波器与平均滤波器的结合。它最适合于处理随机分布的噪声,如高斯噪声或均匀噪声。
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def put(path):
img = cv2.imread(path, 1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rows, cols = img.shape[:2]
# 加噪声
img_noise = img.copy()
for i in range(5000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img_noise[x, y] = img[x, y] + np.random.randint(50, 100)
# 均值滤波
res1 = cv2.blur(img_noise, (9, 9))
# 统计排序滤波
# 中值滤波
res2 = cv2.medianBlur(img_noise, 5)
plt.subplot(2, 2, 1), plt.axis('off'), plt.imshow(img, plt.cm.gray), plt.title('原始图像')
plt.subplot(2, 2, 2), plt.axis('off'), plt.imshow(img_noise, plt.cm.gray), plt.title('加入噪声后图像')
plt.subplot(2, 2, 3), plt.axis('off'), plt.imshow(res1, plt.cm.gray), plt.title('均值滤波器')
plt.subplot(2, 2, 4), plt.axis('off'), plt.imshow(res2, plt.cm.gray), plt.title('中值滤波器')
# plt.savefig('1.new.jpg')
plt.show()
# 图像处理函数,要传入路径
put(r'../image/image3.jpg')