DPCMcoding
實驗原理
在一個DPCM系統中,有兩個因素需要設計:預測器和量化器。理想情況下,預測器和量化器應進行聯合優化。實際中,採用一種次優的設計方法:分別進行線性預測器和量化器的優化設計。
在本次實驗中,我們採用固定預測器和均勻量化器。預測器採用左側、上方預測均可。
量化器採用8比特均勻量化。
預測編碼基本原理
- 信源的相鄰符號通常是相關的。
相鄰像素具有相關性。 - 預測編碼:
利用信源相鄰符合之間的相關性。
->根據某一模型利用以往的樣本值對新樣本進行 預測,然後將樣本的實際值與其預測值相減得 到一個誤差值,最後對這一誤差值進行編碼。
->如果模型足夠好,且樣本序列在時間上相關性 較強,則誤差信號的幅度將遠遠小於原始信號 ,從而得到較大的數據壓縮。
DPCM原理圖
爲防止量化誤差累積,採用上一個樣點的重建值對當前樣點進行預測,故編碼器中應內嵌一個解碼器(如虛線所示),需要在編碼端獲得解碼重建值。
量化
一、量化器的形式化描述
編碼器將每個量化區間的索引發給解碼器,解碼器用重構水平表示該區間內所有的值。
1. 需要決定的參數:
(1)量化區間的數目
(2)決策邊界(判決門限)
(3)重構水平
(4)量化區間索引的碼字(量化碼字)
2.優化方案
碼率與失真之間需要折中,爲了降低編碼的比特數,需要減低量化區間 的數目,則導致更大的誤差。
有兩種方案來進行量化器設計:
(1)定長編碼,給定Rbit進行量化編碼,則量化區間數和量化區間索引碼字都定了。確定判決電平和重建電平來使量化誤差最小(可以求量化的均量誤差MSE)。
(2)給定率失真函數或是量化誤差,去決定量化區間數和量化區間的索引碼字。
通常採用第一種方式優化量化設計。
二、均勻量化
1.均勻量化器的分類
1.1 中升型Midrise
1.2 中平型Midtread
2.均勻量化對不同分佈的效果
2.1 均勻分佈
均勻量化器只對均勻分佈信源是最佳的。
Midrise↓
Midtread↓
2.2 非均勻分佈
對於非均勻分佈,可以採用均勻量化或者非均勻量化。
- 非均勻分佈的均勻量化
除了最後兩邊的量化區間,量化間隔是相等的。
例如,對非均勻分佈進行3bit量化,共8個量化區間,其中有6個等長量化區間。
量化間隔△越大,顆粒噪聲功率越大,過載噪聲功率越小。
Midrise↓
Midtread↓
非均勻分佈的非均勻量化
非均勻量化具有多種方法,下面僅以LIoyd-Max標量量化器爲例。
給定量化級數M=2^n,則每個量化區間的索引用n個比特表示。求最佳bi,yi使得量化誤差最小。
若系統只是一個量化過程,對於非均勻分佈進行非均勻量化無疑是最優的。
若系統是量化+熵編碼,由於熵編碼對於分佈越不均勻的信源,壓縮效率越高,故此時對非均勻分佈進行均勻量化,系統性能最優。
實驗流程
本實驗代碼只需在實驗二BMPtoYUV基礎上加上少量代碼實現DPCM編碼即可。
1. 寫入BMP文件,轉化爲YUV文件,提取Y部分(256級的灰度圖像)。
2. 對該灰度圖像進行預測,計算預測誤差(預測器的輸入爲上一個樣點的重建值)。
3. 對預測誤差進行8bit均勻量化。
4. 對量化後的預測誤差進行反量化,求重建值。
5. 將預測誤差圖像寫入文件,並將該文件輸入Huffman編碼器,得到輸出碼字的必要信息。將原始灰度圖像輸入Huffman編碼器,得到碼字必要信息。比較兩種系統(DPCM+熵編碼和僅進行熵編碼)之間的編碼效率。
代碼分析
省略文件打開、文件關閉、以及與BMPtoYUV、HuffmanCoding相同部分。
void DO_DPCM(void * yBuf, void * quanBuf, void *rebuildBuf, unsigned int width, unsigned int height)
{
unsigned char *y_buffer = NULL;
unsigned char *quan_buffer = NULL;
unsigned char *rebuild_buffer = NULL;
int immediate = 0;
int i = 0;
int j = 0;
y_buffer = (unsigned char *)yBuf;//定義指針指向原始圖像緩衝區
quan_buffer = (unsigned char *)quanBuf;//定義指針指向預測誤差圖像緩衝區
rebuild_buffer = (unsigned char *)rebuildBuf;//定義指針指向重建圖像緩衝區
for (i = 0; i < width; i++)
{
for (j = 0; j < height; j++)
{
if (j == 0)
{
/*本程序令當前像素對左邊一個像素進行預測,
每列第一個像素則對灰度128進行預測。
256級的灰度圖像,預測值取值範圍[-255,255],
則對其進行8bit量化可以將預測值除以2,
此時取值範圍[-127,127],再加上128,使預測誤差
能以灰度圖像正常顯示。
*/
/*immediate先是爲量化後的預測誤差。
後用來存放反量化後的預測誤差。*/
immediate = (*y_buffer - 128)/2+128;
*quan_buffer = (unsigned char)immediate;
immediate = (*quan_buffer - 128) * 2+128;
*rebuild_buffer = (unsigned char)immediate;
y_buffer++;
quan_buffer++;
rebuild_buffer++;
}
else
{
immediate = (*y_buffer - *(rebuild_buffer-1))/2+128;
*quan_buffer = (unsigned char)immediate;
immediate = (*quan_buffer - 128) * 2 + *(rebuild_buffer - 1);
*rebuild_buffer =(unsigned char)immediate;
y_buffer++;
quan_buffer++;
rebuild_buffer++;
}
}
}
}
實驗結果
選擇十種不同bmp文件,使用DPCM編碼程序該文件的預測誤差值,然後送進實驗三設計的Huffman編碼器進行熵編碼。根據輸出的碼字及其必要信息的文件,對各種不同格式的文件進行壓縮效率的分析。將存有碼字信息的txt文件導入到excel中,進行統計分析。
1.以表格形式表示的實驗結果
FileName | Birds | Bird_q | Camman | Camman_q | Clown | Clown_q | Fruit | Fruit_q |
---|---|---|---|---|---|---|---|---|
raw file size(KB) | 384 | 384 | 64 | 64 | 64 | 64 | 64 | 64 |
compressed file size(KB) | 346 | 147 | 52.3 | 30.8 | 61.1 | 38.3 | 60.4 | 32.9 |
Compression ratio | 1.10982659 | 2.612244898 | 1.223709369 | 2.077922078 | 1.047463175 | 1.671018277 | 1.059602649 | 1.945288754 |
FileName | Lena | Lena_q | Noise | Noise_q | Odie | Odie_q | Zone | Zone_q |
---|---|---|---|---|---|---|---|---|
raw file size(KB) | 64 | 64 | 64 | 64 | 64 | 64 | 64 | 64 |
compressed file size(KB) | 60.1 | 36.6 | 54.9 | 61.1 | 9.9 | 8.71 | 50.8 | 60.4 |
Compression ratio | 1.064891847 | 1.74863388 | 1.16575592 | 1.047463175 | 6.464646465 | 7.347876005 | 1.25984252 | 1.059602649 |
FileName | shuimu | shuimu_q | miao | miao_q |
---|---|---|---|---|
raw file size(KB) | 337 | 337 | 384 | 384 |
compressed file size(KB) | 282 | 67.9 | 321 | 153 |
Compression ratio | 1.195035461 | 4.963181149 | 1.196261682 | 2.509803922 |
2.各樣本文件的概率分佈圖(含部分灰度圖像截圖)
以下是兩張自己找的圖片:
shuimu.bmp
miao.bmp
3.實驗結果的分析
對於相鄰像素相關性高的灰度圖像,量化誤差集中在 0 附近,DPCM+熵編碼的系統性能最優。