中值滤波是数字信号处理和数字图像处理领域使用较多的预处理技术,使用邻域内所有信号的中位数替换中心像素的值,可以在滤除异常值的情况下较好地保留纹理信息。该技术会在一定程度上造成图像模糊和失真,滤波窗口变大时会非常明显。
import numpy as np
from PIL import Image
import scipy.signal as signal
im = Image.open('lena.jpg')
data = []
width, height = im.size
# 读取图像像素值
for h in range(height):
row = []
for w in range(width):
value = im.getpixel((w,h))
row.append(value)
data.append(row)
# 二维中值滤波
data = np.float32(data)
# 滤波窗口的大小会对结果产生很大影响
data = signal.medfilt2d(data, (3,3))
# 创建并保存结果图像
for h in range(height):
for w in range(width):
im.putpixel((w,h), int(data[h][w]))
im.save('result.jpg')
原始图像:
滤波窗口为(3,3)时的结果:
滤波窗口为(5,5)时的结果:
滤波窗口为(11,11)时的结果: