数据压缩实验报告4 DPCM编码

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编码捣鼓了半天没弄出来,目前只能先写到这里了)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值