0

私はJavaと画像処理に非常に慣れていません。私は8 * 8ブロックのDCT(離散コサイン変換)を取り、次に量子化を行い、後で逆量子化とそれに続くIDCTによって元の画像を取得しようとしています。

しかし、最終的にデコードされた画像には、画像の一部の領域に緑、赤、青のポイントがランダムに表示されますが、元の画像コンテンツはすべて保持されます。Math.round 関数を使用しないと元の画像が正しく表示されるため、これは量子化プロセス中の丸めと関係があることを知っています。私は実際の理由を理解できませんでした.添付された画像の違いを見ることができます

コードスニペット:

//Following gives the DCT for 3 buffers with r ,g and b values
temp_DCT_r=FormDCT(temp_DCT_r);
temp_DCT_g=FormDCT(temp_DCT_g);
temp_DCT_b=FormDCT(temp_DCT_b);

//This does the quantization to DCT values for a given
//quantization level                
PerformQuantization(temp_DCT_r,Quantization_Level);
PerformQuantization(temp_DCT_g,Quantization_Level);
PerformQuantization(temp_DCT_b,Quantization_Level);

//Following the quantization function
public static void PerformQuantization(double[][] F,int Quantization_Level) 
{
int N = 8;  

for (int u=0;u<N;u++) 
 {
    for (int v=0;v<N;v++) 
    {                       
       F[u][v]= Math.round(F[u][v]/(Math.pow(2, Quantization_Level)));

    }                
  }
}

元の画像 復号化された画像

4

1 に答える 1

0

問題が発生しました。問題は、量子化中に数値を四捨五入することです。IDCTを取ったらエラーが出ました。R、G、B の値は 0 255 から変化しますが、DCT/IDCT は負の値を持ちます。結果の四捨五入が象限の変化に問題を引き起こす場合があります。つまり、0 の代わりに四捨五入すると -1 が返され、同様に -1 の代わりに四捨五入すると 0 になります。その条件を特定し、それを機能させるための特別な処理を行います

于 2015-10-18T06:59:26.483 に答える