線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5944
推到 Plurk!
推到 Facebook!

關於DCT與IDCT的問題

尚未結案
garyleon
一般會員


發表:1
回覆:1
積分:0
註冊:2007-04-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-07 09:53:58 IP:220.134.xxx.xxx 訂閱
我想實作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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-08 13:23:36 IP:220.134.xxx.xxx 訂閱
  完整的公式是參考 The JPEG Still Picture Compression Standard 裡面第三頁
我昨天測試了好幾個例子
發現正轉換都對, 可是反轉換回來的值都會落在112~143
而且還有一點規律, 可是想半天還是想不懂

以下是對照
原始值 0 1 2 3 ... 15 16 17 18 ... 47 48 49 ... 79 80 ... 111 112 113 ... 142 143 144 145 ... 175 176 ... 207 208 ... 239 240 241 ... 255
轉回後 128 129 130 131 ... 143 112 113 114 ... 143 112 113 ... 143 112 ... 143 112 113 ... 142 143 112 113 ... 143 112 ... 143 112 ... 143 112 113 ... 127

我是只有拿Gray-Level的圖作, 色階從0~255
發現DCT轉換後, 再inverse DCT 轉回來後
色階都只在112~143這32色的範圍

不過剛好在這段範圍會對
其他色階的值也都跑到112~143了
想不通
有高手知道為什麼會這樣嗎
系統時間:2024-05-03 6:09:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!