python3-scipy-图像复原

发布时间:2021-09-07 00:53:48编辑:run阅读(5069)

    scipy-图像复原,要进行图像复原,需对图像退化(degradation)过程进行建模,这样能够在很大程度上消除退化的影响,但面临图像信息和噪声会丢失信息。

    图像的基本退化模型:

    image.png

    g(x,y) = h(x,y) * f(x, y) + n(x, y) <---> G(u, v) = H(u, v) * F(u, v) + N(u, v)

    然后就可以对模糊的图像使用逆滤波器(即使用相同的H)获得原始图像。


    利用FFT去卷积和逆滤波。

    假定有已知的具有模糊核的模糊图像,典型的图像处理任务要求就是恢复原始图像,或至少近似于原始图像。我们称这种特殊的图像处理过程为去卷积,有一类朴素滤波器可以应用于频域中来实现逆滤波器的功能,先用高斯模糊对图像进行模糊处理。

    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
    
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = 255 * rgb2gray(imread(r'D:\image_processing\image3\eeq.jpg'))
    gauss_kernel = np.outer(signal.gaussian(im.shape[0], 3), signal.gaussian(im.shape[1], 3))
    freq = fp.fft2(im)
    freq_kernel = fp.fft2(fp.ifftshift(gauss_kernel))
    convolved = freq * freq_kernel
    im_blur = fp.ifft2(convolved).real
    im_blur = 255 * im_blur / np.max(im_blur)
    # pylab.figure(figsize=(20, 15))
    # pylab.imshow(im_blur)
    # pylab.axis('off')
    # pylab.show()
    
    epsilon = 10 ** -6
    freq = fp.fft2(im_blur)
    freq_kernel = 1 / (epsilon + freq_kernel)
    convolved = freq * freq_kernel
    im_restored = fp.ifft2(convolved).real
    im_restored = 255 * im_restored / np.max(im_restored)
    print(np.max(im), np.max(im_restored))
    pylab.figure(figsize=(10, 10))
    pylab.gray()
    pylab.subplot(221)
    pylab.imshow(im)
    pylab.title('原始图像', size=25)
    pylab.axis('off')
    pylab.subplot(222)
    pylab.imshow(im_blur)
    pylab.title('模糊图像', size=25)
    pylab.axis('off')
    pylab.subplot(223)
    pylab.imshow(im_restored)
    pylab.title('逆滤波图像复原', size=25)
    pylab.axis('off')
    pylab.subplot(224)
    pylab.imshow(im_restored - im)
    pylab.title('复原图像和原始图像差异', size=25)
    pylab.axis('off')
    pylab.show()

    image.png


    利用维纳滤波器去卷积

    如何使用逆滤波器从模糊图像(利用一个已知模糊核)中获得近似原始图像。图像处理的另一项重要任务是从损坏的信号中去噪声,这就是总所周知的图像复原。使用scikit-image restoration模块的无监督维纳滤波器是如何利用去卷积实现图像去噪的。

    from skimage.io import imread
    from skimage import color, data, restoration
    from scipy.signal import convolve2d as conv2
    import matplotlib.pylab as pylab
    import numpy as np
    
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = color.rgb2gray(imread(r'D:\image_processing\image3\ccq.jpg'))
    n = 7
    psf = np.ones((n , n)) / n ** 2
    im1 = conv2(im, psf, 'same')
    im1 += 0.1  * np.random.standard_normal(im.shape)
    im2, _ = restoration.unsupervised_wiener(im1, psf)
    fig, axes = pylab.subplots(nrows=1, ncols=3, figsize=(20, 4), sharex=True, sharey=True)
    pylab.gray()
    axes[0].imshow(im)
    axes[0].axis('off')
    axes[0].set_title('原始图像', size=25)
    axes[1].imshow(im1)
    axes[1].axis('off')
    axes[1].set_title('模糊噪声图像', size=25)
    axes[2].imshow(im2)
    axes[2].axis('off')
    axes[2].set_title('自调整恢复图像', size=25)
    fig.tight_layout()
    pylab.show()

    image.png

    可以看到原始图像,模糊噪声图像以及使用无监督维纳滤波器复原的自调整图像。



    利用FFT实现图像去噪。

    利用具有FFT的LPF来阻塞傅里叶元素中的高频分量,以实现图像去噪。

    from scipy import stats, fftpack
    import matplotlib.pylab as pylab
    from matplotlib.colors import LogNorm
    import numpy as np
    
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = pylab.imread(r'D:\image_processing\chapter_3\aapng.png').astype(float)
    pylab.figure(figsize=(10, 10))
    pylab.subplot(221)
    pylab.imshow(im, pylab.cm.gray)
    pylab.axis('off')
    pylab.title('原始图像', size=25)
    
    im_fft = fftpack.fft2(im)
    def plot_spectrum(im_fft):
        pylab.subplot(222)
        pylab.imshow(np.abs(im_fft), norm=LogNorm(vmin=5), cmap=pylab.cm.afmhot)
        pylab.colorbar()
    plot_spectrum(fftpack.fftshift(im_fft))
    pylab.title('傅里叶变换频谱', size=25)
    pylab.show()

    image.png


    FFT中的滤波器,如何拒绝高频分量,并实现低通滤波器来衰减来自图像的噪声(对应于高频分量)。最终重建图像,使用IFFT从滤波后的傅里叶系数重建图像。

    from scipy import stats, fftpack
    import matplotlib.pylab as pylab
    import numpy as np
    from scipy import signal, misc, ndimage
    
    pylab.rcParams['font.sans-serif'] = ['KaiTi']
    # 解决保存图像是负号'-'显示为方块的问题
    pylab.rcParams['axes.unicode_minus'] = False
    im = pylab.imread(r'D:\image_processing\chapter_3\222.png').astype(float)
    pylab.figure(figsize=(10, 10))
    pylab.subplot(221)
    pylab.imshow(im, pylab.cm.gray)
    pylab.axis('off')
    pylab.title('原始图像', size=25)
    
    moon_fft2 = fftpack.fft2(im)
    
    cond = np.abs(moon_fft2) > 500
    
    moon_fft2[cond] = 0
    moon_ifft2 = fftpack.ifft2(moon_fft2)
    res = np.real(moon_ifft2)
    moon3 = ndimage.gaussian_filter(res, sigma=1.5)
    pylab.subplot(222)
    pylab.axis('off')
    pylab.imshow(moon3, cmap='gray')
    pylab.title('重建后的图像', size=25)
    pylab.show()

    image.png

关键字