天天看點

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

時間為友,記錄點滴。

這是對應《數字圖像處理》第二章的最後一個例子,今天我們聊一聊傅裡葉變換在數字圖像處理領域中的應用。

作為一名工科生,即便早已經把什麼傅裡葉級數、DFT/FFT、變換/逆變換這些公式忘得一幹二淨了,但是提到傅裡葉變換,總是不那麼陌生。隻要記得傅裡葉變換是時域變頻域,而且有對應的逆變換可以把頻域變回時域,就這樣,好像還差一點點。

下來,我們稍微深挖一下。

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

任意一個波形,都可以轉換成N個頻率單一的正弦波的疊加

  • 目的是啥:

可以把時域内的信号變換到頻域中,更容易處理。

  • 怎麼轉換?

直接上公式,一般來說,大寫的函數表達式代表了轉換域。

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
  • 需要啥基礎?

額,說實話,如果僅僅拿來用的話,複數域和歐拉公式還是要了解一下的。

複數域:

我們上國小的時候,隻要知道有理數

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

就夠了,可後來才知道原來還有負數這東西,怎麼辦?引入整數域

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

吧。可有人又發現了

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

無法用整數的加減乘除得到,我們再打個更新檔,引入實數域

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

。那麼既然更新檔就是用來解決不可處理的無效問題的,那就把

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

也打打更新檔呗。于是複數域

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

就出現了。先了解

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

=i,并且我們有複數平面。

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

4*i=4i; 4i*i=-4

了解了複平面對實數軸的補充後,我們要了解複數的兩個概念

模和幅角

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

|z| 和 arg(z)

歐拉公式

歐拉大神可真是高産,都說歐拉公式是上帝公式。呵呵,那是你們理科生,我們計算機的工科生隻認識圖靈。

對于
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
,有
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
----維基百科

額,為什麼?看圖說話:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

複數域中的A點是

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

可以了解,但為啥是

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

呢?那是你沒看過e是怎麼來的。

(怎麼感覺扯遠了?)e是一個最美的自然常數,他是有固定值的約等于2.71828, 聽說就是當年雅各布·伯努利計算銀行複利的時候發現的

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

,即當銀行不斷縮短付利息的時間,我們獲得的複利是趨向于一個固定值2.71828,歐拉說,這個東西好啊,你就叫歐拉常數吧,我給你定義一個函數

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

于是(不能再講泰勒公式了)

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

代入

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

可得:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

完美!

好了,有這個基礎,我們終于可以看傅裡葉變換了。

(傅裡葉理論部分大部分素材取自馬同學高等數學, 高手!給他點個贊,希望他不會寫代碼)

傅裡葉級數

好早之前,老數學家拉格朗日們發現一些周期函數可以由三角函數的和來表示,傅裡葉站出來吹牛說:我認為

任意周期函數都可以寫成三角函數之和

。大神的可怕之處就是所有吹過的牛,慢慢都實作了。于是傅裡葉根據邏輯和公式找到了一堆級數序列限定周期為T的正弦和餘弦三角函數,用來描述周期為T的任意波形。

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

不同頻率三角波根據振幅an/bn疊加的過程

傅裡葉變換(連續函數)

有了傅裡葉級數就好辦多了,這一堆的sin和cos函數多礙眼,我們不是有高斯公式嗎?把他們都化到複數域上。

根據

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

, 把cos

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

和sin

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

代到傅裡葉級數中,得到:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

其中,

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

貼最終換算公式(表示工程人員千萬别癡迷于自己公式推導,了解至上)

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

從此時域有了到頻域的橋梁。

f(x) <=> F(X)

離散傅裡葉變換(DFT)

如果把連續的f(x)的傅裡葉變換找到了,那麼離散的還遠嗎?忘了我們之前怎麼把連續模拟信号變成離散信号了嗎?采樣呗。

如果定義FT為 (少個2π不影響表達):

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

那麼DFT的公式就應該是:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

公式總是簡潔,那是因為我們用傅裡葉級數的三角函數變換到了複數域,現在為了友善了解,我們再把DFT變回三角函數表達:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

這樣解釋裡面的内容

  • X(m):第m個DFT的輸出。如X(0), X(1), ..., X(m)
  • m:頻域DFT輸出序列的名額。 m= 0, 1, 2, ...., N-1
  • x(n):輸入樣點序列。如x(0), x(1), ..., x(n)
  • n:時域輸入樣點序列名額。n=0, 1, 2, ..., N-1
  • i: 複數虛軸
  • N:輸入序列和DFT輸出序列的個數

是以:

輸入N個采樣點,DFT後也得到了N個等間距頻點的輸出值。N是一個重要參數。

令采樣頻率為

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
, 那麼N個單點分析頻率的表達式為f(m)=
python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

介紹完了,收工。

啥?感覺怪怪的,這一堆冷冰冰的公式怎麼跟實際聯系起來呢?以DFT為例,我們想要把一個離散序列通過DFT後轉換成N個單一頻率的波形相加的形式,可以我們怎麼來确定這N個諧波呢?我的意思是,如果我們定義一個單頻波可以用正弦的形式表示:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

我們要知道振幅(

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

)、相位(

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

)、頻率(角速度

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

)才能完全确定這個諧波啊,這一堆公式,我要用代碼如何表達呢?我們依次找一找:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

取自《數字信号處理》一書

  • 振幅(
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
    ):
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
  • 相位(
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
    ):
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
  • 頻率(角速度
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)
    ):f(m)=
    python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

完美!

快速傅裡葉變換(FFT)

至于FFT其實就是DFT的一種簡化計算複雜度的快速傅裡葉變換,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。在軟體領域可以把複雜度降到又DFT的O(N*N)降到O(nlogn)(如果是二維圖像應該是O( M*N*log(M*N) ))。

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

大概就是這樣子

數字圖像中的頻譜

頻率:對于圖像來說就是指圖像顔色值的梯度,即灰階級的變化速度

幅度:可以簡單的了解為是頻率的權,即該頻率所占的比例

  1. 對于一個正弦信号,如果它的幅度變化很快,我們稱之為高頻信号,如果變化非常慢,我們稱之為低頻信号。遷移到圖像中,圖像哪裡的幅度變化非常大呢?邊界點或者噪聲。是以我們說邊界點和噪聲是圖像中的高頻分量(這裡的高頻是指變化非常快,不是出現的次數多),圖像的主要部分集中在低頻分量。
  2. 由于圖像變換的結果原點在邊緣部分,不容易顯示,是以将原點移動到中心部分。那麼結果便是中間一個亮點朝着周圍發散開來,越遠離中心位置的能量越低(越暗)。
  3. 傅裡葉轉換的結果是複數,這也顯示了傅裡葉變換是一幅實數圖像和虛數圖像疊加或者是幅度圖像和相位圖像疊加的結果。
  4. 原圖->DFT/FFT->中心化->頻域顯示(處理)->去中心化->IDFT/IFFT->原圖

Python:

  1. 通過numpy的FFT子產品,顯示了FFT之後的頻域的幅值和相位。
  2. 通過在頻域特這,可以很容易設計低通/高通濾波器。
#!/usr/bin/env python
           

運作結果:

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

原圖取自《數字圖像處理》書中的例子;後面為頻率和相位圖

python傅裡葉變換 信号處理 序列_(十六)數字圖像進行中的傅裡葉(DFT/FFT)

可以做一個高通/低通濾波器,做銳化和模糊(此處為降噪,因為幹擾源是個高頻信号)

繼續閱讀