绘制图像的二维FFT。

8

我正在尝试绘制图像的二维FFT:

from scipy import fftpack, ndimage
import matplotlib.pyplot as plt

image = ndimage.imread('image2.jpg', flatten=True)     # flatten=True gives a greyscale image
fft2 = fftpack.fft2(image)

plt.imshow(fft2)
plt.show()

但是我遇到了TypeError: Image data can not convert to float的错误。

如何绘制图像的二维FFT?


我知道图像的FFT是复数,但关于原点对称。通常显示的是功率谱:复变换的模平方。我不知道scipy,但我会在索引中查找“功率谱”。注意,如果您想要反转它,请保留变换,因为模平方/PS不能反转。 - nigel222
1个回答

12
任何 FFT 的结果通常由复数组成。这就是为什么您无法以此方式绘制它的原因。根据您要查找的内容,您可以开始查看绝对值。
plt.imshow(abs(fft2))

谢谢!当然,我不知道为什么我忘记了使用 abs(...)... 抱歉!还有一件事,这是输入:image2.jpg。为什么输出结果只是纯蓝色的?我在FFT输出中看不到任何东西... - Basj
7
由于您的组成部分较少(例如0,0直流分量),因此比例尺不好。尝试在对数比例尺下操作,即plt.imshow(np.log10(abs(fft2))) - Aguy
3
使用 plt.imshow(20*np.log10(abs(fft2))) 解决了问题... 这是我在多年研究音频1D FFT和STFT之后,现在进入2D FFT的第一步... :) 你有什么想法可以通过将某些2DFFT数据点置零,然后进行逆FFT来去除这张图片的水平线吗? - Basj
我的初始目标是去除图片中的水平或接近水平的线条。 - Basj
1
这很棘手。将fft组件置空可能不会按照您的期望工作...我建议您在计算机视觉论坛上尝试一下。 - Aguy
显示剩余2条评论

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