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