解释numpy.fft.fft2输出

时间:2014-01-26 11:33:56

标签: python numpy fft frequency-distribution

我的目标是获得一幅具有图像空间频率的情节 - 有点像对它进行傅里叶变换。我不关心频率为f的特征图像上的位置(例如);我想要一个图形告诉我每个频率有多少(频段的幅度可以用与该频率形成对比的总和来表示)。

我试图通过numpy.fft.fft2函数执行此操作。

以下是描述我的用例的minimal example的链接。

事实证明,frequencies[:30,:30]只会得到明显更大的值,其中绝对最高值为frequencies[0,0]。我怎么解释这个?

  • 每个值的幅度到底意味着什么?
  • 我的最高值是frequency[0,0]什么是0 Hz频率是什么意思?
  • 我可以以某种方式对值进行合并,以使我的频谱与方向无关吗?

1 个答案:

答案 0 :(得分:11)

freq有一些非常大的值,以及许多小值。您可以通过绘图来看到

plt.hist(freq.ravel(), bins=100)

(见下文。)所以,当你使用

ax1.imshow(freq, interpolation="none")

Matplotlib使用freq.min()作为颜色范围中的最低值(默认情况下为蓝色),freq.max()作为颜色范围中的最高值(默认情况下为红色)。由于freq中的几乎所有值都接近蓝色末端,因此整个情节看起来都是蓝色。

您可以通过重新调整freq中的值来获得更丰富的信息,以便较低的值更广泛地分布在颜色范围内。

例如,您可以通过log的{​​{1}}来更好地分配值。 (你可能不想丢掉最高值,因为它们对应的是具有最高功率的频率。)

freq

enter image description here


来自the docs

  

输出类似于fft,包含零频率的术语   在变换轴的低位角,

因此,import matplotlib as ml import matplotlib.pyplot as plt import numpy as np import Image file_path = "data" image = np.asarray(Image.open(file_path).convert('L')) freq = np.fft.fft2(image) freq = np.abs(freq) fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(14, 6)) ax[0,0].hist(freq.ravel(), bins=100) ax[0,0].set_title('hist(freq)') ax[0,1].hist(np.log(freq).ravel(), bins=100) ax[0,1].set_title('hist(log(freq))') ax[1,0].imshow(np.log(freq), interpolation="none") ax[1,0].set_title('log(freq)') ax[1,1].imshow(image, interpolation="none") plt.show() 是“零频率”术语。换句话说,它是discrete Fourier Transform中的常数项。