解释 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
中的值来获得更丰富的图表,以便低值更广泛地分布在颜色范围内。
例如,您可以通过取log
的freq
来获得更好的值分布。 (您可能不想丢弃最高值,因为它们对应于具有最高功率的频率。)
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 输出的主要内容,如果未能解决你的问题,请参考以下文章