傅立葉轉換(Fourier Transform,FT)簡介
生活中我們常會採用時間序列的邏輯來蒐集資訊,因為這跟我們理解該資訊含意的邏輯類似,像是一首歌、一段影片。而傅立葉轉換讓我們有機會用頻率的角度來看待這些資訊,在特定的情況下,可以讓我們進行更符合期望地處理。
前言
在說明FT之前,先簡單說明變換(Transform)觀念。
假設有一組向量 [ A(3 , 1), B (1, 3)],那在圖像上我們可以表示成:
這邊把數字轉為圖像的過程就是一種「變換(Transform)」,這麼做有方便處理資訊的好處,假設我們要知道這兩個向量相加,與其畫圖取得座標:
還不如把 A、B 的 X 和 Y 各自相加之後就得到座標(4, 4)比較快。這就是 Transform 的概念。
而 1807 年的法國數學家、物理學家約瑟夫·傅立葉(Joseph Fourier)在想的就是一種「週期函數」與「一系列正餘弦函數的和」之間的轉換。
這麼做的意義在於將原來難以處理的「時間域」資訊,轉換成易於分析的「頻率域」資訊,那隨之而來的好處就是當我們容易理解之後,就更有能力對資訊進行加工,並創造出我們期望的成果。
這麼說可能有點抽象,我們舉一個生活中的例子,假設這是一段錄音的原訊號圖:
橫軸是時間(Time),縱軸是聲波的振幅(Amplitude),音訊場景是一對男女在吵雜的廣場進行對話。如果我們只想知道男生在說甚麼,又或是要去除背景噪音,基本上我們很難直接對這種依時間序列紀錄的原始資訊做處理,因為同一時間裡會夾雜著男聲、女聲和環境的聲音,接著我們對這些訊號做 Fourier Transform 之後的狀況如下:
橫軸是頻率(Frequency),縱軸是分貝(Decibel),這時我們就頻率的角度來看,就比較容易把我們要的聲音分離出來,又或者想降噪的話,就把非常高頻的部分給去除掉。重點是透過 Fourier Transform 我們有機會從頻率的角度看待資訊,在特定條件下,便能依照期望的結果來對這些資訊進行加工。
那接著我們來看 Fourier Transform 在影像處理上的數學公式與應用。
傅立葉轉換
這個轉換過程我們可以先用這張動圖來直觀地理解一下:
數學公式的說明我先以一維的 Fourier Transform 談起。假設我們有一個週期性函數g(θ),θ 介於 0 ~ 2π 之間,Fourier 的想法就是用有正交性(Orthogonality)的傅立葉基底(Fourier Basis)來表示g(θ)。
這些正交基底就是 cos θ, cos 2θ, cos 3θ, … 和 sin θ, sin 2θ, sin 3θ, …,θ 同樣介於 0 ~ 2π 之間。則g(θ)可寫成:
這也有動圖可視化了基底項數與原函數g(θ)的關係:
再來,令傅立葉轉換 F 作用在時間域輸入 X 上得到 Y,寫成數學式就是:
接著,令:
為 1 的基本根(Primitive Root),且滿足:
那從複數平面上的單位圓來看,N個複數根分別是:
那假設N=8,傅立葉矩陣則為:
接下來將這個概念推廣到二維的影像,假設我們有一張影像是N * N,那在座標 (x, y) 的灰階值為 f(x, y),則 FT 公式如下:
和 F(u, v) 稱作傅立葉配對(Fourier pair)的 IFT(Inverse FT)便是:
這兩個函式互為返函式,F(u, v)是將影像從空間域轉換到頻率域,f(x, y)則是將影像從頻率域轉換到空間域。我們平常看影像的習慣是從連續空間中一系列像素點座標的角度切入,傅立葉轉換讓我們能以頻率作為另一個維度,觀察像素點與灰階之間的對應關係。
實作應用
透過 python 的 Open-CV 可以很容易將影像的空間域轉換頻率域,再透過遮罩的手法就可以把高頻或低頻的部分像素給濾除,我以這張圖為範例:
透過下方的code可以做出這樣的效果:
這邊可以看出高通濾波適合用在邊緣檢測操作,而低通濾波則會使影像模糊,有興趣可以用下方的 code 試試看不同參數的 filter 會有什麼樣的效果。