一、基本原理
1.预测编码
预测编码利用信源相邻符号之间的相关性,根据某一模型利用以往的样本值对新样本进行预测,然后将样本的实际值与其预测值相减得到一个误差值,最后对这一误差值进行编码。
如果模型足够好,且样本序列在时间上相关性较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。
2.DPCM基本原理
DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
符号 | 含义 |
---|---|
xn | 当前输入的数字信号样值 |
pn | 当前像素值的预测值 |
dn | 预测误差, xn−pn |
d^n | 量化后的预测误差 |
x^n | 当前像素的重建值, d^n+pn |
在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
在本次实验中, 我们采用固定预测器和均匀量化器。 预测器采用左侧、 上方预测均可。量化器采用8比特均匀量化。
二、实验流程
三、代码分析
第一步在之前的实验里都做过,不再赘述
核心代码:
/*对y分量进行DPCM处理*/
int dn = 0;//预测误差值
unsigned char * dnBuf = (unsigned char *)malloc(frameWidth * frameHeight);//量化预测误差
unsigned char * reBuf = (unsigned char *)malloc(frameWidth * frameHeight);//重建图像
int scale = 512 / (1 << Qbits);//误差值的压缩比率
//逐行逐列处理
for (int i = 0; i < frameHeight; i++)
{
for (int j = 0; j < frameWidth; j++)
{
//预测误差值等于当前值减去预测误差值
if (j == 0) //第一列像素的预测值统一设为128
{
dn = yBuf[i * frameWidth] - 128;
}
else//非第一列像素,预测值为当前像素减去前一个像素的重建值
{
dn = yBuf[i * frameWidth + j] - reBuf[i * frameWidth + j - 1];
}
//对预测误差进行量化
dnBuf[i * frameWidth + j] = (dn + 255) / scale;
//当前像素的重建值等于量化后的预测误差加上预测值
if (j == 0){
reBuf[i * frameWidth] = dnBuf[i * frameWidth] * scale + 128;
}
else
{
reBuf[i * frameWidth + j] = dnBuf[i * frameWidth + j] * scale + reBuf[i * frameWidth + j - 1];
}
}
}
四、实验结果
1.压缩效果
原文件名称 | 原文件大小(kb) | 转YUV大小(kb) | Huffman后(kb) | 压缩比 | DPCM+Huffman后(kb) | 压缩比 |
---|---|---|---|---|---|---|
Birds | 1147 | 384 | 303 | 1.27 | 147 | 2.61 |
Camman | 66 | 64 | 49 | 1.31 | 32 | 2.00 |
Clown | 66 | 64 | 54 | 1.19 | 39 | 1.64 |
Fruit | 66 | 64 | 54 | 1.19 | 34 | 1.88 |
Lena | 193 | 64 | 53 | 1.21 | 37 | 1.73 |
Noise | 66 | 64 | 54 | 1.19 | 63 | 1.06 |
Odie | 66 | 64 | 13 | 4.92 | 9 | 7.11 |
Zone | 66 | 64 | 55 | 1.16 | 64 | 1.00 |
2.文件各阶段图像
原图像 | 重建图像和量化误差图像 | 概率分布 | 预测误差概率分布 |
---|---|---|---|
从上述表格可以看出,对于一般的图像,相邻像素相关性高,预测误差概率都集中分布在0附近,且DPCM+Huffman的组合压缩效率大于仅进行Huffman编码的效率;对于相邻像素相关性不高,如Noise和Zone这两幅图像,其预测误差概率分布较平均,进行DPCM处理的意义不是很大。