1. 程式人生 > >利用DPCM&Huffman編碼實現資料壓縮_C語言實現

利用DPCM&Huffman編碼實現資料壓縮_C語言實現

一、實驗原理

       DPCM是差分預測編碼調製的縮寫,它利用過去的抽樣值來預測當前的抽樣值,對它們的差值進行編碼。差值編碼可以提高編碼頻率,這種技術已應用於模擬訊號的數字通訊之中。影象內的畫素值之間並非相互獨立,某一畫素與周圍畫素之間存在一定的關係,這一關係導致整幅影象的資訊熵不是很大。DPCM利用當前畫素值減去前一畫素值,得到差值,以減少影象之間的冗餘,原理圖如下。


      在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編碼是針對統計資訊冗餘的編碼方法。若二者相結合,先減少空間冗餘,再減少統計冗餘,將起到很好的壓縮效果。

      下面是實驗結果圖,自左向右分別是:原圖、預測誤差影象、重現影象。







原始影象的概率分佈圖與預測誤差影象的概率分佈圖

1.任意檔案一


2.任意檔案二



3. 狗.jpg



4.鳥.jpg



5. 噪聲.jpg


6.圓圈.jpg


7.lena.jpg


8.水果.jpg


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編碼。