所以我用Numpy在Python上做衍射作业。我的结果根本不会证明他们应该如何,我很困惑。
我用来生成FFT的代码如下:
Python:
aperaturearray = np.array(im) # Turn image into numpy array
Ta = np.fft.fftshift(np.fft.fft2(aperaturearray))
### I did some calculations here ###
ftfm = Image.fromarray(np.uint8(Utfm))
ftfm.save(("Path"))
Matlab:
rect = imread('PATH\pyRectangle.jpg');
rectfft = fft2(rect);
imwrite(rectfft, 'C:\Users\Dan\Documents\python\DiffPhotos\matlabRectfft','jpg')
pyrectmat = ifft2(pyfftrect);
imwrite(pyrectmat, 'Path','jpg')
图像在这里 - > http://imgur.com/a/3Cw81#EdFoA
现在发生了什么事?为什么FFT图像如此不同?不同的实施?为什么我的家庭作业代码不起作用:(
答案 0 :(得分:2)
添加到mor22的答案:
在Matlab中,您可以使用fftshift将最低频率移动到中心。它实际上只是将左上角与左下象限交换(右上角与左下方交换)。
答案 1 :(得分:1)
首先,在Matlab中,从fft2返回的值很复杂。我不确定imwrite会如何处理它们。尝试这个代码似乎给出了几乎合理的结果。 (使用log10有助于显示)
rect = imread('rect.jpg');
rectfft = fft2(rect);
pcolor(log10(abs(rectfft)));
shading flat
图像偏离原点,因为像素索引可能与图像的空间频率有关。即低空间频率接近0,0。较高像素指示是这些频率的别名。您可以重新排列图像,将(0,0)置于中间,并进行一些矩阵操作。