中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值滤波的方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成上升(或下降)的为二维数据序列。
中值滤波会选取数字图像或数字序列中像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值,让周围的像素值接近真实值,从而消除孤立的噪声点。
在该序列中,处于中心位置(也叫中心点或中值点)的值是“142”,因此用该值替换原来的像素值 “215”,作为当前点的新像素值。
import cv2 import matplotlib.pylab as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体为黑体 mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 均值滤波 img = cv2.imread("lena.jpeg") # 解决彩色图像出现色差问题 b, g, r = cv2.split(img) # 分别提取B、G、R通道 img_new = cv2.merge([r, g, b]) # 重新组合为R、G、B blur = cv2.blur(img_new, (25, 25)) blur_med = cv2.medianBlur(img_new, 25) blur_gauss = cv2.blur(img_new, (25, 25), 0) # 显示图像 # plt.subplot(nrows, ncols, index) # 表示在当前画布的右上角创建一个1行3列的绘图区域,同时 选择在第 1 个位置绘制子图。 plt.subplot(1, 4, 1) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 plt.imshow(img_new) plt.title('原图') plt.subplot(1, 4, 2) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 # plt.imshow(blur, 'gray') plt.imshow(blur) plt.title('均值滤波') plt.subplot(1, 4, 3) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 plt.imshow(blur_med) plt.title('中值滤波') plt.subplot(1, 4, 4) plt.xticks([]), plt.yticks([]) # 隐藏x和y轴 plt.imshow(blur_gauss) plt.title('高斯滤波') plt.show()