離散餘弦變換(C++實現)

來源:互聯網
上載者:User

標籤:dct變換   c++代碼   

理論部分轉載自這篇blog: http://blog.csdn.net/luoweifu/article/details/8214959  該blog給出的是java代碼,我用c++將其實現了。

理論:

影像處理中常用的正交變換除了傅裡葉變換外,還有其他一些有用的正交變換,其中離散餘弦就是一種。離散餘弦變換表示為DCT( Discrete Cosine Transformation),常用於影像處理和Image Recognition等。

一維離散餘弦變換正變換

                                   (1)

                            (2)

式中F(u)是第u個餘弦變換係數,u是廣義頻率變數,u=1,2,3......N-1; f(x)是時域N點序列, x=0,1,2......N-1

反變換

  (3)

顯然,式(1)式(2)和式(3)構成了一維離散餘弦變換對。

二維離散餘弦變換

正變換

  (4)

式(4)是正變換公式。其中f(x,y)是空間域二維向量之元素, x,y=0,1,2,......N-1;F(u,v)是變換係數陣列之元素。式中表示的陣列為N×N

反變換

 (5)

式中的符號意義同正變換式一樣。式(4)和式(5)是離散餘弦變換的解析式定義。

矩陣標記法

更為簡潔的定義方法是採用矩陣式定義。根據以上公式定義可知,離散餘弦變換的係數矩陣可以寫成如下:



如果令N=4,那麼由一維解析式定義可得如下展開式。


寫成矩陣式


若定義F(u)為變換矩陣,A為變換係數矩陣,f(x)為時域資料矩陣,則一維離散餘弦變換的矩陣定義式可寫成如下形式

[F(u)]=[A][f(x)]                       (6)

同理,可得到反變換展開式


寫成矩陣式即

[f(x)]=[A]T[F(u)]                      (7)

二維離散餘弦變換也可以寫成矩陣式:

[F(u,v)]=[A][f(x,y)][A]T            (8)

[f(x,y)]=[A]T[F(u,v)][A]                     

式中[f(x,y)]是空間資料陣列,A是變換係數陣列,[F(u,v)]是變換矩陣,[A]T是[A]的轉置。

對二維映像進行離散餘弦變換

由以上對二維離散餘弦變換的定義及公式(7)可知,求二維映像的離散餘弦變換要進行以下步驟:

1.獲得映像的二維資料矩陣f(x,y);

2.求離散餘弦變換的係數矩陣[A];

3.求係數矩陣對應的轉置矩陣[A]T;

4.根據公式(7)[F(u,v)]=[A][f(x,y)][A]T 計算離散餘弦變換;

以下是我的c++代碼實現<當然其中針對的是映像,故用到了opencv的庫函數>:

C++代碼:

/*功能:擷取DCT係數n:矩陣大小quotient: 係數quotientT: 係數轉置*/void coefficient(const int &n, double **quotient, double **quotientT){double sqr = 1.0/sqrt(n+0.0);for(int i = 0; i < n; i++){quotient[0][i] = sqr;quotientT[i][0] =  sqr;}for(int i = 1; i < n; i++){for(int j = 0; j < n; j++){quotient[i][j] = sqrt(2.0/n)*cos(i*(j+0.5)*PI/n);  // 由公式得到quotientT[j][i] = quotient[i][j];}}}/*功能:兩矩陣相乘A和B:源輸入矩陣result:輸出矩陣*/void matrixMultiply(double **A, double **B, int n, double **result){  double t = 0;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){t = 0;for(int k = 0; k < n; k++)t += A[i][k]*B[k][j];   result[i][j] = t;}}}//  DCT變換void DCT(Mat_<uchar> image, const int &n, double **iMatrix){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){iMatrix[i][j] = (double)image(i,j);}}// 為係數分配空間double **quotient = new double*[n];double **quotientT = new double*[n];double **tmp = new double*[n];for(int i = 0; i < n; i++){quotient[i] = new double[n];quotientT[i] = new double[n]; tmp[i] = new double[n];}// 計算係數矩陣coefficient(n, quotient, quotientT);matrixMultiply(quotient, iMatrix, n, tmp);  // 由公式成績結果matrixMultiply(tmp, quotientT, n, iMatrix);for(int i = 0; i < n; i++){delete []tmp[i];delete []quotient[i];delete []quotientT[i];}delete []tmp;delete []quotient;delete []quotientT;}




離散餘弦變換(C++實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.