目录
一、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.压缩比
我们将预测误差图像通过霍夫曼编码器压缩,与原图像直接压缩进行比较。
霍夫曼编码前 | 霍夫曼编码后 | |
---|---|---|
原图 | 96KB | 69KB |
8bit | 96KB | 43KB |
4bit | 96KB | 15KB |
由此可见,霍夫曼编码前的原图与残差图像的大小是相同的,但是经过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值对比
8bit | 4bit |
---|---|
51.264 | 24.242 |