如何使用Numpy绘制FFT图像

5

这似乎是一个非常简单的问题,但我找不到任何相关文档。

我有一个在Numpy中的图片,并想要使用imshow显示FFT。

在Matlab中,我只需执行以下操作

F = fft(myimg)
imshow(F)

由于F为复数值,我无法在Numpy中做相同的操作。尝试使用imshow(real(F))会得到完全黑色的图像 - 我猜测是因为在[0,1]而不是0..255之间。乘以255也无法解决问题。

有什么想法可以得到我的绘图吗?

更新:

好的,natan指出了我错误地简化了这个问题。让我稍微退后一步。我有一个视频矩阵,大小为(200,30,30,3)。200帧,30x30像素,3个颜色通道。对于每个像素的每个颜色通道,我想计算该像素在系列中的时间fft。这应该给我一个新的矩阵,其大小为(200,30,30,3)。对于每个像素,每个颜色通道,都有一个200维的时间傅里叶变换结果。然后,我就可以查看由每个像素的第一个傅里叶变换系数的值创建的图像。

请注意,matlab fft操作在第一个非单例维度上运行,因此F = fft(video)正在执行我想要的操作。


你是指 fft 还是 fft2 - bla
这是一个提示,希望能给你一个积极的结果... - wim
抱歉,之前的翻译有歧义。实际上,我正在处理一系列图像(视频),并且对每个像素沿时间维度计算FFT。其中FFT是快速傅里叶变换的缩写。 - Kurt Spindler
你使用 myimg 并期望获得某种形式的一维跟踪。你的输入维度是多少? - bla
1个回答

9

这是一个使用scipy处理2D图像的例子:

from scipy import fftpack
import numpy as np
import pylab as py

# Take the fourier transform of the image.
F1 = fftpack.fft2(myimg)

# Now shift so that low spatial frequencies are in the center.
F2 = fftpack.fftshift( F1 )

# the 2D power spectrum is:
psd2D = np.abs( F2 )**2

# plot the power spectrum
py.figure(1)
py.clf()
py.imshow( psf2D )
py.show()

对于一维迹线,你可以在这里看到一个例子...


你为什么要做 ** 2?另外,我如何丢弃对 F2 不太重要的系数(模拟有损简单压缩)?有哪些标准?假设我们从 F2 中找出 max_coeff,然后我们可以丢弃(将它们置为零)所有满足 abs(F2[x,y]) => abs(37/100*max_coeff) 的系数。 - Leandro Moreira
1
因为功率或强度被定义为振幅的绝对值平方。请参见https://en.wikipedia.org/wiki/Spectral_density。关于丢弃系数,如果您想压缩数据,可以重新调整到较小的分辨率,或在其他地方阅读有关有损压缩的内容。 - bla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接