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
- DPCM编码
- DPCM编码
- 实验四-dpcm编码
- 数据压缩 DPCM编码
- 实验四 DPCM编码
- 【实验五】DPCM编码
- 实验四 DPCM编码
- 实验4 DPCM编码
- 实验四:DPCM编码
- 进入编码(RLC,DPCM)
- DPCM差分预测编码
- 数据压缩实验四:DPCM编码
- 数据压缩实验4-DPCM编码
- 数据压缩实验四:DPCM编码
- DPCM
- DPCM
- DPCM
- 标准DPCM编码(Matlab实现)
- 数据链路层三个问题---封装成帧、透明传输、差错检查
- 267. Palindrome Permutation II
- oracle基本命令集合(3)--分组与统计
- 【Java EE 】--JavaServer Faces 01
- 位异或运算符^的特点及面试题
- DPCM编码
- Linux 系统(ubuntu和CentOS)nginx服务器和php安装
- 数据结构(4)之递归
- 机器学习-周志华-个人练习10.6
- Struts2简述
- Redis
- Web9 icon的实现
- 多址和复用
- h5,css学习笔记