DPCM编码的python实现及结合霍夫曼编码的压缩效率分析

目录

  • 一、DPCM编码
    • 1.原理
    • 2.算法实现
    • 3.编码结果
  • 二、压缩效果分析
    • 1.压缩比
    • 2.PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比
      • (1)PSNR定义
      • (2)PSNR代码实现
      • (3)PSNR值对比

一、DPCM编码

1.原理

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。
在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第1张图片

2.算法实现

void DPCM(unsigned char* yinBuf, unsigned char* yBuf, unsigned char* dpBuf, unsigned int frameWidth, unsigned int frameHeight)
{
	int tmp;
	int out;

	for (int i = 0; i < frameHeight * frameWidth; i++)
	{
		if (i % frameWidth == 0)
		{
			dpBuf[i] = yinBuf[i];
			yBuf[i] = dpBuf[i];
		}
		else
		{
			tmp = yinBuf[i] - yBuf[i - 1];

			/*(量化)*/


			
		}

	}
}

8bit量化

            dpBuf[i] = tmp / 2 + 128;
			out = yBuf[i - 1] + (dpBuf[i] - 128) * 2;
			if (out > 255)
				out = 255;
			if (out < 0)
				out = 0;
			yBuf[i] = out;

4bit量化

			dpBuf[i] = tmp / 32 + 16;
			out = yBuf[i - 1] + (dpBuf[i] - 16) * 32;
			if (out > 255)
				out = 255;
			if (out < 0)
				out = 0;
			yBuf[i] = out;

为了输出的残差图便于观察,这里将残差放大至[0, 255]。

3.编码结果

原图 重建图像 残差图像
8bit DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第2张图片 DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第3张图片 DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第4张图片
4bit DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第5张图片 DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第6张图片 DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第7张图片

二、压缩效果分析

1.压缩比

我们将预测误差图像通过霍夫曼编码器压缩,与原图像直接压缩进行比较。

霍夫曼编码前 霍夫曼编码后
原图 96KB 69KB
8bit 96KB 43KB
4bit 96KB 15KB

由此可见,霍夫曼编码前的原图与残差图像的大小是相同的,但是经过DPCM后的图像再通过霍夫曼编码压缩可以显著的减小文件尺寸。这又是为什么呢?

原图与8bit残差图像像素值概率分布图
DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第8张图片
原图与4bit残差图像像素值概率分布图
DPCM编码的python实现及结合霍夫曼编码的压缩效率分析_第9张图片

通过图像像素概率分布图我们可以明显看出残差图的像素值集中分布在一个小像素值区间中,这对霍夫曼编码压缩是极为有利的。

2.PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比

(1)PSNR定义

PSNR是一种评价图像的客观标准。

给定两个大小为m×n的单色图像I和K,均方误差定义为:
在这里插入图片描述MAXI是表示图像点颜色的最大数值,则PSNR为:

在这里插入图片描述
一般来说:

PSNR高于40dB说明图像质量极好(即非常接近原始图像),

在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),

在20—30dB说明图像质量差;

最后,PSNR低于20dB图像不可接受

(2)PSNR代码实现

def psnr(img1, img2):
    img1 = np.float64(img1)
    img2 = np.float64(img2)
    mse = np.mean( (img1/255.0 - img2/255.0) ** 2 )
    if mse == 0:
        return 100
    PIXEL_MAX = 1
    return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))

(3)PSNR值对比

8bit 4bit
51.264 24.242

你可能感兴趣的:(数据压缩)