Matlab与Numpy+Python FFT2之间的差异?

3 投票
2 回答
2569 浏览
提问于 2025-04-16 14:18

我在用Python和Numpy做一些关于衍射的作业。结果总是跟我预期的不一样,这让我很困惑。

我用来生成快速傅里叶变换(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')

这里是图片 -> https://i.stack.imgur.com/tPJq7.jpg

那么这里到底发生了什么呢?为什么FFT的图片差别这么大?是因为实现方式不同吗?为什么我的作业代码不管用 :(

2 个回答

2

补充一下mor22的回答:

在Matlab中,你可以使用fftshift这个功能,把最低的频率移动到中心位置。简单来说,它就是把左上角和右下角的部分交换(还有右上角和左下角的部分也交换)。

1

首先,在Matlab中,fft2函数返回的值是复数。对于imwrite这个函数如何处理这些复数,我不是很确定。尝试运行这段代码似乎能得到一些合理的结果。(使用log10可以帮助更好地显示结果)

rect = imread('rect.jpg');
rectfft = fft2(rect);
pcolor(log10(abs(rectfft)));
shading flat

图像在原点附近有些偏移,因为像素索引可能和图像的空间频率有关。也就是说,低空间频率的部分会出现在(0,0)附近,而高像素索引则是这些频率的别名。你可以通过一些矩阵操作来重新排列图像,把(0,0)放到中间。

撰写回答