使用滤波模板中像素点的中值点作为目标像素,这就称为中值滤波降噪(顾名思义)
Python实现过程如下:
图像数据为:
图像中存在典型的椒盐噪声,而中值降噪,对椒盐噪声的作用是非常有效的。
导入要使用的库:
import PIL.Image as Imageimport matplotlib.pyplot as pltimport 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 // 2b = n // 2for 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 // 2img_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()
左侧为结果,右侧为原图像:
中值滤波结果与均值滤波结果比较:
左侧为中值滤波,中间为均值滤波,右侧为原图像