2024-04-20 09:23:16 发布
网友
我的目标是得到一幅图像的空间频率图,就像对它进行傅里叶变换一样。我不关心频率为f的特征在图像上的位置(例如);我只想有一个图形,告诉我有多少频率(频带的振幅可以用与该频率的对比度之和表示)。
我正试图通过^{}函数来实现这一点。
这里有一个指向描述我的用例的minimal example的链接。
结果发现,我只得到了frequencies[:30,:30]明显更大的值,其中绝对最高的值是frequencies[0,0]。我怎么解释?
frequencies[:30,:30]
frequencies[0,0]
frequency[0,0]
freq有几个非常大的值,还有很多小的值。你可以通过策划
freq
plt.hist(freq.ravel(), bins=100)
(见下文)因此,当你使用
ax1.imshow(freq, interpolation="none")
Matplotlib使用freq.min()作为颜色范围中的最低值(默认为蓝色),使用freq.max()作为颜色范围中的最高值(默认为红色)。由于freq中的几乎所有值都接近蓝色末端,因此整个绘图看起来是蓝色的。
freq.min()
freq.max()
您可以通过重新调整freq中的值,从而使低值在颜色范围内更广泛地分布,从而获得更详细的绘图。
例如,通过取freq的log,可以获得更好的值分布。(您可能不想丢弃最高的值,因为它们对应于具有最高功率的频率。)
log
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:
The output, analogously to fft, contains the term for zero frequency in the low-order corner of the transformed axes,
因此,freq[0,0]是“零频率”项。换句话说,它是discrete Fourier Transform中的常数项。
freq[0,0]
freq
有几个非常大的值,还有很多小的值。你可以通过策划(见下文)因此,当你使用
Matplotlib使用
freq.min()
作为颜色范围中的最低值(默认为蓝色),使用freq.max()
作为颜色范围中的最高值(默认为红色)。由于freq
中的几乎所有值都接近蓝色末端,因此整个绘图看起来是蓝色的。您可以通过重新调整
freq
中的值,从而使低值在颜色范围内更广泛地分布,从而获得更详细的绘图。例如,通过取
freq
的log
,可以获得更好的值分布。(您可能不想丢弃最高的值,因为它们对应于具有最高功率的频率。)来自the docs:
因此,
freq[0,0]
是“零频率”项。换句话说,它是discrete Fourier Transform中的常数项。相关问题 更多 >
编程相关推荐