python3-scipy-带阻(陷波)滤波器

发布时间:2021-09-02 23:09:04编辑:run阅读(6222)

    带阻滤波器(Band-Stop Filter,BSF)可阻塞或拒绝来自图像(通过DFT获得)频域表示的经选择的频率成分。带阻滤波器对从图像中去除周期性噪声非常有用。


    先添加一些周期性噪声(正弦噪声)至图像中,创建一个有噪声成分的图像,然后观察图像频域中噪声的影响。

    from skimage.io import imread
    from scipy import stats, fftpack
    import matplotlib.pylab as pylab
    import numpy as np
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    pylab.figure(figsize=(15, 10))
    im = np.mean(imread(r'D:\image_processing\image3\aac.jpg'), axis=2) / 255
    print(im.shape)
    pylab.subplot(2, 2, 1)
    pylab.imshow(im, cmap='gray')
    pylab.axis('off')
    pylab.title('原始图像', size=20)
    F1 = fftpack.fft2((im).astype(float))
    F2 = fftpack.fftshift(F1)
    pylab.subplot(2, 2, 2)
    pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray)
    pylab.xticks(np.arange(0, im.shape[1], 25))
    pylab.yticks(np.arange(0, im.shape[0], 25))
    pylab.title('原始图像频谱', size=20)
    for n in range(im.shape[1]):
        im[:, n] += np.cos(0.1 * np.pi * n)
    pylab.subplot(2, 2, 3)
    pylab.imshow(im, cmap='gray')
    pylab.axis('off')
    pylab.title('添加正弦噪声后图像', size=20)
    F1 = fftpack.fft2((im).astype(float))
    F2 = fftpack.fftshift(F1)
    pylab.subplot(2, 2, 4)
    pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray)
    pylab.xticks(np.arange(0, im.shape[1], 25))
    pylab.yticks(np.arange(0, im.shape[0], 25))
    pylab.axis('off')
    pylab.title('噪声图像频谱', size=20)
    pylab.tight_layout()
    pylab.show()

    image.png

    可以看到,水平线上的周期噪声非常明显。


    设计一个带阻或陷波滤波器,通过如下代码将对应的频率分量设置为零,来消除产生的噪声。

    from skimage.io import imread
    from scipy import stats, fftpack
    import matplotlib.pylab as pylab
    import numpy as np
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    pylab.figure(figsize=(15, 10))
    im = np.mean(imread(r'D:\image_processing\image3\aac.jpg'), axis=2) / 255
    print(im.shape)
    pylab.subplot(2, 2, 1)
    pylab.imshow(im, cmap='gray')
    pylab.axis('off')
    pylab.title('原始图像', size=20)
    F1 = fftpack.fft2((im).astype(float))
    F2 = fftpack.fftshift(F1)
    for n in range(im.shape[1]):
        im[:, n] += np.cos(0.1 * np.pi * n)
    pylab.subplot(2, 2, 3)
    pylab.imshow(im, cmap='gray')
    pylab.axis('off')
    pylab.title('添加正弦噪声后图像', size=20)
    F2[170:176,:220] = F2[170:176, 230:] = 0
    im1 = fftpack.ifft2(fftpack.ifftshift(F2)).real
    pylab.subplot(2, 2, 4)
    pylab.imshow(im1, cmap='gray')
    pylab.axis('off')
    pylab.title('应用带阻滤波器去除图像周期噪声', size=20)
    pylab.tight_layout()
    pylab.show()

    image.png

    应用带阻滤波器后所得到的复原图像,可以看到,原始图像比复原图像更清晰,这是因为原始图像本身的一些真实特性频率连同噪声一起被带阻滤波器所清除。

关键字