1. 程式人生 > 程式設計 >opencv3/C++ 離散餘弦變換DCT方式

opencv3/C++ 離散餘弦變換DCT方式

離散餘弦變換/Discrete cosine transform,

根據離散傅立葉變換的性質,實偶函式的傅立葉變換隻含實的餘弦項,而數字影象都是實數矩陣,因此構造了一種實數域的變換——離散餘弦變換(DCT)。

離散餘弦變換具有很強的”能量集中”特性,左上方稱為低頻資料,右下方稱為高頻資料。而大多數的自然訊號(包括聲音和影象)的能量都集中在離散餘弦變換後的低頻部分。因此也可以在影象壓縮演算法中用來進行有失真壓縮。(如JPEG壓縮編碼)

OpenCV中dct()

在OpenCV中有專門進行離散餘弦變換的函式dct()。

dct()函式執行1D或2D浮點陣列的正向或反向離散餘弦變換(DCT):

N個元素的一維向量的正餘弦變換:

該函式通過檢視輸入陣列的標誌和大小來選擇操作模式:

如果(flags&DCT_INVERSE)== 0,則函式執行向前的1D或2D變換。否則是一個逆1D或2D變換。

如果(flags&DCT_ROWS)!= 0,則函式執行每行的一維變換。

如果陣列是單列或單行,則該函式執行一維變換。

如果以上都不是,則該函式執行2D變換。

目前dct支援偶數大小的陣列(2,4,6 …)。對於資料分析和逼近,可以在必要時填充陣列。另外,函式效能對陣列大小的依賴性非常大,而不是單調的。在當前實現中,大小為N的向量的DCT通過大小為N / 2的向量的DFT來計算。因此,最佳DCT大小N1 > = N可以計算為:

size_t getOptimalDCTSize(size_t N){return 2 * getOptimalDFTSize((N + 1)/ 2); }
N1 = getOptimalDCTSize(N);

dct()引數

src 輸入浮點陣列。

dst 輸出與src大小和型別相同的陣列。

flags 轉換標誌

opencv示例

#include <opencv2\opencv.hpp> 
#include <opencv2\core\core.hpp>
#include <opencv2\core\mat.hpp>
#include <iostream> 
using namespace std; 
using namespace cv; 
int main()
{
 Mat src = imread("E:\\image\\sophie.jpg",0); 
 if(src.empty())
 {
  cout << "the image is not exist" << endl; 
  return -1;
 }
 resize(src,src,Size(512,512));
 src.convertTo(src,CV_32F,1.0/255);
 Mat srcDCT; 
 dct(src,srcDCT);

 imshow("src",src);
 imshow("dct",srcDCT);
 waitKey();
 return 0;
}

可以看到因為第一幅影象的細節較少,因此DFT變換資料主要集中在左上方(低頻區域),高頻區域大部分為0:

而第二幅影象相對而言具有較為豐富的細節,因此相對於第一幅影象中間區域出現了大量的非0值:

以上這篇opencv3/C++ 離散餘弦變換DCT方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。