将MatlabFFT2衍射示例转换为Python

将MatlabFFT2衍射示例转换为Python,python,matlab,fft,Python,Matlab,Fft,我试图教自己一些使用python的FFT基础知识。目前,我正在尝试使用python和相关库再现MatlabFFT2衍射结果 我尝试模拟的示例可以在这里找到: 在页面底部,您将看到以下matlab代码: D1 = fft2(M); D2 = fftshift(D1); imagesc(abs(D2)) axis image colormap(hot) title('{\bf Diffraction Pattern}') 这将圆孔图像转换为衍射图案(如果有区别的话,他们实际上将其构建为一个阵列

我试图教自己一些使用python的FFT基础知识。目前,我正在尝试使用python和相关库再现MatlabFFT2衍射结果

我尝试模拟的示例可以在这里找到:

在页面底部,您将看到以下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版本
将为您提供一个由RGBA颜色组成的W*H*4数组,而不是强度值,其上的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()
将numpy导入为np
将pylab作为py导入
来自scipy进口杂项,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
这样可以得到更好的结果:


我的版本的
scipy.misc.imread
将为您提供一个由RGBA颜色组成的W*H*4数组,而不是强度值,其上的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()
将numpy导入为np
将pylab作为py导入
来自scipy进口杂项,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
这样可以得到更好的结果:


谢谢。简单的解释,简单的回答,信心恢复:)很高兴为您提供帮助:)如果您认为这充分回答了您的问题,请单击左侧的复选标记图标接受答案。谢谢。简单的解释,简单的回答,信心恢复:)很高兴帮助:)如果你认为这足以回答你的问题,请点击左边的复选标记图标接受答案。