使用 DPCM 编码进行图像压缩
基本原理
DPCM,即差分脉冲编码调制(Differential Pulse Code Modulation),通过对图像进行预测编码并缩减图片预测误差的动态范围来实现图像的压缩。本次试验中只对亮度信号 Y 通道进行编码压缩,将图片的第一列像素值作为原始参考值进行预测,通过与左侧的像素值取差计算预测误差,然后进行量化编码。以下为 DPCM 编码端与解码端的原理图

值得注意的是,在编码端中其实已经内嵌了一个解码端,为的是在编码端用以编码像素的重建值作为下一像素的预测值。
压缩结果
这是未进行 DPCM 编码的原始图像:

以下依次为 8bit - 1bit量化编码后的重建图像及其各自与原始图像的差值灰度图像:
结果分析
- 首先给出不同比特量化后预测误差值的概率分布图(上)与原始图像各亮度值的概率分布图(下)


可以看到量化后的预测误差值大多集中在 2bits2^{bits}2bits 附近,因为对量化预测误差有搬移的过程,因而说明预测误差多数集中在0附近
-
通过对原始图像及各预测误差图像进行 Huffman 编码后得到以下压缩比比较(计算方法为原始图像经过 Huffman 编码后的文件比特数除以经过 DPCM 及 Huffman 编码后的文件比特书)

-
通过计算 PSNR 来计算压缩质量
什么是PSNR:
PSNR,即峰值信号噪声比(Peak Signal to Noise Ratio),通过判断 PSNR 的值来衡量压缩质量,一般规则如下:
· PSNR≥40dB时,图像质量非常好,接近于原图像;
· 30dB≤PSNR<40dB时,图像有可察觉的失真,但质量仍可接受;
· 20dB≤PSNR<30dB时,图像质量较差;
· PSNR<20dB时,图像质量已经无法接受。
具体计算方法如下:
- 首先计算均方误差 MSE(Mean Square Error):
MSE=∑i=0M∑j=0N[f(I,j)−f′(I,j)]2MN MSE = \dfrac{\sum_{i=0}^M \sum_{j=0} ^N\left[f\left(I,j\right)-f'\left(I,j\right)\right]^{2}}{MN} MSE=MN∑i=0M∑j=0N[f(I,j)−f′(I,j)]2
其中 M、N 为图像的宽和高,f(i,j)、f’(i,j) 为原图像和重建图像在 (i,j) 的像素值。- 计算 PSNR:
PSNR=10lg(2bits−1)2MSE PSNR = 10lg\dfrac{\left(2^{bits}-1\right)^{2}}{MSE} PSNR=10lgMSE(2bits−1)2
计算得到各比特量化后的 PSRN 值如下图,参照 PSRN 评判标准后与主观感受基本一致

具体代码实现(C++)
quantify.hpp
#ifndef quatify_hpp
#define quatify_hpp
#include <stdio.h>
#endif /* quatify_hpp */
int quatify(unsigned char* previous, unsigned char*yBuffer,unsigned char* quantify,int width,int height,int qBit);
DPCMfile.hpp
#ifndef DPCMfile_hpp
#define DPCMfile_hpp
#include <stdio.h>
#endif /* DPCMfile_hpp */
int DPCMfile(int qBit, unsigned

本文介绍了使用DPCM(差分脉冲编码调制)进行图像压缩的基本原理和实现过程。通过与左侧像素值取差计算预测误差并量化编码,实现了图像的压缩。实验结果显示,8bit-1bit量化编码后的预测误差值集中在2bits附近,压缩质量可以通过PSNR(峰值信噪比)进行评估。代码实现包括量化编码、DPCM文件操作、统计分析和PSNR计算等功能。
最低0.47元/天 解锁文章
927

被折叠的 条评论
为什么被折叠?



