图像的离散傅里叶变换-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
可以看到水平电线减弱了,而图像的其余部分基本保持不变。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值