關於DCT與IDCT的問題 |
尚未結案
|
garyleon
一般會員 發表:1 回覆:1 積分:0 註冊:2007-04-07 發送簡訊給我 |
我想實作2D-DCT(Discrete Cosine Transform)與2D-IDCT(inverse Discrete Cosine Transform)
直接照著定義去寫, 沒有使用任何快速演算法 我trace過幾個例子, 在DCT encode 時候都正確 ex:http://en.wikipedia.org/wiki/JPEG 可是IDCT decode後數值都偏差的很離譜 不知道哪裡搞錯了, 板上高手可以幫我看一下嗎 以下是我參考的DCT與IDCT公式 其中F(u,v)是轉換過的 f(i,j)是原本的data C(U)=1/sqrare(2) if U=0 otherwise C(U)=1 C(V)=1/sqrare(2) if V=0 otherwise C(V)=1 程式碼如下 // Perform the DCT on the A block (這個算出來正確) public double[,] calculateDCT(sbyte[,] A) { int k1, k2, i, j; double Cu, Cv; double[,] B = new double[8, 8]; for (k1 = 0; k1 < 8; k1 ) for (k2 = 0; k2 < 8; k2 ) { B[k1, k2] = 0.0; for (i = 0; i < 8; i ) for (j = 0; j < 8; j ) B[k1, k2] = A[i, j] * Math.Cos((i*2 1)*k1/16) * Math.Cos((j*2 1)*k2/16); if (k1 == 0) Cu = Math.Sqrt(2.0) / 2.0 ; else Cu = 1.0; if (k2 == 0) Cv = Math.Sqrt(2.0) / 2.0 ; else Cv = 1.0; B[k1, k2] *= (0.25 * Cu * Cv); } return B; // Return Frequency Component matrix } //====================================================== // Perform the inverse DCT on the A block(這個解出來錯誤) public double[,] calculateIDCT(sbyte[,] A) { int k1, k2, i, j; double Cu, Cv; double[,] B = new double[8, 8]; for (k1 = 0; k1 < 8; k1 ) { for (k2 = 0; k2 < 8; k2 ) { if (i == 0) Cu = Math.Sqrt(2.0) / 2.0; else Cu = 1.0; if (j == 0) Cv = Math.Sqrt(2.0) / 2.0; else Cv = 1.0; B[k1, k2] = 0.0; for (i = 0; i < 8; i ) for (j = 0; j < 8; j ) B[k1, k2] = (Cu * Cv * A[i, j] * Math.Cos(((2*k1 1)*i*Math.PI)/16) * Math.Cos(((2*K2 1)*j*Math.PI)/16) ); B[k1, k2] *= 0.25; } } return B; // Return Frequency Component matrix } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
garyleon
一般會員 發表:1 回覆:1 積分:0 註冊:2007-04-07 發送簡訊給我 |
完整的公式是參考 The JPEG Still Picture Compression Standard 裡面第三頁
我昨天測試了好幾個例子 發現正轉換都對, 可是反轉換回來的值都會落在112~143 而且還有一點規律, 可是想半天還是想不懂 以下是對照
我是只有拿Gray-Level的圖作, 色階從0~255 發現DCT轉換後, 再inverse DCT 轉回來後 色階都只在112~143這32色的範圍 不過剛好在這段範圍會對 其他色階的值也都跑到112~143了 想不通 有高手知道為什麼會這樣嗎 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |