使用openCV对加噪的图像进行滤波
分别利用均值滤波器、box滤波器、高斯滤波器、中值滤波器对以上五种加了噪声的图像进行滤波,比较滤波器的效果,调用的函数可以参考:cv2.blur(), cv2.boxFilter(), cv2.GaussianBlur(), cv2.medianBlur()
"""
# @Time : 2020/4/11
# @Author : JMChen
"""
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from skimage.util import random_noise
def savefig(fig, plt, filename, width, height):
# 设置字体为SimHei显示中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
fig.set_size_inches(width / 300, height / 300)
# 加水印
fig.text(0.65, 0.45, '2018xxxxxxxx_XXX', fontsize=25, rotation=10, color='red', ha='right', va='bottom', alpha=0.5)
# 删除坐标轴的刻度显示
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
# 调整子图
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.margins(0, 0)
fig.savefig(filename, format='png', transparent=True, dpi=300, pad_inches=0)
def dealFit(noise_img, title_str, savename):
img = cv.imread('lena.png', cv.IMREAD_GRAYSCALE)
r = 2
c = 3
f = plt.figure(figsize=(c * img.shape[1] / 200, r * 1.1 * img.shape[0] / 200), dpi=300)
f.add_subplot(r, c, 1)
plt.title('original')
plt.imshow(img, cmap='gray')
plt.axis('off')
f.add_subplot(r, c, 2)
plt.imshow(noise_img, cmap='gray')
plt.title(title_str)
plt.axis('off')
f.add_subplot(r, c, 3)
blur = cv.blur(noise_img, (5, 5))
plt.imshow(blur, cmap='gray')
plt.title('average filter')
plt.axis('off')
f.add_subplot(r, c, 4)
blur = cv.boxFilter(noise_img, -1, (5, 5), normalize=False)
plt.imshow(blur, cmap='gray')
plt.title('box filter')
plt.axis('off')
f.add_subplot(r, c, 5)
blur = cv.GaussianBlur(noise_img, (5, 5), 0)
plt.imshow(blur, cmap='gray')
plt.title('gaussian filter')
plt.axis('off')
f.add_subplot(r, c, 6)
noise_img = (noise_img * 255).astype("uint8")
blur = cv.medianBlur(noise_img, 5)
plt.imshow(blur, cmap='gray')
plt.title('media filter')
plt.axis('off')
plt.show()
savefig(f, plt, savename, 2048, 1400)
img = cv.imread('lena.png', cv.IMREAD_GRAYSCALE)
noise_img = random_noise(img, mode='gaussian', seed=None, clip=True)
dealFit(noise_img, 'gaussian noise', 'task3b1.png')
noise_img = random_noise(img, mode='salt', amount=0.1)
dealFit(noise_img, 'salt noise', 'task3b2.png')
noise_img = random_noise(img, mode='pepper', amount=0.1)
dealFit(noise_img, 'pepper noise', 'task3b3.png')
noise_img = random_noise(img, mode='s&p', amount=0.1)
dealFit(noise_img, 'salt and pepper noise', 'task3b4.png')
noise_img = random_noise(img, mode='speckle')
dealFit(noise_img, 'speckle noise', 'task3b5.png')
注意中值滤波器要求图像数据为uint8类型,可以利用noise_img = (noise_img * 255).astype(“uint8”)将图像数据从float(范围[0,1])转化成int(范围[0,255])
此处很坑 不转化报错!!!