opencv 19 離散傅利葉變換

2021-09-29 17:44:38 字數 3235 閱讀 6372

離散傅利葉變換(discrete founer transform,縮寫為dft),是指傅利葉變換在時域和頻域上都呈現離散的形式,將時域訊號的取樣變換為在離散時間傅利葉變換(dtft)頻域的取樣。在形式上,變換兩端(時域和頻域上)的序列是有限長的,而實際上這兩組序列都應當被認為是離散週期訊號的主值序列。即使對有限長的離散訊號做dft,也應當對其經過週期延拓成為週期訊號再進行變換。在實際應用中,通常採用快速傅利葉變換來高效計算dft。

簡單來說,對一張影象使用傅利葉變換就是將它分解成正弦和余弦兩部分,也就是將影象從空間域(spatia ldomain)轉換到頻域(frequency domain)。

這一轉換的理論基礎為:任一函式都可以表示成無數個正弦和余弦函式的和的形式。傅利葉變換就是乙個用來將函式分解的工具。

二維影象的傅利葉變換可以用以下數學公式表達。

f (k

,l)=

∑i=0

n−1∑

j=0n

−1f(

i,j)

s−i2

π(ki

n+lj

n)

f(k,l)=\sum_^\sum_^f(i,j)s^+\frac)}

f(k,l)

=∑i=

0n−1

​∑j=

0n−1

​f(i

,j)s

−i2π

(nki

​+nl

j​)eix

=cos

x+is

in

xe^=cosx+isinx

eix=co

sx+i

sinx

式中f是空間域(spatialdomain)值,f是頻域(frequencydomain)值。轉換之後的頻域值是複數,因此,顯示傅利葉變換之後的結果需要使用實數影象(real image)加虛數影象(complex image)或者幅度影象(magitude image)加相位影象(phaseimage)的形式。在實際的影象處理過程中,僅僅使用了幅度影象,因為幅度影象包含了原影象的幾乎所有我們需要的幾何資訊。然而,如果想通過修改幅度影象或者相位影象的方法來間接修改原空間影象,需要使用逆傅利葉變換得到修改後的空間影象,這樣就必須同時保留幅度影象和相位影象了。

在此示例中,我們將展示如何計算以及顯示傅利葉變換後的幅度影象。由於數字影象的離散性,畫素值的取值範圍也是有限的。比如在一張灰度影象中,畫素灰度值一般在0到255之間。因此,我們這裡討論的也僅僅是離散傅利葉變換(dft)。如果需要得到影象中的幾何結構資訊,那你就要用到它了。

在頻域裡面,對於一輻影象,高頻部分代表了影象的細節、紋理資訊;低頻部分代表了影象的輪廓資訊。如果對一幅精細的影象使用低通濾波器,那麼濾波後的結果就只剩下輪廓了。這與訊號處理的基本思想是相通的。如果影象受到的雜訊恰好位於某個特定的「頻率」範圍內,則可以通過濾波器來恢復原來的影象。傅利葉變換在影象處理中可以做到影象增強與影象去噪、影象分割之邊緣檢測、影象特徵提取、影象壓縮等。

dft函式的作用是對一維或二維浮點數陣列進行正向或反向離散傅利葉變換。

c++:

void

dft(inputarray src,outputarray dst,

int fiags=

0,intnonzerorows=

0)

講解完函式的引數含義,下面我們看乙個用dft函式計算兩個二維實矩陣卷積的示例核心片段。

void

convolvedft

(inputarray a, inputarray b, outputarray c)

getoptimaldftsize函式返回給定向量尺寸的傅利葉最優尺寸大小。為了提高離散傅利葉變換的執行速度,需要擴充影象,而具體擴充多少,就由這個函式來計算得到。

c++:

int

getoptimaldftsize

(int vecsize)

此函式的唯一乙個引數為int型的vecsize,向量尺寸,即的rows.cols。

copymakeborder函式的作用是擴充影象邊界。

c++:

void

copymakeborder

(inputarray src,outputarray dst,

int top,

int bottom,

int left,

int right,

int bordertype,

const scalar& value=

scalar()

);

magnitude()函式用於計算二維向量的幅值。

c++:

void

magnitude

(inputarray x,inputarray y,outputarray magnitude)

下式可以表示magnitude()函式的原理:

d st

(i)=

x(i)

2+y(

i)

2dst(i)=\sqrt+y(i)^}

dst(i)

=x(i

)2+y

(i)2

​log()函式的功能是計算每個陣列元素絕對值的自然對數。

c++:

void

log(inputarray src,outputarray dst)

第乙個引數為輸入影象,第二個引數為得到的對數值。其原理如下。

d st

(i)=

log|src(i)| &if src(i)\neq0 \\ c &oterwise \end\right.

dst(i)

={lo

g∣sr

c(i)

∣c​i

fsrc

(i)

​=0o

terw

ise​

c++:

void

normalize

(inputarray src,outputarray dst,

double alpha=1,

double beta=0,

int norm_type=norm_l2,

int dtype=-1

,inputarray mask=

noarray()

)

Opencv離散傅利葉變換

include include includeusing namespace std using namespace cv int main mat compleximage merge plannes,2,compleximage 進行離散傅利葉變換 dft compleximage,comple...

opencv之離散傅利葉變換

c intgetoptimaldftsize intvecsize int cv getoptimaldftsize int size0 returnoptimaldftsizetab b optimaldftsizetab定義在namespace cv中,裡邊的數值為2 x 3 y 5 z sta...

OpenCV入門 離散的傅利葉變換

傅利葉變換 是指將影象拆解成正弦與余弦元素,也就是將圖由空間性轉換為頻率性。int getoptimaldftsize int vecsize 由輸入的向量大小取得最佳的dft 離散的傅利葉變換 大小 vecsize 輸入的向量大小 copymakeborder inputarray src,out...