gpt4 book ai didi

python - 将 Matlab fft2 衍射示例转换为 Python

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:01 25 4
gpt4 key购买 nike

我尝试使用 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()

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

提前非常感谢

最佳答案

我的 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()

这会产生更好的结果:

Result

关于python - 将 Matlab fft2 衍射示例转换为 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20517309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com