離散傅利葉變換與逆變換

2021-07-04 21:46:12 字數 4882 閱讀 2661

一、怎樣為一副影象增加乙個通道

mat a=(mat_(3,3)<<1,2,3,4,5,6,7,8,9);

mat b=mat::zeros(a.size(),a.type());

cout<<"the channels numbers of a: "

<.channels()<;

mat planels=;

mat out

; merge(planels,2,out);

cout<<"after changing the channels numbers: "

<.channels()<;

cout<<;

return 0

;結果:

the channels numbers of a: 1

after changing the channels numbers: 2

[1, 0, 2, 0, 3, 0

;4, 0, 5, 0, 6, 0

;7, 0, 8, 0, 9, 0]

請按任意鍵繼續. . .

從上面結果可以看出,我們為原影象增加了乙個通道

二、離散傅利葉變換

(1)將影象延擴到最佳尺寸. 離散傅利葉變換的執行速度與的尺寸息息相關。當影象的尺寸是2, 3,5的整數倍時,計算速度最快。 因此,為了達到快速計算的目的,經常通過添湊新的邊緣畫素的方法獲取最佳影象尺寸。函式 getoptimaldftsize() 返回最佳尺寸,而函式 copymakeborder() 填充邊緣畫素:

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

mat planes = ;

mat complexi;

merge(planes, 2, complexi); // 為延擴後的影象增添乙個初始化為0的通道

(3)進行離散傅利葉變換. 支援影象原地計算 (輸入輸出為同一影象):

dft(complexi, complexi);            // 變換結果很好的儲存在原始矩陣中
(4)將複數轉換為幅度.複數包含實數部分(re)和複數部分 (imaginary - im)。 離散傅利葉變換的結果是複數,對應的幅度可以表示為:

m = sqrt^2 + ^2}

轉化為opencv**:

split(complexi, planes); // planes[0] = re(dft(i), planes[1] = im(dft(i))

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

mat magi = planes[0];

(5)對數尺度(logarithmic scale)縮放. 傅利葉變換的幅度值範圍大到不適合在螢幕上顯示。高值在螢幕上顯示為白點,而低值為黑點,高低值的變化無法有效分辨。為了在螢幕上凸顯出高低變化的連續性,我們可以用對數尺度來替換線性尺度:

m= log

轉化為opencv**:

magi += scalar::all(1); // 轉換到對數尺度

log(magi, magi);

(6)剪下和重分布幅度圖象限. 還記得我們在第一步時延擴了影象嗎? 那現在是時候將新新增的畫素剔除了。為了方便顯示,我們也可以重新分布幅度圖象限位置(注:將第五步得到的幅度圖從中間劃開得到四張1/4子影象,將每張子影象看成幅度圖的乙個象限,重新分布即將四個角點重疊到中心)。 這樣的話原點(0,0)就位移到影象中心。

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

int cx = magi.cols/2;

int cy = magi.rows/2;

mat q0(magi, rect(0, 0, cx, cy)); // top-left - 為每乙個象限建立roi

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; // 交換象限 (top-left with bottom-right)

q0.copyto(tmp);

q3.copyto(q0);

tmp.copyto(q3);

q1.copyto(tmp); // 交換象限 (top-right with bottom-left)

q2.copyto(q1);

tmp.copyto(q2);

(7)歸一化. 這一步的目的仍然是為了顯示。 現在我們有了重分布後的幅度圖,但是幅度值仍然超過可顯示範圍[0,1] 。我們使用 normalize() 函式將幅度歸一化到可顯示範圍。

normalize(magi, magi, 0, 1, cv_minmax); // 將float型別的矩陣轉換到可顯示影象範圍(float [0, 1]).
(8)具體實現**

#include

#include

#include

#include

using

namespace

std;

using

namespace cv;

int main();//mat_的用法,為什麼paddimg一定要打括號?

mat compleximg;

merge(planels,2,compleximg);

//進行傅利葉變換

dft(compleximg,compleximg);

//把變換後的實數和複數部分分離開

split(compleximg,planels);

//求幅度

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

mat magi=planels[0];

//壓縮動態範圍,做對數變換

magi=magi+scalar::all(0);

log(magi,magi);

//去掉補充的行列

magi = magi(rect(0, 0, i.cols, i.rows ));//

//平移,使影象的中心變換到原點

int cy=magi.rows/2;

int cx=magi.cols/2;

//把原區域分為四塊

mat q0(magi,rect(0,0,cx,cy));//rect的用法,第三個引數到底是列

mat q1(magi,rect(cx,0,cx,cy));

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

mat q3(magi,rect(cx,cy,cx,cy));

//把左上角和右下角的區域交換

mat temp;

q0.copyto(temp);

q3.copyto(q0);

temp.copyto(q3);

//把左下角和右上角的區域進行互換

q1.copyto(temp);

q2.copyto(q1);

temp.copyto(q2);

//歸一化,方便顯示

normalize(magi,magi,1,0,cv_minmax);

namedwindow("original image",0);

namedwindow("spectrum magnitude image",0);

imshow("original image",i);

imshow("spectrum magnitude image",magi);

waitkey();

return

0;}

三、傅利葉逆變換

傅利葉逆變換實現韓式為idft,逆變換後輸出的為複數,我們可取其實部顯示即可

int main();

mat compleximg;

merge(planels,2,compleximg);

dft(compleximg,compleximg);

//傅利葉逆變換

mat iimg;

idft(compleximg,iimg);

//實際上,做完逆變換是複數形式,我們取其實部即可

split(iimg,planels);

mat magi=planels[0];

magi = magi(rect(0, 0, i.cols, i.rows ));

//歸一化,方便顯示

normalize(magi,magi,1,0,cv_minmax);

imshow("original",i);

namedwindow("spectrum magnitude image",0);

imshow("spectrum magnitude image",magi);

waitkey();

return

0;}

注:傅利葉變換來自:f:\opencv\opencv2.3.2官方文件(中文)\core 模組. 核心功能\離散傅利葉變換 — opencv 2.3.2 documentation.htm

離散傅利葉變換

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

離散傅利葉變換

作用 離散傅利葉變換主要是將連續的訊號轉換為離散的訊號。如在時域上連續的有時在頻域上是離散的。然而我們知道,任何的乙個函式都可以由無數個正弦函式和余弦函式相結合的形式來表示。即 如果將乙個影象進行離散傅利葉變換,就是將影象從空間域轉換到頻域上。其中f是空間域的值,f是頻域的值。轉換後的頻域值是複數。...

離散傅利葉變換

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