使用滤波模板中像素点的中值点作为目标像素,这就称为中值滤波降噪(顾名思义)
Python实现过程如下:
图像数据为:
图像中存在典型的椒盐噪声,而中值降噪,对椒盐噪声的作用是非常有效的。
导入要使用的库:
import PIL.Image as Image
import matplotlib.pyplot as plt
import numpy as np
读入图片数据,并可视化:
img = Image.open('Fig0335(a)(ckt_board_saltpep_prob_pt05).tif')
plt.imshow(img, cmap = 'gray')
plt.axis('off')
plt.show()
滤波函数:
这几个空间滤波使用的函数基本相似,只是目标像素的计算过程不一样
def rejector(img, m, n):
img_data = np.array(img)
img_new = [[] for _ in range(np.shape(img_data)[0])]
a = m // 2
b = n // 2
for i in range(np.shape(img_data)[0]):
for j in range(np.shape(img_data)[1]):
num = []
for k in range(i-a, i+a+1, 1):
for l in range(j-b, j+b+1, 1):
c = k>=0 and k<np.shape(img_data)[0]
d = l>=0 and l<np.shape(img_data)[1]
if c and d:
num.append(img_data[k][l])
else:
num.append(0)
num = sorted(num)
y = m*n // 2
img_new[i].append(int(num[y]))
return img_new
调用滤波函数,得到结果,并可视化:
img_new = rejector(img, 3, 3)
plt.subplot(121)
plt.axis('off')
plt.imshow(img_new, cmap = 'gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(img, cmap = 'gray')
plt.show()
左侧为结果,右侧为原图像:
中值滤波结果与均值滤波结果比较:
左侧为中值滤波,中间为均值滤波,右侧为原图像