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

一、DPCM编码

1.原理

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

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在这里插入图片描述在这里插入图片描述在这里插入图片描述
4bit在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、压缩效果分析

1.压缩比

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

霍夫曼编码前霍夫曼编码后
原图96KB69KB
8bit96KB43KB
4bit96KB15KB

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

原图与8bit残差图像像素值概率分布图
在这里插入图片描述
原图与4bit残差图像像素值概率分布图
在这里插入图片描述

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

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值对比

8bit4bit
51.26424.242
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值