我的目标是获得一幅具有图像空间频率的情节 - 有点像对它进行傅里叶变换。我不关心频率为f的特征图像上的位置(例如);我想要一个图形告诉我每个频率有多少(频段的幅度可以用与该频率形成对比的总和来表示)。
我试图通过numpy.fft.fft2
函数执行此操作。
以下是描述我的用例的minimal example的链接。
事实证明,frequencies[:30,:30]
只会得到明显更大的值,其中绝对最高值为frequencies[0,0]
。我怎么解释这个?
frequency[0,0]
什么是0 Hz
频率是什么意思?答案 0 :(得分:11)
freq
有一些非常大的值,以及许多小值。您可以通过绘图来看到
plt.hist(freq.ravel(), bins=100)
(见下文。)所以,当你使用
时ax1.imshow(freq, interpolation="none")
Matplotlib使用freq.min()
作为颜色范围中的最低值(默认情况下为蓝色),freq.max()
作为颜色范围中的最高值(默认情况下为红色)。由于freq
中的几乎所有值都接近蓝色末端,因此整个情节看起来都是蓝色。
您可以通过重新调整freq
中的值来获得更丰富的信息,以便较低的值更广泛地分布在颜色范围内。
例如,您可以通过log
的{{1}}来更好地分配值。 (你可能不想丢掉最高值,因为它们对应的是具有最高功率的频率。)
freq
来自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中的常数项。