【问题标题】:Fourier Transform in Python giving blank imagesPython中的傅立叶变换给出空白图像
【发布时间】:2019-11-19 15:00:36
【问题描述】:

我是 python 新手,我只是在图像上尝试二维傅里叶变换,然后在 numpy 中使用 ifft2 重建它。然而,频谱幅度和重建的是白色图像。这可能表明存在一些缩放问题,但我不明白如何解决它。

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
imgloc="C:\\Users\\AnacondaCodes\\cameraman.png"
img=mpimg.imread(imgloc,0)
import numpy as np
f=np.fft.fft2(img)
fshift=np.fft.fftshift(f)
magnitude_spectrum=20*np.log(np.abs(fshift))
f_ishift=np.fft.ifftshift(magnitude_spectrum)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)
plt.subplot(131),plt.imshow(img, cmap='gray')
plt.title('input image'), plt.xticks([]),plt.yticks([])
plt.subplot(132),plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_back,cmap='gray')
plt.title('reconstructed'), plt.xticks([]), plt.yticks([])`

【问题讨论】:

    标签: python transform fft


    【解决方案1】:

    您对频谱绝对值的对数进行了反向转换。这极大地改变了频谱。即使是绝对部分也不是一件好事,因为 FFT 将真实图像转换为复杂的光谱(现在显然有 2N 个数据点,其中 1/2 由于对称性是多余的)。现在绝对部分是在空间频域中查看频谱所必需的,但那是因为它由实部和虚部组成。该日志还有助于可视化,因为您有相当大的 DC 偏移(所有像素的平均值不为零),因此如果没有日志,您只会在黑色海洋中看到一个白点。

    如果您将频谱本身转换回来,一切都很好。

    import matplotlib.pyplot as p
    import numpy as np
    
    img = p.imread("c:/pddata/cameraman.png").astype(float)    
    spectrum = np.fft.fftshift(np.fft.fft2(img))
    
    img_back=np.fft.ifft2(np.fft.ifftshift(spectrum))
    
    
    p.figure(figsize=(20,6))
    p.subplot(131)
    p.imshow(img, cmap='gray')
    p.title('input image') 
    p.colorbar()
    
    p.subplot(132)
    p.imshow( np.log(np.abs(spectrum)) , cmap='gray')
    p.title('Magnitude Spectrum') 
    p.colorbar()
    
    p.subplot(133)
    p.imshow( np.abs(img_back),cmap='gray')
    p.title('reconstructed') 
    p.colorbar();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2021-05-18
      相关资源
      最近更新 更多