• 图像的离散傅里叶变换-python实战


    前言

    图像处理中的一个更高级的主题与傅里叶变换的概念有关。简而言之,一些图像包含用户可能想要去除的系统噪声。如果这种噪声足够规则,使用离散傅里叶变换(DFT/FFT)调整可能有助于图像处理。在本文中,我们将确切地看到如何做到这一点。
    本文参考如下博文:Image Processing with Python — Application of Fourier Transformation

    图像离散傅里叶变换代码

    导入所需要的库

    import numpy as np
    import matplotlib.pyplot as plt
    from skimage.io import imread, imshow
    from skimage.color import rgb2hsv, rgb2gray, rgb2yuv
    from skimage import color, exposure, transform
    from skimage.exposure import equalize_hist
    

    导入图像并转换为灰度图

    dark_image = imread('against_the_light.png')
    

    在这里插入图片描述
    本文试图找到一种方法来消除(或至少大幅减少)后面的电线。首先将图像转换为灰度图。

    dark_image_grey = rgb2gray(dark_image)
    plt.figure(num=None, figsize=(8, 6), dpi=80)
    plt.imshow(dark_image_grey, cmap='gray');
    

    Greyscale Image

    使用FFT对图像进行变换

    使用Skimage中的fft函数对图像进行变换。导入代码:

    dark_image_grey_fourier = np.fft.fftshift(np.fft.fft2(dark_image_grey))
    plt.figure(num=None, figsize=(8, 6), dpi=80)
    plt.imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray');
    

    Fourier Transformation of the Image
    在图像中,可以看到白色的垂直线和水平线,它们是图像中尖锐的水平和垂直元素。

    • 首先,首先掩盖住其中的垂直白线
    def fourier_masker_ver(image, i):
        f_size = 15
        dark_image_grey_fourier =
        np.fft.fftshift(np.fft.fft2(rgb2gray(image)))
        dark_image_grey_fourier[:225, 235:240] = i
        dark_image_grey_fourier[-225:,235:240] = i
        fig, ax = plt.subplots(1,3,figsize=(15,15))
        ax[0].imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray')
        ax[0].set_title('Masked Fourier', fontsize = f_size)
        ax[1].imshow(rgb2gray(image), cmap = 'gray')
        ax[1].set_title('Greyscale Image', fontsize = f_size);
        ax[2].imshow(abs(np.fft.ifft2(dark_image_grey_fourier)), 
                         cmap='gray')
        ax[2].set_title('Transformed Greyscale Image', 
                         fontsize = f_size);
        
    fourier_masker(dark_image, 1)
    

    Fourier Transform Vertical Masked Image
    我们可以看到水平电缆的尺寸明显减小了。

    • 其次掩盖水平线
    def fourier_masker_hor(image, i):
       f_size = 15
       dark_image_grey_fourier =
       np.fft.fftshift(np.fft.fft2(rgb2gray(image)))
       dark_image_grey_fourier[235:240, :230] = i
       dark_image_grey_fourier[235:240,-230:] = i
       fig, ax = plt.subplots(1,3,figsize=(15,15))
       ax[0].imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray')
       ax[0].set_title('Masked Fourier', fontsize = f_size)
       ax[1].imshow(rgb2gray(image), cmap = 'gray')
       ax[1].set_title('Greyscale Image', fontsize = f_size);
       ax[2].imshow(abs(np.fft.ifft2(dark_image_grey_fourier)), 
                        cmap='gray')
       ax[2].set_title('Transformed Greyscale Image', 
                        fontsize = f_size);
    fourier_masker_hor(dark_image, 1)
    

    Fourier Transform Horizontal Masked Image
    可以看到图像的所有垂直方向都被模糊了。这在电线杆上非常明显。虽然在某些情况下有所帮助,但在这里显然没有帮助。

    • 最后,在保留原始图像颜色的同时进行傅里叶变换调整
     def fourier_transform_rgb(image):
        f_size = 25
        transformed_channels = []
        for i in range(3):
            rgb_fft = np.fft.fftshift(np.fft.fft2((image[:, :, i])))
            rgb_fft[:225, 235:237] = 1
            rgb_fft[-225:,235:237] = 1
            transformed_channels.append(abs(np.fft.ifft2(rgb_fft)))
        
        final_image = np.dstack([transformed_channels[0].astype(int), 
                                 transformed_channels[1].astype(int), 
                                 transformed_channels[2].astype(int)])
        
        fig, ax = plt.subplots(1, 2, figsize=(17,12))
        ax[0].imshow(image)
        ax[0].set_title('Original Image', fontsize = f_size)
        ax[0].set_axis_off()
        
        ax[1].imshow(final_image)
        ax[1].set_title('Transformed Image', fontsize = f_size)
        ax[1].set_axis_off()
        
        fig.tight_layout()
    

    Fourier Transformed Colored Image
    可以看到水平电线减弱了,而图像的其余部分基本保持不变。

  • 相关阅读:
    Java8新特性--函数式接口
    nas连接萤石云摄像机CTQ6X
    【js】防抖和节流的使用场景和区别:
    阿里云服务器配置选择指南(2023新版教程)
    单例设计模式
    职场人的拖延症晚癌克星来啦 当当狸时间管理器
    【每日一题】补档 ARC134D - Concatenate Subsequences | 思维 | 简单
    有了这个工具,支付宝商家多个账号下的账单管理更方便了
    rabbitmq简记
    【无代码】【VR开发】【Unity】【VRTK】4-导入VRTK Tilia Package
  • 原文地址:https://blog.csdn.net/u012762410/article/details/127038071