離散傅利葉變換

2021-08-20 12:14:10 字數 3522 閱讀 3278

作用

離散傅利葉變換主要是將連續的訊號轉換為離散的訊號。如在時域上連續的有時在頻域上是離散的。然而我們知道,任何的乙個函式都可以由無數個正弦函式和余弦函式相結合的形式來表示。即:

如果將乙個影象進行離散傅利葉變換,就是將影象從空間域轉換到頻域上。其中f是空間域的值,f是頻域的值。轉換後的頻域值是複數。所以,影象可由幅度影象加相位影象或者是實數影象加虛數影象表示。在實際處理影象的過程中,幅度影象就已經包含了原影象幾乎的所有資訊,所以一般我們只使用幅度影象。但是若想通過修改幅度影象或相位影象來間接修改原影象,要用逆傅利葉變換得到修改後的空間影象,這樣就必須同時保留幅度影象和相位影象。

例項

#include  

#include

#include

#include

#include

using

namespace

std;

using

namespace cv;

int main()

; mat complexi;

//合併通道

merge(planes, 2, complexi);

//dft(complexi, complexi);

//通道分離 存入planes中

split(complexi, planes);

//計算幅度

magnitude(planes[0], planes[1], planes[0]);

mat magi = planes[0];

magi += scalar::all(1);

log(magi, magi);

//將影象擴充的部分刪除

magi = magi(rect(0, 0, magi.cols & -2, magi.rows & -2));

//重新排列象限,使原(0,0)點位於影象中心點

int cx = magi.cols / 2;

int cy = magi.rows / 2;

mat q0(magi, rect(0, 0, cx, cy)); //top left

mat q1(magi, rect(cx, 0, cx, cy)); //top right

mat q2(magi, rect(0, cy, cx, cy)); //bottom left

mat q3(magi, rect(cx, cy, cx, cy)); //bottom right

//交換象限 左上角和右下角

mat tmp;

q0.copyto(tmp);

q3.copyto(q0);

tmp.copyto(q3);

//交換象限 右上角和左下角

q1.copyto(tmp);

q2.copyto(q1);

tmp.copyto(q2);

//矩陣歸一化 把資料經過處理後限制在一定範圍內

normalize(magi, magi, 0, 1, cv_minmax); //將矩陣資料值控制在0,1之間

imshow("input image ", i);

imshow("spectrum magnitude", magi);

waitkey();

return

0;}

函式解析1.int getoptimaldftsize(int vecsize)

將影象展開為最優尺寸,即需要擴充的數量。如2,3,5的倍數可以更高效的進行傅利葉變換,速度更快。

vecsize:向量尺寸,的rows,cols

2.

void copymakeborder(inputarray src, outputarray dst, int top, int bottom,int left, int right, int bordertype, const scalar& value=scalar() )
擴充影象到最佳尺寸,擴充的地方用0畫素新增。

src:輸入影象

dst:輸出影象

top bottom left right:在原影象的上下左右方向分別新增的畫素的寬度

bordertype:邊界型別

value:邊界值

3

void merge(const mat*mv, size_t count, outputarray dst)
合併通道。

因為傅利葉變換的結果是複數,這就是說對於每個原影象值,結果是兩個影象值。 此外,頻域值範圍遠遠超過空間值範圍, 因此至少要將頻域儲存在 float 格式中。 結果我們將輸入影象轉換成浮點型別,並多加乙個額外通道來儲存複數部分。所以將輸入影象轉換成浮點型,並多加了乙個初始化為0的通道用來儲存複數部分。

mv:被合併的影象指標,影象必須是相同的size和depth

count:被合併的影象的數目

dst:輸出影象,影象的size和depht合mv[0]相同,通道數為被合併影象通道數的總和

4.

void dft(inputarraysrc, outputarray dst, int flags=0, int nonzerorows=0)
進行傅利葉變換,支援影象原地計算,結果儲存在原始影象中

5.

void magnitude(inputarray x, inputarray y, outputarray magnitude)
計算幅度,將複數轉換為幅度

x:實部

y:虛部

magnitude:輸出影象,和x有同樣的size和type

6.

void

log(inputarraysrc, outputarray dst)

對陣列中的元素取對數。傅利葉變換的幅度範圍太大不適合在螢幕上顯示。高值顯示為白點,低值顯示為黑點,高低值得變化無法有效分辨。為了凸顯出高低變化的連續性,用對數尺度替換線性尺度

src:輸入影象

dst:輸出影象

7.

void

normalize(inputarray src, outputarraydst, double alpha=1, double beta=0, int norm_type=norm_l2, int dtype=-1,inputarray mask=noarray() )

矩陣歸一化。重新分布的幅度圖的幅度值超過可顯示範圍[0,1],normalize函式將幅度歸一化到可顯示的範圍。

src:輸入影象

dst:輸出影象

alpha:歸一化後的最大值

beta:歸一化後的最小值

norm_type:歸一化型別。有norm_inf, norm_l1, norm_l2和norm_minmax

離散傅利葉變換

傅利葉 原理表明 任何連續測量的時序或 訊號,都可以表示為不同頻率的正弦波 訊號的無限疊加。而根據該 原理創立的傅利葉變換演算法利用直接測量到的原始 訊號,以累加方式來計算該 訊號中不同正弦波 訊號的頻率 振幅和相位。岡薩雷斯版 影象處理 裡面的解釋非常形象 乙個恰當的比喻是將傅利葉變換比作乙個玻璃...

離散傅利葉變換

離散時間傅利葉級數 dfs 用ws進行週期延拓 連續復指數和離散復指數的區別和聯絡 當k 1時,乙個週期t後,即 n 0 127 取完後之後只旋轉了一圈。當k 2時,乙個週期t後,即 n 0 127 取完後之後只旋轉了兩圈。當k 3時,乙個週期t後,即 n 0 127 取完後之後只旋轉了三圈。dfs...

離散傅利葉變換DFT

dft是為適應計算機分析傅利葉變換規定的一種專門運算,本章是數字訊號處理課程的重點章節。3.7用dft進行頻譜分析 1.用dft對連續訊號進行譜分析 1 原理 2 頻率解析度與dft引數的選擇 頻率解析度是指所用的演算法能將訊號中兩個靠得很近的譜峰分開的能力。設是乙個帶限的連續時間訊號,最高頻率為f...