解释 numpy.fft.fft2 输出

Posted

技术标签:

【中文标题】解释 numpy.fft.fft2 输出【英文标题】:Interpret numpy.fft.fft2 output 【发布时间】:2014-02-17 05:28:27 【问题描述】:

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

我正在尝试通过numpy.fft.fft2 函数来做到这一点。

这里是一个指向minimal example 的链接,描述了我的用例。

事实证明,frequencies[:30,:30] 的值明显更大,其中绝对最高值是frequencies[0,0]。我该如何解释这个?

每个值的幅度究竟代表什么? 我的最高值在frequency[0,0] 是什么意思 什么是0 Hz 频率? 我能否以某种方式对这些值进行分级,以便我的频谱与方向无关?

【问题讨论】:

这个问题似乎离题了,因为它是关于理解傅里叶变换的作用(试试dsp.stackexchange.com)。 我理解 fft 原则上的作用,但我并没有真正得到 numpy.fft.fft2 输出,我本来期望一个没有“空”频带的一维数组。 【参考方案1】:

freq 有一些非常大的值,还有很多小的值。你可以通过绘图来看到

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

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

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

Matplotlib 使用freq.min() 作为颜色范围内的最小值(默认为蓝色),freq.max() 作为颜色范围内的最大值(默认为红色)。由于freq 中的几乎所有值都接近蓝色端,因此整个图看起来都是蓝色的。

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

例如,您可以通过取logfreq 来获得更好的值分布。 (您可能不想丢弃最高值,因为它们对应于具有最高功率的频率。)

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


来自the docs:

输出,类似于 fft,包含零频率项 在变换轴的低阶角,

因此,freq[0,0] 是“零频率”术语。也就是说,它是discrete Fourier Transform中的常数项。

【讨论】:

freq.ravel() 将二维数组分解为一维数组,从而连续读取每一行 - 对吧?为什么我在 200 处没有第二个峰值,在 400 处没有第三个峰值等(如 log(freq) 图所示)?还有,为什么 hist(log(freq)) 在 x 轴上停在 16 处? plt.hist 正在制作值的直方图。 x-axis 表示 log(freq) 的值,y-axis 表示这些值出现的频率。没有重复的峰值,因为相似的值被合并在一起。 16 的上限值意味着log(freq) 中的最大值接近16。确实,np.log(freq.max()) 等于14.8。 (是的,freq.ravel() 是二维数组的一维视图。) 你可以使用numpy.fft.fftfreq。有一个二维例子here. 有两个频率与freq[0,1] 相关联:x-direction 中的频率和y-direction 中的频率。频率将由np.fft.fftfreq(image.shape[0])[0], np.fft.fftfreq(image.shape[1])[1] 给出。阅读this 也可能有所帮助。

以上是关于解释 numpy.fft.fft2 输出的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn RandomForestClassifier - 如何解释树输出?

解释 keras 模型预测的输出

解释以下输出[重复]

解释 MSBuild 性能摘要输出

python笔记一(语言简介解释器输入输出)

如何更改解释器输出形状?