一、实验原理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;
}//防止重