離散余弦變換 C 實現

2021-12-30 04:03:54 字數 2764 閱讀 2699

理論:

影象處理中常用的正交變換除了傅利葉變換外,還有其他一些有用的正交變換,其中離散余弦就是一種。離散余弦變換表示為dct( discrete cosine transformation),常用於影象處理和影象識別等。

(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)是變換係數陣列之元素。式中表示的陣列為nn

(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)

for(int i = 1; i < n; i++) }}

/* 功能:兩矩陣相乘

a和b:源輸入矩陣

result:輸出矩陣

*/void matrixmultiply(double **a, double **b, int n, double **result) }}

// dct變換

void dct(mat_ image, const int &n, double **imatrix)

} // 為係數分配空間

double **quotient = new double*[n];

double **quotientt = new double*[n];

double **tmp = new double*[n];

for(int i = 0; i < n; i++)

// 計算係數矩陣

coefficient(n, quotient, quotientt);

matrixmultiply(quotient, imatrix, n, tmp); // 由公式成績結果

matrixmultiply(tmp, quotientt, n, imatrix);

for(int i = 0; i < n; i++)

delete tmp;

delete quotient;

delete quotientt;

}

離散余弦變換

離散余弦變換 dct for discrete cosine transform 是與傅利葉變換相關的一種變換,它類似於 離散傅利葉變換 dft for discrete fourier transform 但是只使用實數。離散余弦變換相當於乙個長度大概是它兩倍的離散傅利葉變換,這個離散傅利葉變換是...

離散余弦變換

首先膜拜下wikipedia 我們已經知道dft將訊號變換為復指數訊號的線性組合,並且如果時域訊號是偶對稱的,那麼頻域將只有實部 復指數的余弦部分 所以,如果將有限長訊號延拓為偶對稱的,就可以將其變換為余弦訊號的線性組合。以下面的原始訊號作為例子 這個訊號的長度為4。若原始訊號長度為n,那麼延拓後的...

離散余弦變換 DCT

由上面的引用可見,位元速率壓縮基於變換編碼和熵值編碼兩種演算法。前者用於降低熵值,後者將資料變為可降低位元數的有效編碼方式。在mpeg標準中,變換編碼採用的是dct,變換過程本身雖然並不產生位元速率壓縮作用,但是變換後的頻率係數卻非常有利於位元速率壓縮。jpeg影象壓縮演算法 輸入影象被分成8 8或...