将Matlab fft2衍射示例转换为Python

时间:2013-12-11 10:58:46

标签: python matlab fft

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

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

非常感谢提前

1 个答案:

答案 0 :(得分: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()

这会产生更好的结果:

Result