python3-scipy的频域高斯模糊滤波器

发布时间:2021-08-26 23:00:25编辑:run阅读(5849)

    scipy信号模块的fftconvolve()函数的频域高斯模糊滤波器.

    from skimage.io import imread
    import matplotlib.pylab as pylab
    import numpy as np
    from scipy import signal
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2)
    print(im.shape)
    gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3))
    im_blurred = signal.fftconvolve(im, gauss_kernel, mode='same')
    fig, (ax_original, ax_kernel, ax_blurred) = pylab.subplots(1, 3, figsize=(20, 8))
    ax_original.imshow(im, cmap='gray')
    ax_original.set_title('原始图像', size=25)
    ax_original.set_axis_off()
    ax_kernel.imshow(gauss_kernel)
    ax_kernel.set_title('高斯核', size=25)
    ax_kernel.set_axis_off()
    ax_blurred.imshow(im_blurred, cmap='gray')
    ax_blurred.set_title('模糊化图像', size=25)
    ax_blurred.set_axis_off()
    fig.show()

    image.png


    卷积后如何绘制原始图像和模糊图像的频谱

    from skimage.io import imread
    import scipy.fftpack as fp
    import matplotlib.pylab as pylab
    import numpy as np
    from scipy import signal
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2)
    gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3))
    im_blurred = signal.fftconvolve(im, gauss_kernel, mode='same')
    print(im.shape)
    F1 = fp.fft2((im).astype(float))
    F2 = fp.fftshift(F1)
    pylab.figure(figsize=(15, 8))
    pylab.subplot(1, 2, 1)
    pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray)
    pylab.title('原始图像频谱', size=25)
    F1 = fp.fft2((im_blurred).astype(float))
    F2 = fp.fftshift(F1)
    pylab.subplot(1, 2, 2)
    pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray)
    pylab.title('模糊图像频谱', size=25)
    pylab.show()

    image.png


    比较scipy convolve()和fftconvolve()与高斯模糊核的运行时间.可以利用python的timeit模块来比较图像域和频域卷积函数运行时间,由于频域卷积涉及单个矩阵的乘法运算,而不是一系列滑动窗口算法的计算,因此预计它会快的多。以及使用convolve()和fftconvolve()函数的输出结果.

    from skimage.io import imread
    import matplotlib.pylab as pylab
    import numpy as np
    import timeit
    from scipy import signal
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2)
    gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3))
    im_blurred1 = signal.convolve(im, gauss_kernel, mode='same')
    im_blurred2 = signal.fftconvolve(im, gauss_kernel, mode='same')
    def wrapper_convolve(func):
        def weapped_convolve():
            return func(im, gauss_kernel, mode='same')
        return weapped_convolve
    wrapped_convolve = wrapper_convolve(signal.convolve)
    wrapped_fftconvolve = wrapper_convolve(signal.fftconvolve)
    times1 = timeit.repeat(wrapped_convolve, number=1, repeat=100)
    print(times1)
    times2 = timeit.repeat(wrapped_fftconvolve, number=1, repeat=100)
    print(times2)
    # 以下代码展示了使用convolve()和fftconvolve()函数的输出结果
    pylab.figure(figsize=(15, 5))
    pylab.gray()
    pylab.subplot(131)
    pylab.imshow(im)
    pylab.title('原始图像', size=25)
    pylab.axis('off')
    pylab.subplot(132)
    pylab.imshow(im_blurred1)
    pylab.title('卷积输出图像', size=25)
    pylab.axis('off')
    pylab.subplot(133)
    pylab.imshow(im_blurred2)
    pylab.title('快速傅里叶卷积输出图像', size=25)
    pylab.axis('off')
    # 以下代码可视化了运行时间之间的差异,每个函数都在相同高斯核的输入图像上运行100次
    # 然后每个函数所花费时间的箱型图被绘制出来
    data1 = [times1, times2]
    pylab.figure(figsize=(8, 6))
    box = pylab.boxplot(data1, patch_artist=True)
    colors = ['cyan', 'pink']
    for patch, color in zip(box['boxes'], colors):
        patch.set_facecolor(color)
    pylab.xticks(np.arange(3), ('', 'convolve', 'fftconvolve'), size=20)
    pylab.yticks(fontsize=20)
    pylab.xlabel('scipy.signal卷积方法', size=20)
    pylab.ylabel('运行时间', size=20)
    pylab.show()

    可以看到使用convolve()和fftconvolve()函数的输出结果

    image.png



    以下代码可视化了运行时间之间的差异,每个函数都在相同高斯核的输入图像上运行100次,然后每个函数所花费时间的箱型图被绘制出来,可以看到fftconvolve()函数的平均运行速度更快

    image.png


关键字