实验目的:
掌握DPCM编解码系统的基本原理。初步掌握实验用C语言编程实现DPCM编码器并分析其压缩效率。
主要设备:
安装 Windows 和 Visual Studio 软件的个人计算机
实验内容:
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中, 需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
2. DPCM编码系统的设计
在本次实验中,我们采用固定预测器和均匀量化器。预测器采用左侧预测。
量化器采用8比特均匀量化。本实验的目标是验证DPCM编码的编码效率。首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差,并对预测误差进行8比特均匀量化。还可对预测误差进行1比特、2比特和4比特的量化设计。
为了让残差图可见性更强,对残差图进行了非均匀量化。
在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。
3. PSNR的实现:
PSNR:峰值信噪比,是一种全参考的图像质量评价指标。计算公式如下
其中,MSE表示当前图像X和参考图像Y的均方误差(MeanSquare Error),H、W分别为图像的高度和宽度;n为每像素的比特数,一般取8,即像素灰阶数为256. PSNR的单位是dB,数值越大表示失真越小。
实验步骤:
其中读取RGB数据,RGB2YUV,均调用了实验2的函数
输出重建图像,预测误差图像的UV值均使用128
DPCM具体实现
在每一行中,由于第一个像素的前面没有像素,因此假设它的预测值为平均灰度值 128 。
量化等级=512/2(量化比特数)次方
int Qlevel = 512 / (1 << (Qbit));
Switch(量化比特数)
Case 8:
For( j=0 ; j<高 ; j++)
{
For( j=0 ; j<宽 ; j++)
{
If(是第一列)
{
预测误差值=((原值-128)+256)/量化等级
重建值=(预测误差值*量化等级)-256+128
}
Else
{
预测误差值=((原值-上一个重建值)+256)/量化等级
重建值=(预测误差值*量化等级)-256+上一个重建值
}
}
}
外层循环为图像中每一行的循环,每行起始像素的预测值设为 128,单独对其进行预测并重建。首先得到差值 ek,像素灰度值范围从 0 到 255,那么两个像素灰度值之差的范围从 -255 到 255。由于要存储误差图像,那么先把负灰度值变成正的,也就是+ 255,在 0 到 510 这个区间内再做量化,区间长度可以看成 9 bit,512 级。
为了让残差图可见性更强,对残差图进行了非均匀量化。
switch (deviabuffer[j*Width + i])
{
case 0:deviabuffer2[j*Width + i] = 0; break;
case 6:deviabuffer2[j*Width + i] = 64; break;
case 7:deviabuffer2[j*Width + i] = 128; break;
case 8:deviabuffer2[j*Width + i] = 255; break;
default:deviabuffer2[j*Width + i] = 255;
}
psnr计算
实验结果:8bit量化
原图.bmp | 预测差值图.yuv | 重建图.yuv | 差值图的概率分布 |
| | | |
以下,略 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
原图像 | 原始图像大小(KB) | 直接熵编码大小(KB) | 直接熵编码压缩比 | 预测差值图像大小(KB) | DPCM+熵编码压缩比 | DPCM+熵编码重建图像PSNR(DB) |
Birds | 1120 | 1099 | 1.019 | 199 | 5.628 | 14.098 |
Noise256B | 66 | 60 | 1.100 | 46 | 1.435 | 14.3484 |
Lena256B | 193 | 184 | 1.049 | 46 | 4.196 | 12.8118 |
Camman256B | 66 | 59 | 1.119 | 41 | 1.609 | 12.3896 |
Clown256B | 66 | 64 | 1.031 | 48 | 1.333 | 12.1424 |
Fruit256B | 66 | 64 | 1.031 | 42 | 1.571 | 11.9524 |
Zone256B | 66 | 64 | 1.031 | 72 | 0.917 | 13.7038 |
Odie256B | 66 | 13 | 5.077 | 17 | 3.882 | 13.0754 |
预测误差图像都为明显的灰色,电平集中分布在128附近,量化过程中将量化误差抬升128电平所以表明实际预测误差值集中分布在 0 左右,证明对于正常图像,左右相邻像素之间存在很强的关联性,利用相关性对像素量化后进行压缩压缩比会很理想。
不同量化比特数的对比:
量化比特数 | 预测误差图像 | 重建图像 | 误差概率分布 |
8 | | | 看pdf去 |
4 |
| |
|
2 |
|
|
|
1 |
| |
|
程序代码见附件
完整文档图如下