2014-01-26 300 views
5

我的目標是獲得與圖像的空間頻率的情節 - 有點像它做了傅立葉變換。我不關心頻率爲f的特徵圖像上的位置(例如)。我只想給出一張圖表,告訴我每個頻率有多少(頻帶的幅度可以用與該頻率的對比總和表示)。解釋numpy.fft.fft2輸出

我試圖通過numpy.fft.fft2功能來做到這一點。

這裏是一個minimal example鏈接描繪我的使用情況。

事實證明,我只能得到明顯較大的值爲frequencies[:30,:30],其中絕對最高值爲frequencies[0,0]。我怎樣才能解釋這一點?

  • 每個值的幅度究竟代表什麼?
  • 是什麼意思,我的最高值是frequency[0,0]什麼是0 Hz頻率?
  • 我可以斌值在某種程度上使我的頻譜取向不定?
+1

這個問題似乎是題外話,因爲它是關於理解什麼是傅立葉變換並(試行http://dsp.stackexchange.com)。 –

+0

我明白fft在原理上做了什麼,我只是沒有真正得到'numpy.fft.fft2'輸出,我會期望一個沒有「空」頻段的1D數組。 – TheChymera

回答

9

freq有幾個非常大的值和很多小值。你可以看到,通過繪製

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

(見下文)。所以,當你使用

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

Matplotlib使用freq.min()作爲顏色的最低值(默認情況下爲藍色),和freq.max()作爲顏色範圍中的最高值(默認爲紅色)。由於freq中的幾乎所有值接近藍色末端,所以整個情節看起來是藍色的。

您可以通過,這樣低的值的顏色範圍更加廣泛地分佈在freq重新調整價值得到更翔實的情節。

例如,您可以通過利用freqlog得到價值更好地分配。 (您可能不希望丟掉的最高價值,因爲它們對應於具有最高功率的頻率。)

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

enter image description here


the docs

的輸出,類似於FFT,包含在轉化的軸的低位拐角零頻率 術語,

因此,freq[0,0]是 「零頻率」 術語。換句話說,它是discrete Fourier Transform中的常數項。

+0

'freq.ravel()'將2d數組拆分成1d數組,從而每行連續讀取 - 對嗎?我怎麼沒有200的第二個高峯,400的三分之一(如日誌(頻率)情節會顯示)?另外,爲什麼hist(log(freq))在x軸上停在16? – TheChymera

+3

'plt.hist'正在製作一個值的直方圖。 「x軸」代表「log(freq)」的值,「y軸」代表這些值頻繁出現的次數。沒有重複的峯值,因爲相似的值被放在一起。 '16'的上限值意味着'log(freq)'中的最大值接近於16.事實上,'np.log(freq.max())'等於14.8。 – unutbu

+0

(是的,'freq.ravel()'是二維數組的一維視圖。) – unutbu