实验四 DPCM编码

本文详细介绍了DPCM(差分管预测编码调制)的工作原理,包括预测编码、量化和DPCM编码系统的组成。实验部分涉及不同量化比特数对图像质量及编码效率的影响,并通过与Huffman编码的对比,探讨了DPCM编码在不均匀信源上的优势。实验结果显示,量化比特数降低会提高压缩比但可能导致图像质量下降。
摘要由CSDN通过智能技术生成
一、实验原理

1、预测编码

预测编码利用的是信源相邻符号间的相关性。根据某一模型利用以往的样本值对新的样本值进行预测。然后将样本的实际值与预测值相减得到一个误差值,最后对这一误值进行编码。如果模型足够好且样本序列在时间上相关性比较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。

一个好的预测器的预测误差通常满足0周围高峰值的分布。

2、量化(标量量化和矢量量化)

量化是用一个很小的集合表示一个大集合的值,是有失真压缩的有效工具。一个量化器可以用量化区间、决策电平、重构电平、失真(DSE)来描述。 量化器的设计是码率与失真的折中。为了降低编码比特数,需要扩大量化区间的范围,造成更大误差。

均匀量化器中,由计算可得,量化比特数加1,信噪比增加6.02db.均匀量化器值对均匀分布信源是最佳的。

lloyd-max标量量化器中,门限电平应取在相邻量化输出电平的中点。重建电平应取在量化间隔的质心上。当量化器的输入为均匀分布时,llyod-max量化器为均匀量化器。

总结:

标量量化:对与已知概率模型和数字特征的随机过程,比较容易跟据概率分布安排量化器的决策边界,以得到最小量化失真的优化量化器。如果概率分布是均匀的,则采用均匀量化器。对于分布概率未知的随机过程,优化量化器的设计比较困难,可以采用lloyd-max算法,但该算法不易硬件实现,且计算时间随初始值选取的不同而不同。

矢量量化:量化时不是处理单个符号,而是一次处理一个符号。实验证明,压缩符号串比压缩单个效果更容易实现。

3、DPCM编解码原理

DPCM是插分预测编码调制的缩写,是典型的预测编码系统。其编码框图如下:

在DPCM系统中有两个因素需要设计,一个是量化器,一个是预测器。理想情况下预测其和量化器应进行联合优化,实际中采用一种次优的设计方法:分别进行线性预测器和量化器的设计。在本次试验中我们采用固定预测器和均匀量化器,预测器采用左侧、上侧均可(代码中采用左侧),量化器采用8bit量化。

应注意框图中预测器的输入为已经解码后的样本,之所以不用原始样本进行预测是因为在解码端无法得到原始样本,智能得到存在误差的样本,因此DPCM变么器内部嵌了一个解码器。

二、实验步骤

1、读取一个256级灰度图像,获得其y分量

本实验的输入图像格式为.bmp,通过实验二的代码将其转化为.yuv格式,获得y分量,用yuv播放软件vooya查看其y分量(在format中选取 luminance only格式)、预测误差图像,重建图像。

2、采用自己设定的预测方法计算预测误差

本实验采用前向预测,即用前一个像素值作为当前像素的预测值,其中预测值为编码之后又解码出来的重建电平。

3、对预测误差分别进行8bit、6bit、 4bit、2bit、1bit量化,并同时计算重建电平作为预测器的输入

4、输出原图像、预测误差图像、重建图像

5、将原图像和预测误差图像分别进行huffman编码,输出码流、给出符号概率分布图、计算压缩比

6、分析huffman和DPCM+huffman二者的编码效率

7、分析不同量化比特数对图像质量、编码效率的影响

三、实验目的

掌握DPCM编码系统基本原理,验证DPCM编码的编码效率。

四、代码分析

1、读取一副bmp图像的y分量代码见实验二,本实验仅对y分量进行操作。在试验二中加入如下代码:在命令行中添加输出ek.yuv(预测误差图像)、rebuild.yuv(重建图像)

		char* ekFileName = argv[3];//预测误差图像名
		char* rebuildFileName = argv[4];//重建图像名
		FILE* ekFile = NULL;//预测误差图像
		FILE* rebuildFile = NULL;//重建图像
		u_int8_t* ekBuf = NULL;//存储预测误差
		u_int8_t* rebuildBuf = NULL;//存储重建
		u_int nbit;//量化比特数
		u_int radio=0;//量化因子
		int ek=0;
		ekBuf = (u_int8_t*)malloc(frameWidth * frameHeight);
		rebuildBuf = (u_int8_t*)malloc(frameWidth * frameHeight);
		ekFile = fopen(ekFileName, "wb");
		nbit=atoi(argv[5]);//命令行输入量化比特数
		radio=512/(1<<nbit);//比例因子的表达式值得注意
		/*if (ekFile == NULL)
		{
			printf("cannot find ek file\n");
			exit(1);
		}
		else
		{
			printf("The output ek file is %s\n", ekFileName);
		}
		rebuildFile = fopen(rebuildFileName, "wb");
		if (rebuildFile == NULL)
		{
			printf("cannot find rebuild file\n");
			exit(1);
		}
		else
		{
			printf("The output rebuild file is %s\n", rebuildFileName);
		}*/用来分析不同量化bit的编码情况

//yBuf存储的数据范围为0-255,经过前向预测后,预测误差ek的范围为(-255-255),要想将预测误差显示为一副图像,需将ek范围调为0-255,实现方法为:令ek=ek+255,范围变为(0-510),再对误差值做8bit\4bit\2bit\1bit量化
//设置一个比例因子ratio=来完成量化 8bit量化时,ratio=2,510/2=255<2^8 4bit 量化时,ratio=32,510/32=15.94<2^4,2bit量化时,ratio=128,510\128=3.99<2^2 , 1bit量化时 ratio=256,510\256=2=2^1
//还需要考虑重建电平溢出的问题,经过量化的预测误差随量化比特的不同而范围不同,最大重建图像的范围为(0-512)(8-bit量化),需将其调到0-255
		printf("radio:%d\t",radio);
		for(i=0;i<frameHeight;i++)
			for(j=0;j<frameWidth;j++)
			{
				if(j==0)
				{
					ek=*(yBuf+i*frameWidth)-128;//计算预测误差
					*(ekBuf+i*frameWidth)=(ek+255)/radio;//量化预测误差
					
					*(rebuildBuf+i*frameWidth)=(*(ekBuf+i*frameWidth)-255/radio)*radio+128;//求重建电平
						if(*(rebuildBuf+i*frameWidth+j)>255)
						{
							*(rebuildBuf+i*frameWidth+j)=255;
						}//防止重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值