Matlab与Numpy+Python FFT2之间的差异?
我在用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)放到中间。