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

目录

  • 前言
  • 图像离散傅里叶变换代码
    • 导入所需要的库
    • 导入图像并转换为灰度图
    • 使用FFT对图像进行变换

前言

图像处理中的一个更高级的主题与傅里叶变换的概念有关。简而言之,一些图像包含用户可能想要去除的系统噪声。如果这种噪声足够规则,使用离散傅里叶变换(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')

图像的离散傅里叶变换-python实战_第1张图片
本文试图找到一种方法来消除(或至少大幅减少)后面的电线。首先将图像转换为灰度图。

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

图像的离散傅里叶变换-python实战_第2张图片

使用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');

图像的离散傅里叶变换-python实战_第3张图片
在图像中,可以看到白色的垂直线和水平线,它们是图像中尖锐的水平和垂直元素。

  • 首先,首先掩盖住其中的垂直白线
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)

图像的离散傅里叶变换-python实战_第4张图片
我们可以看到水平电缆的尺寸明显减小了。

  • 其次掩盖水平线
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)

图像的离散傅里叶变换-python实战_第5张图片
可以看到图像的所有垂直方向都被模糊了。这在电线杆上非常明显。虽然在某些情况下有所帮助,但在这里显然没有帮助。

  • 最后,在保留原始图像颜色的同时进行傅里叶变换调整
 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()

图像的离散傅里叶变换-python实战_第6张图片
可以看到水平电线减弱了,而图像的其余部分基本保持不变。

你可能感兴趣的:(图像处理)