我是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)));
}
}
}
答案 0 :(得分:0)
我遇到了问题。问题在于量化期间的数字四舍五入。当我拿IDCT时,出现了错误。 R,G和B值在0 255之间变化,而DCT / IDCT具有负值。有时候一轮结果会导致quandrant变换出现问题,而不是0舍入给-1,类似于-1舍入给出0.确定该条件并有特殊处理使其工作