python3-PIL线性噪声平滑

发布时间:2021-09-23 23:31:15编辑:run阅读(4306)

    线性(空间)滤波具有对(在邻域内)像素值加权求和的功能,它是一种线性运算,可以用来对图像进行模糊或去噪。模糊用于预处理过程,如删除不重要的(不相关的)细节。常用的线性滤波器有盒式滤波器和高斯滤波器。滤波器是通过一个小(如3X3)核得以实现的,通过在输入图像上滑动掩模重新计算像素值,并将过滤函数应用到输入图像的每一个可能的像素(输入图像中心像素值所对应的掩模所具有的权重被像素值的加权和所替代)。盒式滤波器(也称为均值滤波器)用其邻域的平均值替换每个像素,并(通过去除清晰的特征,例如模糊边缘而空间平滑消除噪声)实现平滑效果。


    基于ImageFilter平滑,PIL的ImageFilter模块的滤波功能如何用于对噪声图像进行去噪。通过改变输入图像的噪声水平来观察其对模糊滤波器的影响。

    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=20)
        pylab.imshow(image)
        pylab.axis('off')
    i = 1
    pylab.figure(figsize=(20, 15))
    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, 2, i)
        plot_image(im, '参杂了' + str(int(100*prop_noise)) + '%噪声的原始图像')
        i += 1
        im1 = im.filter(ImageFilter.BLUR)
        pylab.subplot(6, 2, i)
        plot_image(im1, '模糊图像')
        i += 1
    pylab.show()

    image.png

    可以看到,随着输入图像噪声的增大,平滑后的图像质量变差。

关键字