1.DPCM编码原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
2.部分关键代码
(1)量化
unsigned char quantization(int bits, int x)
{
int k = 0;
switch (bits)
{
case 1:
k = (int)((x + 255) / 255.5);
break;
case 2:
k = (int)((x + 255) / 127.75);
break;
case 4:
k = (int)((x + 255) / 31.9375);
break;
case 8:
k = (int)((x + 255) / 2.0);
break;
default:
cout << "error" << endl;
exit(0);
break;
}
return (unsigned char)temp;
(2)反量化
int inverse_quantization(int bits, unsigned char x)
{
int k = (int)x;
switch (bits)
{
case 1:
k = (int)((k * 255.5 + 127.75) - 255 + 0.5);
break;
case 2:
k = (int)((k * 127.5 + 63.75) - 255 + 0.5);
break;
case 4:
k = (int)((k * 31.9375 + 15.96875) - 255 + 0.5);
break;
case 8:
k = (k * 2) - 255;
break;
default:
cout << "error" << endl;
exit(0);
break;
}
return k;
}
(3)DPCM编码
for (int j = 0; j < h; j++)
{
for (int i = 1; i < w; i++)
{
ybuff_pre_d[j * w + i] = ybuff[j * Width + i] - ybuff_rebuild[j * w + i - 1];
ybuff_pre[j * w + i] = quantization(bits, ybuff_pre_d[j * w + i]);
int k;
k = ybuff_rebuild[j * w + i - 1] + inverse_quantization(bits, ybuff_pre[j * w + i]);
if (k > 255)
k = 255;
else if (k < 0)
k = 0;
ybuff_rebuild[j * w + i] = (unsigned char)k;
}
}
(4)计算PSNR
double psnr(int bits, int w, int h, int* x)
{
double psnr = 0;
double mse = 0;
for (int i = 0; i < w * h; i++)
mse += pow(*(x + i), 2);
mse = mse / (w * h);
psnr = 10 * log10(pow((pow(2, bits) - 1), 2) / mse);
return psnr;
}
3.实验结果图(左边为原始图像,中间为预测误差图像,右边为重建后的图像)
(后续的Huffman编码捣鼓了半天没弄出来,目前只能先写到这里了)