9

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

我正在尝试通过该numpy.fft.fft2功能来做到这一点。

这是一个描述我的用例的最小示例的链接。

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

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

1 回答 1

13

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

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

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

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

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

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

例如,您可以通过采用 of 来获得更好的值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()

在此处输入图像描述


文档

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

因此,freq[0,0]是“零频率”术语。换句话说,它是离散傅里叶变换中的常数项。

于 2014-01-26T13:39:33.930 回答