文章目录
数据压缩实验(四)
一、DPCM编解码原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
二、DPCM编码系统设计
(1)实验要求
本实验的目标是验证DPCM编码的编码效率。在本次实验中,我们采用:
- 固定预测器和均匀量化器;
- 预测器采用左侧、上方预测均可;
- 量化器采用8比特均匀量化。
(2)设计思路
- 先读取一个256级的灰度图像;
- 根据自己设定的预测方法计算预测误差,并进行量化;
- 在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像;
- 将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比;
- 将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比;
- 比较两种系统(DPCM+熵编码 & 仅进行熵编码)的编码效率,如压缩比和压缩质量(PSNR)。
PS:压缩质量客观评价(PSNR)
通常用来评价一幅图像压缩后和原图像相比质量的好坏,压缩后图像一定会比原图像质量差的,PSNR越高,压缩后失真越小。这里主要定义了两个值,一个是均方差MSE,另一个是峰值信噪比PSNR(dB),这里的MAX通常是图像的灰度级,一般就是255。
PSNR值 | 评价 |
---|---|
高于40dB | 图像质量极好(即非常接近原始图像) |
30~40dB | 图像质量较好(即失真可以察觉但可以接受) |
20~30dB | 图像质量差 |
三、实验过程
1.主函数
int main()
{
// 1. 文件参数
const int width = 256;
const int height = 256;
int bitdepth = 8;//量化比特数
// 2. 缓冲区
unsigned char* ybuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height); // 原图
unsigned char* ubuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height * 0.25); //4:2:0
unsigned char* vbuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height * 0.25);
unsigned char* ebuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height); // 预测误差图像
unsigned char* rebuf = (unsigned char*)malloc(sizeof(unsigned char) * width * height); // 重建图像
double* freq_y = (double*)malloc(sizeof(double) * 256);// 原图概率分布
double