数据压缩实验四:DPCM编码

来源:互联网 发布:蓝牙共享网络 上不了网 编辑:程序博客网 时间:2024/06/05 14:50

一、基本原理

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。


二、实验流程

1. 读入BMP文件,转化为YUV文件并提取Y分量;

2. 对该灰度图像进行预测,预测器的输入为上一个样点的重建值,计算预测误差;

3. 对预测误差进行8bit均匀量化;

4. 对量化后的预测误差进行反量化,求重建值;

5. 将预测误差图像写入文件,并将该文件输入实验三的Huffman编码器,得到输出码字的必要信息;将原始灰度图像输入Huffman编码器,得到码字必要信息并比较两种系统(DPCM+熵编码和仅进行熵编码)之间的编码效率。

三、关键代码分析

在实验二BMP2YUV的基础上加一段代码 :

        qBuf = (unsigned char *)malloc(height*width);reBuf = (unsigned char *)malloc(height*width);int temp;for (int j = 0; j<height; j++)  {for (int i = 0; i<width; i++){if (i == 0)  {//每列第一个元素保持原来的样值不变,只是变换相应的数据类型temp= (*(yBuf + j*width + i) - 128) / 2 + 128;//计算量化误差*(qBuf + j*width + i) = (unsigned char)temp;temp = ((*(qBuf + j*width + i) - 128) *2) + 128; //计算重建值*(reBuf + j*width + i) = (unsigned char)temp;}else{    //当前差值信号为当前样值与上个预测样值的差值 并进行了量化temp= (*(yBuf + j*width + i) - *(reBuf + j*width + i - 1)) / 2+ 128;*(qBuf + j*width + i) = (unsigned char)temp;//当前重建信号为 反量化后的差值信号与上一个重建信号的和temp= ((*(qBuf + j*width + i) - 128) *2) + *(reBuf + j*width + i - 1);*(reBuf + j*width + i) = (unsigned char)temp;}}}fwrite(reBuf, 1, width * height, reFile);  //写入文件fwrite(qBuf, 1, width * height, qFile);

四、实验结果

以下依次为原始灰度图像、预测误差图像、重建图像:

原始图像概率分布                                                                   预测误差图像概率分布


















自己找的图:







从以上几幅图可以看出重建图像和原始图像在并没有太大的差别,量化误差的概率分布集中分布在中间部分

文件压缩比的对比:

从上表可以看出DPCM+熵编码的压缩比普遍比直接进行熵编码的压缩比要高,压缩效果要更好

五、实验中出现的问题

转化成的YUV灰度图像比BMP文件要大,经过检验发现了两个问题:
(1)在YUV文件输出时没有注释掉输出U分量和V分量的代码
(2)打开文件时类型写错了,应该是“wb”而不是“ab+”
原创粉丝点击