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

发布于 2024-10-25 06:57:23 字数 713 浏览 5 评论 0原文

所以我正在用 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')

图像在这里 -> https://i.sstatic.net/tPJq7.jpg

现在这里发生了什么?为什么 FFT 图像如此不同?不同的实现?为什么我的作业代码不起作用:(

So I was doing some homework on diffraction in Python with Numpy. My results simply wouldn't turn out how they should have, and I was confused.

The code I used to generate the FFTs is as follows:

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')

The images are here -> https://i.sstatic.net/tPJq7.jpg

Now what's going on here? Why are the FFT images so different? Different implementations? Why doesn't my homework code work :(

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最佳男配角 2024-11-01 06:57:23

添加到 mor22 的答案:

在 Matlab 中,您可以使用 fftshift 将最低频率移动到中心。它本质上只是交换左上象限和右下象限(以及交换右上象限和左下象限)。

To add to mor22's answer:

In Matlab you can use fftshift to move the lowest frequencies to the center. It essentialy just swaps the upper-left with the lower-right quadrant (and upper-right with lower-left).

眼角的笑意。 2024-11-01 06:57:23

首先,在 Matlab 中,从 fft2 返回的值是复数。我不确定 imwrite 将如何处理它们。尝试这段代码似乎给出了几乎合理的结果。 (取 log10 有助于显示)

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

图像相对于原点偏移,因为像素索引可能与图像的空间频率有关。即低空间频率看起来接近0,0。较高的像素索引是这些频率的别名。您可以通过一些矩阵操作重新排列图像,将 (0,0) 放在中间。

To begin with, in Matlab, the values returned from fft2 are complex. I'm not sure how imwrite will deal with them. Trying this code seems to give an almost sensible results. (Taking the log10 helps with the display)

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

The image is offset about the origin because the pixel index is probably related to the spatial frequency of the image. ie low spatial frequencies appear close to 0,0. The higher pixel indicies are aliases of these frequencies. You could rearrange the image to put the (0,0) in the middle with some matrix manipulation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文