DPCM编码

来源:互联网 发布:linux如何修改文件权限 编辑:程序博客网 时间:2024/06/06 03:43

一.实验原理

1.DPCM编解码原理

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

2.均匀量化

除最外两个区间趋于无穷外,均匀量化的量化区间大小相同。包括中升型和中平型,如下图所示:

二.实验原理

1.首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差,并对预测误差进行8比特均匀量化。

2.DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。

3.将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。

4.将原始图像文件输入输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。

5.比较两种系统(DPCM+熵编码和仅进行熵编码)之间的编码效率(压缩比)。

三.主要代码分析

在BMP2YUV的工程主函数添加DPCM代码实现部分。(左侧均匀量化)

FILE* reFile = NULL; //重建图像文件FILE* qFile = NULL;  //预测误差图像文件u_int8_t* reBuf = NULL;u_int8_t* qBuf = NULL;
//DPCM编码reBuf = (u_int8_t*)malloc(Info_header.biWidth * Info_header.biHeight);qBuf = (u_int8_t*)malloc(Info_header.biWidth * Info_header.biHeight);for (int j = 0; j < Info_header.biHeight; j++){for (int k = 0; k < Info_header.biWidth; k++){if (k == 0) //每列第一个元素保持原来的样值不变{*(qBuf + j*Info_header.biWidth + k) = (*(yBuf + j*Info_header.biWidth + k) - 128) / 2 + 128; //预测误差量化*(reBuf + j*Info_header.biWidth + k) = (*(qBuf + j*Info_header.biWidth + k) - 128) * 2 + 128;//反量化}else{*(qBuf + j*Info_header.biWidth + k) = (*(yBuf + j*Info_header.biWidth + k) - *(reBuf + j*Info_header.biWidth + k-1)) / 2 + 128;//当前预测误差为当前样值与上个重构样值的差值(量化)*(reBuf + j*Info_header.biWidth + k) = (*(qBuf + j*Info_header.biWidth + k) - 128) * 2 + *(reBuf + j*Info_header.biWidth + k - 1);//当前重构样值为量化后的当前预测误差与上一个重构样值的和}}}
fwrite(reBuf, 1, Info_header.biWidth * Info_header.biHeight, reFile);fwrite(qBuf, 1, Info_header.biWidth * Info_header.biHeight, qFile);fwrite(yBuf, 1, Info_header.biWidth * Info_header.biHeight, yuvFile);

四.实验结果分析










































文件压缩比比较:

总结:

一般图像图像像素之间相关性较强,量化误差集中在 128 附近,预测后压缩率比较高,用预测误差编码比直接编码效果好。

随机噪声(Noise)图像,像素间相关性不强,预测误差图中像素分布无规律,用预测误差编码不如直接编码效果好。

zone图像,边缘变化很快,0-255交替出现,用预测误差编码不如直接编码效果好。



0 0
原创粉丝点击