python3-scipy卷积定理和频域高斯模糊

发布时间:2021-08-25 23:01:53编辑:run阅读(6579)

    Scipy卷积定理和频域高斯模糊.


    卷积定理的应用,卷积定理是指在图像域中的卷积等价于频域中的简单乘法。

    卷积定理:f(x, y) * h(x, y) <==> F(u, v)H(u, v)  空域卷积=频域乘法


    频域滤波的基本步骤。将原始图像F和核(掩模,退化或增强函数)作为输入。首先两个输入项都需要用DFT转换成频域,然后应用卷积(根据卷积定理,一个元素的乘法)。将卷积后的图像输出到频域,在频域上应用IDFT得到重建后的图像(对原始图像进行一定的退化或增强)。


    带有numpy fft的频域高斯模糊滤波器

    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
    pylab.figure(figsize=(20, 15))
    pylab.gray()
    im = np.mean(imread(r'D:\image_processing\image_two\1dd.jpg'), axis=2)
    gauss_kernel = np.outer(signal.gaussian(im.shape[0], 5), signal.gaussian(im.shape[1], 5))
    freq = fp.fft2(im)
    assert(freq.shape == gauss_kernel.shape)
    freq_kernel = fp.fft2(fp.ifftshift(gauss_kernel))
    convolved = freq * freq_kernel
    im1 = fp.ifft2(convolved).real
    pylab.subplot(2, 3, 1)
    pylab.imshow(im)
    pylab.title('原始图像',size=25)
    pylab.axis('off')
    pylab.subplot(2, 3, 2)
    pylab.imshow(gauss_kernel)
    pylab.title('高斯核',size=25)
    pylab.axis('off')
    pylab.subplot(2, 3, 3)
    pylab.imshow(im1)
    pylab.title('输出图像',size=25)
    pylab.axis('off')
    pylab.subplot(2, 3, 4)
    pylab.imshow((20*np.log10(0.1+fp.fftshift(freq))).astype(int))
    pylab.title('原始图像频谱',size=25)
    pylab.axis('off')
    pylab.subplot(2, 3, 5)
    pylab.imshow((20*np.log10(0.1+fp.fftshift(freq_kernel))).astype(int))
    pylab.title('高斯核频谱',size=25)
    pylab.axis('off')
    pylab.subplot(2, 3, 6)
    pylab.imshow((20*np.log10(0.1+fp.fftshift(convolved))).astype(int))
    pylab.title('输出图像频谱',size=25)
    pylab.axis('off')
    pylab.subplots_adjust(wspace=0.2, hspace=0)
    pylab.show()

    image.png

    可以看到其中包括在空域上的原始图像,高斯核,卷积后的图像,以及在频域上的原始频谱,高斯核频谱和输出图像频谱。



    二维高斯LPF核频谱,如何用对数变换在二维图中绘制高斯核的频谱:

    from skimage.io import imread
    import scipy.fftpack as fp
    from skimage.color import rgb2gray
    import matplotlib.pylab as pylab
    import numpy as np
    from scipy import signal
    
    im = rgb2gray(imread(r'D:\image_processing\image_two\1dd.jpg'))
    gauss_kernel = np.outer(signal.gaussian(im.shape[0], 1), signal.gaussian(im.shape[1], 1))
    freq = fp.fft2(im)
    freq_kernel = fp.fft2(fp.ifftshift(gauss_kernel))
    pylab.imshow((20*np.log10(0.01+fp.fftshift(freq_kernel))).real.astype(int), cmap='coolwarm')
    pylab.colorbar()
    pylab.show()

    image.png

    可以看到,图中有一个颜色条,因为高斯核是一种低通滤波器,它的频谱对于中心的频谱有较高的值(允许更多的低频值),并且随着值从中心向高频值的移动而逐渐减小。



    三维高斯核频谱。

    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    # 指定默认字体
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    x, y = np.mgrid[-2:2:200j, -2:2:200j]
    z=(1/2*math.pi*3**2)*np.exp(-(x**2+y**2)/2*3**2)
    ax = plt.subplot(111, projection='3d')
    ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow', alpha=0.1)
    
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('z')
    ax.set_title('三维高斯核',size=25)
    plt.show()

    image.png


关键字