私は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)));
}
}
}