如果想要認識圖像頻率,我們可以從一維Perlin雜訊的傅立葉轉換來著手,將灰階度作為訊號值,而其頻率就是指灰階度變化的頻繁程度。

NumPy的傅立葉轉換

我在前一篇專欄文章〈傅立葉轉換與影像處理(一)〉的最後談到,傅立葉轉換是函式f(t)到函式F(w)的轉換,t是時間,w是頻率。

若要從程式撰寫方面來認識傅立葉轉換,NumPy提供了實作,不過,嚴格來說,是快速傅立葉變換,考慮了電腦運算本身的離散性(時域或頻域並非無限,而且只能離散地取樣),並改進了計算複雜度。

NumPy的傅立葉轉換相關實作,是由numpy.fft模組提供。對於一維的訊號,我們可以使用模組中的fft函式。

例如,若有個signal(t,sample_rate)可以指定時間t內,以取樣率(每秒取幾個樣本值)sample_rate對某訊號進行取樣,signal函式以陣列傳回取樣結果(振幅值的清單)samples,那麼,np.fft.fft(samples)就是傅立葉轉換的結果。

雖然在程式實作面上,重視的是傅立葉轉換的應用,不過,我們仍要知道:傅立葉轉換後的函式,頻率w對應的值是複數,因此,fft函式運算結果會是一組複數,每個複數代表著某頻率下弦波的相位與振幅。

對於一個複數,若畫在複數平面時,複數的實部與虛部可構成一個向量,旋轉該向量,旋轉期間得到的垂直分量為y(也就是虛數部份),每次取樣的時間為x,所畫出來的就會是弦波,以旋轉期間得到的水平分量為y(也就是實數部份),畫出來的也會是弦波。簡單來說,傅立葉轉換後的複數,包含了弦波資訊。

傅立葉轉換後,我們試著以莖葉圖繪製頻域時,通常只在意有哪些頻率(圖中突出的莖葉),振幅部份基本上可取絕對值做標準化後的結果,作為莖葉圖的縱軸數值。

至於莖葉圖需要的橫軸,也就是頻率的部份,numpy.fft模組提供了fftfreq函式,我們可以指定取樣資料的尺寸與取樣率的倒數,計算出對應於頻率的陣列。

對此,在〈NumPy一維傅立葉轉換〉這個gist中,有傅立葉轉換後畫出莖葉圖的實作,可以參考。

傅立葉逆轉換與濾波

〈NumPy一維傅立葉轉換〉執行的繪圖結果中,會包含負頻率,然而,頻率怎麼會是負的?

想想看,如果我們要畫出sin(f*2π*t)的正弦波有另一種方式,使用一個圓,半徑為1,一開始有個點(1,0)在圓上,若f為正,點是以逆時針以角頻率轉動f*2π,這時記錄y分量可以畫出弦波;若f為負,就表示以順時針轉動而畫出來的弦波。

方才談到,傅立葉轉換後的複數,包含了弦波的資訊,如果我們將正頻率與負頻率相對應的複數,畫在複數平面上各自旋轉,虛數分量相加會為0,畫出來就是條水平線,而實數合成的部份,畫出來會是條弦波,關於這部分內容,可參考〈如何正確理解信號處理中的負頻率〉的動畫。

也就是得到的訊號會是由實數分量組成,而在時域對訊號取樣時,就是以實數來記錄,只不過在傅立葉轉換後的複數中,虛數確實也有其意義,若我們真的只想知道訊號是由哪些頻率組成,只要看正頻率的部份就可以了。

傅立葉存在逆轉換,也就是可以將F(w)轉換為f(t),將頻域資料轉換為時域資料,這可以得到相同的訊號。

若對傅立葉轉換後的頻域資料動些手腳,再逆轉換回時域,例如,若將頻率10與-10以外的部份設為0,就表示這些頻率的訊號振幅都是0了,也就是消去了訊號,從頻域轉回時域時,畫出的訊號就不會有頻率10,藉此就得到了濾波的功能。

〈簡單的濾波〉這個gist,是個簡單的濾波實作,執行後畫出來的圖案中,藍色是原訊號,橘色是濾波後的訊號,也就是將頻率10之外的訊號消除之後的訊號,我們可看出這是個單純的弦波。

Perlin雜訊與圖像頻率

而在傅立葉轉換,以及圖像的頻率之間,又有何關係?

在過去的專欄中,我曾經談過Perlin雜訊。就一維的Perlin雜訊來說,畫出來就像某種訊號,在〈NumPy與Perlin雜訊〉也談到了,如何以NumPy及Matplotlib來繪製一維Perlin雜訊。

既然如此,如果我們針對一維Perlin雜訊取樣,透過傅立葉轉換就可以分析,了解雜訊是由哪些頻率組成,在〈Perlin雜訊與傅立葉轉換〉這個gist,就繪製了雜訊在頻域的莖葉圖。

對於二維的Perlin雜訊,通常會將雜訊值作為灰階值,如果我們基於各座標像素點以灰階值來進行繪圖,看來會像是起伏的地形,或者像是海浪。

如果我們在圖上與x軸平行切出一條線,而線所通過的像素灰階值之變化,其實,就相當於一維Perlin雜訊。

而這個一維Perlin雜訊變化,如方才所述,又可以看成是數個頻率弦波疊加後的結果。

也就是說,就圖像來說,灰階度可以看成訊號值,取樣範圍內的灰階度變化,可以看成是數個週期性的灰階度變化組成,與這些週期相對的就是頻率,這時圖像的頻率,指的就是這些灰階度變化的頻繁程度。

先前專欄〈淺談圖片雜訊處理〉談過低頻、高頻雜訊是類似的道理,若鄰近像素間的灰階度變化小,就像是短時間內振幅變化週期長的低頻訊號;若鄰近像素間的灰階度變化大,就像是短時間內振幅的變化週期短的高頻訊號。

實際的圖像是二維的,不過,可以從產生x方向有灰階度變化,而y方向沒有灰階度變化的圖案,先觀察一下。例如〈Sin灰階變化〉這個gist,是用正弦波畫出來的圖像,其中的freq參數可指定頻率。

當freq的值小時,我們會看到和緩的灰階變化圖像;當freq大時,灰階度變化會很劇烈。也就是說,和緩的灰階變化,是由相對而言低頻的訊號所組成;劇烈的灰階變化,是由相對而言高頻的訊號所組成。

高頻訊號的圖像界線

在高頻的時候,其實,我們還可以觀察到,就肉眼而言,會覺得黑與白的界線較為明確。

只不過,圖像終究是二維的,然而,是否有二維的傅立葉轉換呢?確實是存在二維的傅立葉轉換與逆轉換!

而且,類似地,也可以針對轉換後的結果進行頻域上的處理,再進行二維的傅立葉逆轉換,而這就形成了圖像濾波的一種方式。若將低頻部份設為0,留下高頻部份,逆轉換後的圖像,就會留下視覺上界線分明的部份。

而這也是尋找圖像邊緣的方法之一,我將在下一篇專欄再來探討。

專欄作者

熱門新聞

Advertisement