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

Matplotlib はfreq.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 に答える