【数据压缩】DPCM编码实验

一.DPCM编码原理

在一个DPCM系统中,需要设计预测器和量化器两部分。

在本次实验中,我们采取左向预测和8bit均匀量化。

左向预测:

即将当前像素的左边像素作为预测,两像素值相减即为当前像素的预测误差值。

对于第一列像素,默认取其预测值均为128.

8bit均匀量化:

图像本身是8bit(灰度值为0-255),所以如果相减值就会变为-255——+255

为了进行8bit量化,要将预测误差值(即像素相减的差)/2+128,使其范围为0-255。(量化插值b=a/2)。之后需要进行反量化值c,将量化插值b乘2(c=b*2)。之后再将反量化值c与左侧像素预测值相加得到本像素预测值。

二.实验过程内容分析

1.本次实验需要三个文件

一个输入文件,一个预测误差图像文件,一个重建图像文件

    char* orifilename = NULL;
	char* prefilename = NULL;
	char* recfilename = NULL;

	orifilename = argv[1];
	prefilename = argv[2];
	recfilename = argv[3];

	FILE* fp1 = fopen(orifilename, "rb");
	FILE* fp2 = fopen(prefilename, "wb");
	FILE* fp3 = fopen(recfilename, "wb");

2.分配三个主要缓冲区

(1)oribuffer是原灰度图像的缓冲区

(2)prebuffer是预测误差图像的缓冲区

(3)recbuffer是重建图像的缓冲区

    for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if (j == 0)
			{
				*(recbuffer + i * width + j) = 128;
				*(prebuffer + i * width + j) = *(oribuffer + i * width + j) - 128;
			}
			else
			{
				p1 = *(oribuffer + i * width + j) - *(oribuffer + i * width + j - 1);//误差
				if (p1 % 2 == 0)
					p2 = p1 / 2 + 128;//8bit量化
				else
					p2 = (p1 - 1) / 2 + 128;//8bit量化
				*(prebuffer + i * width + j) = unsigned char(p2);
				p3 = unsigned char(p2 * 2);//反量化
				*(recbuffer + i * width + j) = *(oribuffer + i * width + j - 1) + p3;
			}
		}
	}

三.实验结果分析

原图像 预测误差图像 重建图像

输出码流:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值