1. 程式人生 > >《OpenCV3程式設計入門》——5.5.2 離散傅立葉變換相關函式詳解

《OpenCV3程式設計入門》——5.5.2 離散傅立葉變換相關函式詳解

目錄

1、dft()函式

2、返回DFT最優尺寸大小:getOptimalDFTSize()函式

3、擴充影象邊界:copyMakeBorder()函式

4、計算二維向量的幅值:magnitude()函式

6、矩陣歸一化:normalize()函式


1、dft()函式

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

函式格式:

void dift(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0)

引數說明:

第一個引數,InputArray src,輸入矩陣

,可以為實數或者虛數

第二個引數,OutputArray dst,函式呼叫後的結果儲存在這裡,其尺寸和型別取決於識別符號,即第三個引數flags

第三個引數,int flags,轉換的識別符號,有預設值0,取值可以為表6.1中識別符號的結合

第四個引數,int nonzeroRows,預設值0。當此引數設為非零時(最好是取值為想要處理的那一行的值,比如C.rows),函式會假設只有輸入矩陣的第一個非零行包含非零元素(沒有設定DFT_INVERSE識別符號),或只有輸出矩陣的第一個非零行包含非零元素(設定了DFT_INVERSE識別符號)。這樣函式就可以對其他進行高效的處理,以節省時間開銷。


2、返回DFT最優尺寸大小:getOptimalDFTSize()函式

getOptimalDFTSize()函式返回給定向量尺寸的傅立葉最優尺寸大小。因為當影象的尺寸是2、3、5的倍數時,計算速度最快。因此為了提高離散傅立葉變換的執行速度,需要擴充影象,具體擴充多少由此函式計算。

函式格式:

int getOptimalDFTSize(int vecsize)

引數說明:

int vecsize,向量尺寸,即圖片的rows、cols


3、擴充影象邊界:copyMakeBorder()函式

copyMakeBorder()函式能夠擴充影象邊界

函式格式:

void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, 
                    int right, int borderType, const Scalar& Value=Scalar())

引數說明:

第一個引數,InputArray src,輸入矩陣,即源影象,填Mat類的物件即可

第二個引數,OutputArray dst,函式呼叫後的結果儲存在這裡,需要和源影象有一樣的尺寸和型別,且size應該為Size(src.cols+left+right, src.rows+top+bottom)

接下來的4個引數分別為int top,int bottom,int left,int right,分別表示在源影象上各擴充多少個畫素,如top=2,bottom=2,left=2,right=2表示在源影象上的上下左右各擴充兩個畫素寬度的邊界。

第七個引數,borderType,邊界型別,常見取值為BORDER_CONSTANT

第八個引數,const Scalar& value,有預設值Scalar(),可以理解為預設值為0。當borderType取值為BORDER_CONSTANT這個引數表示邊界值。 


4、計算二維向量的幅值:magnitude()函式

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

函式格式:

void magnitude(InputArray x, InputArray y, OutputArray magnitude)

引數說明:

第一個引數,InputArray x,表示向量的浮點型X座標值,即實部

第二個引數,InputArray y,表示向量的浮點型Y座標值,即虛部

第三個引數,OutputArray magnitude,輸出幅度值,和第一個引數x有著一樣的尺寸和型別

magnitude()函式原理:

                                                                          dst(I)=\sqrt{x(I)^{2}+y(I)^{2}}


5、計算自然對數:log()函式

傅立葉變換的幅度範圍大道不適合在螢幕上顯示。高值在螢幕上顯示為白點,低值為黑點,高低值的變化無法有效分辨。為了在螢幕上凸顯出高低變化的連續性,可以用對數尺度類替換線性尺度,公式如下:

                                                                                  M_{1}=log(1+M)

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

函式格式:

void log(InputArray src, OutputArray dst)

引數說明:

第一個引數,InputArray src,輸入影象

第二個引數,OutputArray dst,輸出影象,得到的絕對值

log()函式原理如下:

                                                                \texttt{dst} (I) =  \fork{\log |\texttt{src}(I)|}{if $\texttt{src}(I) \ne 0$ }{\texttt{C}}{otherwise}

C是一個很大的負數


6、矩陣歸一化:normalize()函式

函式格式:

void normalize(InputArray src, OutputArraydst, double alpha=1, double beta=0, int norm_type=NORM_L2, 
               int dtype=-1,InputArray mask=noArray() )

引數說明:

第一個引數,InputArray src,輸入矩陣,即源影象,填Mat類的物件即可

第二個引數,OutputArray dst,函式呼叫後的結果儲存在這裡,需要和源影象有一樣的尺寸和型別

第三個引數,double alpha,規劃後的最大值,有預設值1

第四個引數,double beta,規劃後的最小值,有預設值0

第五個引數,int norm_type,歸一化型別,有NORM_INF, NORM_L1,  NORM_L2和NORM_MINMAX可選,預設值NORM_L2

第六個引數,int dtype,預設值-1。負值時,輸出矩陣與src同樣型別,否則它和src有同樣通道數,且影象深度為CV_MAT_DEPTH(dtype)

第七個引數,InputArray mask,可選的操作掩膜,預設值noArray()