发布时间:2021-09-28 00:06:02编辑:run阅读(5829)
非线性(空间)滤波器也同样作用于邻域,也类似于线性滤波器通过在图像上滑动核来实现。但是,其它过滤操作是基于有条件地使用邻域内像素的值,并且它们不会显示地使用一般形式的乘积和的系数。采用非线性滤波器可以有效地降低噪声,其基本功能是计算中值滤波器所在邻域的灰度值。这个滤波器是非线性的滤波,因为中值计算是一个非线性的运算操作。中值滤波器非常流行,这是因为对于某些类型的随机噪声(例如脉冲噪声),它们提供了优异的去噪能力,具有比类似大小的线性平滑滤波器相对少得多的模糊。非线性滤波器比线性滤波器更加强大。
PIL平滑,PIL的ImageFilter模块为图像的非线性去噪提供了一系列功能。
中值滤波器。中值滤波器用邻域像素值的中值替换每个像素。尽管这种滤波器可能会去噪图像中的某些细节,但它可以极好地去除椒盐噪声。使用中值滤波器,先要给邻域强度一个优先级,然后选择中间值。中值滤波对统计异常值具有较强的平复性,适应性强,模糊程度低,易于实现。PIL的ImageFilter模块的MedianFilter()函数如何从有噪声的图像中去除椒盐噪声,添加不同级别的噪声,使用不同大小的核窗口作为中值滤波器.
from PIL import Image, ImageEnhance, ImageFilter import matplotlib.pylab as pylab import numpy as np pylab.rcParams['font.sans-serif'] = ['KaiTi'] pylab.rcParams['axes.unicode_minus'] = False def plot_image(image, title=''): pylab.title(title, size=30) pylab.imshow(image) pylab.axis('off') i = 1 pylab.figure(figsize=(25, 20)) for prop_noise in np.linspace(0.05, 0.3, 3): im = Image.open(r'D:\image_processing\image4\f.jpg') n = int(im.width * im.height * prop_noise) x, y = np.random.randint(0, im.width, n), np.random.randint(0, im.height, n) for (x, y) in zip(x, y): im.putpixel((x, y), ((0, 0, 0) if np.random.rand() < 0.5 else (255, 255, 255))) im.save(r'D:\image_processing\image4\_' + str(prop_noise) + '.jpg') pylab.subplot(6, 4, i) plot_image(im, '参杂了' + str(int(100*prop_noise)) + '%噪声的原始图像') i += 1 for sz in [3, 7, 11]: im1 = im.filter(ImageFilter.MedianFilter(size=sz)) pylab.subplot(6, 4, i) plot_image(im1, '输出(中值滤波器大小为' + str(sz) + ')') i += 1 pylab.show()
从图中可以看出,非线性中值滤波器对脉冲噪声(又称椒盐噪声)的滤波器效果明显好于线性均值和加权均值(高斯)滤波器,但存在一定的斑片状,丢失了某些细节。
最大值滤波器和最小值滤波器
使用MaxFilter()去除脉冲噪声。然后使用MinFilter()去除图像中的椒盐噪声。
from PIL import Image, ImageEnhance, ImageFilter import matplotlib.pylab as pylab pylab.rcParams['font.sans-serif'] = ['KaiTi'] pylab.rcParams['axes.unicode_minus'] = False def plot_image(image, title=''): pylab.title(title, size=15) pylab.imshow(image) pylab.axis('off') im = Image.open(r'D:\image_processing\image4\_0.3.jpg') pylab.subplot(3, 1, 1) plot_image(im, '参杂了30%噪声的原始图像') im1 = im.filter(ImageFilter.MaxFilter(size=3)) pylab.subplot(3, 1, 2) plot_image(im1, '输出(最大值滤波器大小为3)') im2 = im.filter(ImageFilter.MinFilter(size=3)) pylab.subplot(3, 1, 3) plot_image(im2, '输出(最小值滤波器大小为3)') pylab.tight_layout() pylab.show()
可以看到,最大值滤波器和最小值滤波器在去除噪声图像的脉冲噪声方面都具有一定的效果。
47742
46232
37105
34624
29226
25881
24741
19860
19413
17903
5711°
6311°
5829°
5884°
6980°
5826°
5841°
6357°
6312°
7669°