【数据压缩】DPCM编解码

来源:互联网 发布:阿里云io优化 编辑:程序博客网 时间:2024/06/03 06:38

一、DPCM编解码原理

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。

需要注意的是,预测器的输入是已经解码以后的样本(即重构样本)。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器。

当采用左侧预测时,在第一个样本输入时,我们假定误差值第一列都为128(已量化),重构图像值为原始样本值。当第二个样本输入,此原始样本减去上一个重构样本,得到未经量化的误差值,经过量化后得到第二个的量化误差(第一个是128嘛,我们以行为单位看)。而此时我们将量化误差反量化得到误差,加上前一个重构样本得到此时的重构样本。这就得到了量化误差图像和重构图像(仅有y,我们也可以自己写入uv)。

二、主要代码分析

1、我们选择在yuv2rgb文件里面加入编码器,为了直接用新鲜出炉的y数据流

unsigned char *rexn,*en;//开的空间 rexn为重建值 en为量化误差值unsigned char *rexnn,*enn;//指针int p1,p2;//中间变量
float p3;//中间变量

2、给他们开辟空间

rexn=(unsigned char *)rex;//空间大小在main函数中定义en=(unsigned char *)e;

3、编码过程

rexnn = rexn;enn = en;        y=y_buffer;for(i=0;i<y_dim;i++){for(j=0;j<x_dim;j++){if(j==0)//第一列特殊{*(enn+i*x_dim)=128;//量化误差给128*(rexnn+i*x_dim)=*(y+i*x_dim);//重建值给原值}else{p1=0;p1=*(y+j+i*x_dim)-*(rexnn+j-1+i*x_dim);//误差值//p2=quantizier(p1,enn+i*x_dim+j,8);//8bit量化p3=p1/2+128;//8bit量化*(enn+i*x_dim+j)=(unsigned char)p3;p2=(p3-128)*2;//反量化if((p2+*(rexnn+i*x_dim+j-1))>=0 && ((p2+*(rexnn+i*x_dim+j-1)) <=255))//防止溢出写的限制条件{*(rexnn+j+i*x_dim)=((p2+*(rexnn+i*x_dim+j-1)));//重建值}else {if((p2+*(rexnn+i*x_dim+j-1))<0)*(rexnn+j+i*x_dim)=0;else*(rexnn+j+i*x_dim)=255;}}}}


三、实验数据分析

我们有几幅老师给的图像,也有自己的8位bmp图,然后输出量化误差图像和重构图像,分析图像质量。然后将量化误差图像和原始图像分别输入上次试验的Huffman编码器,对比两种系统(DPCM+熵编码和仅进行熵编码)之间的编码效率。还做了一下关于几比特量化对重构图像造成的影响的实验

1、实验用图的原始图像、重构图像和量化误差图像。test.yuv是原图,test-1.yuv是重构图,test-2.yuv是预测误差图。

2、对比两种系统,得到的压缩比和概率分布图。可看出量化误差编码集中在128附近,结合了DPCM编码的Huffman编码出来的效果很好,文件压缩好。

Birds.bmp/Ben.yuv

Camman256B.bmp/Cammanen.yuv

Clown256B.bmp/Clownen.yuv

Lena256B.bmp/Lena256B.yuv

Fruit256B.bmp/Fen.yuv

D4.bmp/D2en.yuv

e4.bmp/een.yuv

3、几比特量化带来的影响。

2bit量化,存在严重失真,重构图像不好。

4bit量化,仍存在失真。

8bit量化,重构图像好看,且量化误差图像均值效果好。

四、实验感想

DPCM是比较典型的预测编码系统,理清楚编码过程之后代码实现较轻松。当然还需要注意数据溢出的情况,数据类型在其中也不容忽视,要意识到最初的误差是有符号的(可能是负数),所以不能盲目选择数据类型。量化器也不能随意选择,要注意尽量使量化误差接近128。

0 0
原创粉丝点击