利用DPCM&Huffman编码实现数据压缩_C语言实现

一、实验原理

       DPCM是差分预测编码调制的缩写,它利用过去的抽样值来预测当前的抽样值,对它们的差值进行编码。差值编码可以提高编码频率,这种技术已应用于模拟信号的数字通信之中。图像内的像素值之间并非相互独立,某一像素与周围像素之间存在一定的关系,这一关系导致整幅图像的信息熵不是很大。DPCM利用当前像素值减去前一像素值,得到差值,以减少图像之间的冗余,原理图如下。

利用DPCM&Huffman编码实现数据压缩_C语言实现_第1张图片

      在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。

二、实验流程

      在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。

      在本次实验中,我们采用固定预测器和均匀量化器。预测器采用左侧、上方预测均可; 量化器采用 8 比特均匀量化。

      首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差,并对预测误差进行8比特均匀量化。还可对预测误差进行1比特、2比特和4比特的量化设计。

      在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。将原始图像文件输入输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。最后比较两种系统(DPCM+熵编码和仅进行熵编码)之间的编码效率(压缩比和图像质量)。

三、实验代码

     首先,根据之前的方法,将一幅bmp文件转化为yuv文件。将yuv分量作为本次实验的样本,进行DPCM后进行Huffman编码。

     由于第一个像素没有预测,所以假设为128,第一个像素预测为128,算出误差。

void DPCM(int Xdim, int Ydim, void *Yin, void *d_buff, void *re_buff, int q_bits)
{
	long i, j;
	unsigned char *y, *diff, *re;

	y = (unsigned char *)Yin;
	diff = (unsigned char *)d_buff;
	re = (unsigned char *)re_buff;
	int wc;//原始误差  
	int a = pow(2.0, q_bits);//量化级数
	int lhjg = 512 / a; //量化间隔:(-255,255)/(2^q_bits)
	int temp;

	for (i = 0; i < Ydim; i++)
	{    //对每一列第一个像素值进行预测量化
		wc = y[Xdim*i] - 128;//假设第一行预测值为128  
		diff[Xdim*i] = (wc + 255) / lhjg;//量化值  
		temp = (diff[Xdim*i] - 255 / lhjg)*lhjg + 128;//重建电平  
		//=(diffy[Xdim] -64)*2+ 128;这种写法错误  
		if (temp>235) temp = 235;//保护电平(16,235)
		if (temp < 16) temp = 16;
		re[Xdim*i] = temp;
		for (j = 1; j < Xdim; j++)
		{    //对该行剩下像素量化预测  
			wc = y[Xdim*i + j] - re[Xdim*i + j - 1];//当前值-上一像素重建值  
			diff[Xdim*i + j] = (wc + 255) / lhjg;//量化值  
			temp = (diff[j + Xdim*i] - 255 / lhjg)*lhjg + re[j - 1 + Xdim*i];//重建电平  
			//(diffy[Xdim+j] +127)*lhjg+rey[Xdim+j-1];错误  
			if (temp>235) temp = 235;//保护电平(16,235)
			if (temp < 16) temp = 16;
			re[Xdim*i + j] = temp;
		}
	}
}

四、实验结果

      差分编码是针对图像空间信息冗余的编码方法,Huffman编码是针对统计信息冗余的编码方法。若二者相结合,先减少空间冗余,再减少统计冗余,将起到很好的压缩效果。

      下面是实验结果图,自左向右分别是:原图、预测误差图像、重现图像。

利用DPCM&Huffman编码实现数据压缩_C语言实现_第2张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第3张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第4张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第5张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第6张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第7张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第8张图片


原始图像的概率分布图与预测误差图像的概率分布图

1.任意文件一

利用DPCM&Huffman编码实现数据压缩_C语言实现_第9张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第10张图片


2.任意文件二

利用DPCM&Huffman编码实现数据压缩_C语言实现_第11张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第12张图片

3. 狗.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第13张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第14张图片

4.鸟.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第15张图片

利用DPCM&Huffman编码实现数据压缩_C语言实现_第16张图片

5. 噪声.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第17张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第18张图片

6.圆圈.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第19张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第20张图片

7.lena.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第21张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第22张图片

8.水果.jpg

利用DPCM&Huffman编码实现数据压缩_C语言实现_第23张图片利用DPCM&Huffman编码实现数据压缩_C语言实现_第24张图片

9. DPCM&Huffman编码与Huffman编码 压缩比较

文件名    原始图像 压缩后 压缩比 预测误差 压缩后 压缩比
1 1.75MB 1555KB 1.1524 1.75MB 701 KB 2.5563
2 0.98MB 770KB 1.3033 0.98MB 405 KB 2.4778
Camman 96KB 61KB 1.5738 96KB 39 KB 2.4615
Clown 96KB 70KB 1.3714 96KB 47 KB 2.0426
Fruit 96KB 70 KB 1.3714 96KB 42 KB 2.2857
Lena 96KB 69 KB 1.3913 96KB

45 KB

2.1333
Noise 96KB 65 KB 1.4769 96KB 73 KB 1.3151
Odie 96KB 20 KB 4.8 96KB 17 KB 5.6471
Birds 576KB 520 KB 1.1077 576KB 333 KB 1.7297
Zone 96KB 60 KB 1.6 96KB 72 KB 1.3333

由对比可以看出,DPCM+Huffman编码的压缩效率优于Huffman编码。

你可能感兴趣的:(DPCM,Huffman编码,数据压缩,C语言)