【问题标题】:Converting a Matlab fft2 diffraction example into Python将 Matlab fft2 衍射示例转换为 Python
【发布时间】:2013-12-11 10:58:45
【问题描述】:

我尝试使用 python 自学一些 FFT 基础知识。目前我正在尝试使用 python 和相关库重现 matlab FFT2 衍射结果。

我试图模拟的例子可以在这里找到: http://www.mathworks.ch/ch/help/matlab/math/fast-fourier-transform-fft.html#brfb2vw-3

在页面底部你会看到这个matlab代码:

D1 = fft2(M);
D2 = fftshift(D1);

imagesc(abs(D2))
axis image
colormap(hot)
title('{\bf Diffraction Pattern}')

这会将圆形光圈图像(如果有影响,他们实际上将其构建为阵列)转换为衍射图案。

[圆形光圈] www.mathworks.ch/help/releases/R2013b/matlab/math/aperture.gif

【Matlab计算结果】 www.mathworks.ch/help/releases/R2013b/matlab/math/diffraction1.gif

问题是,当我拍摄他们的圆形光圈图像(作为 gif 图形)并应用等效的 scipy FFT2 指令时,我得到了不同的结果。为什么会有这种差异以及创建衍射图案的正确方法是什么。从衍射图案返回到产生它的图像是否有类似的陷阱?这是否仅在将光圈构建为这样的阵列时才有效?

我的python代码如下:

import sys
import numpy as np
import pylab as py
from scipy import misc, fftpack 

image = misc.imread(sys.argv[1])

D1 = fftpack.fft2(image)
D2 = fftpack.fftshift(D1)

abs_image = np.abs(D2)
py.imshow(abs_image)
py.show()

我下载并使用了他们的圆形光圈图像作为输入(在裁剪比例等之后),但结果我在蓝色背景上得到了一个彩色十字准线。十字准线中间有一个看起来像小圆点的东西。这个结果是因为我使用的是下载的圆形光圈图像,它的边缘是方形的还是因为代码?

在此先感谢

【问题讨论】:

    标签: python matlab fft


    【解决方案1】:

    我的scipy.misc.imread 版本会给你一个W*H*4 的RGBA 颜色数组,而不是强度值,它上面的FFT 可能会给你不同的结果。

    我已将生成M 的Matlab 示例代码移植到numpy

    import numpy as np
    import pylab as py
    from scipy import misc, fftpack
    
    n = 2**10
    I = np.arange(1, n)
    x = I - n / 2
    y = n / 2 - I
    
    R = 10
    
    X = x[:, np.newaxis]
    Y = y[np.newaxis, :]
    
    M = X**2 + Y**2 < R**2
    
    D1 = fftpack.fft2(M)
    D2 = fftpack.fftshift(D1)
    
    abs_image = np.abs(D2)
    py.imshow(abs_image)
    py.show()
    

    这样会得到更好的结果:

    【讨论】:

    • 谢谢。简单的解释,简单的答案,恢复信心:)
    • 很高兴为您提供帮助 :) 如果您认为这充分回答了您的问题,请单击其左侧的复选标记图标接受答案。
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 2014-03-05
    • 2021-03-10
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多