【視頻編解碼·學習筆記】8. 熵編碼算法:基本算法列舉 & 指數哥倫布編碼
一、H.264中的熵編碼基本方法:
- 熵編碼具有消除數據之間統計冗余的功能,在編碼端作為最後一道工序,將語法元素寫入輸出碼流
- 熵解碼作為解碼過程的第一步,將碼流解析出語法元素供後續步驟重建圖像使用
在H.264的標準協議中,不同的語法元素指定了不同的熵編碼方法。在協議文檔中共指定了10種語法元素的描述符,這些描述符表達了碼流解析為語法元素值的方法,其中包含了H.264標準所支持的所有熵編碼方法:
語法元素描述符 | 編碼方法 |
---|---|
b(8) | 8位二進制比特位串,用於描述rbsp_byte() |
f(n) | n位固定模式比特位串,從最左bit開始計算 |
u(n) | 使用n位無符號整數表示,由n位bit換算得到 |
i(n) | 使用n位有符號整數表示,由n位bit換算得到 |
ue(v) | 使用無符號指數哥倫布編碼 |
se(v) | 使用有符號指數哥倫布編碼 |
te(v) | 使用截斷指數哥倫布編碼 |
me(v) | 使用映射指數哥倫布編碼 |
ce(v) | 上下文自適應的變長編碼(CAVLC) |
ae(v) | 上下文自適應的二進制算術編碼(CABAC) |
二、指數哥倫布編碼分類 & 編解碼過程:
同之前介紹的哈夫曼編碼一樣,指數哥倫布編碼同樣屬於變長編碼(VLC)的一種
二者顯著區別:
- 信源相關性:哈夫曼編碼依賴於心願的概率分布;指數哥倫布編碼與信源無關
- 額外信息:哈弗曼編碼的數據必須額外攜帶與該信源匹配的碼表;指數哥倫布編碼不需額外信息
1. 指數哥倫布編碼的分類
常用的指數哥倫布編碼通常可以分為四類:
語法元素描述符 | 編碼方法 |
---|---|
ue(v) | 使用無符號指數哥倫布編碼 |
se(v) | 使用有符號指數哥倫布編碼 |
te(v) | 使用截斷指數哥倫布編碼 |
me(v) | 使用映射指數哥倫布編碼 |
其中無符號指數哥倫布編碼ue(v)是其他編碼方式的基礎,其余幾種方法基本可以由ue(v)推導得出。
2. 0階(零階)無符號指數哥倫布編碼 ue(v)
ue(v)的碼字可以分為三個部分:
[prefix] 1 [surfix]
其中前綴碼為n個bit長度的0,後綴碼為表示實際數值的信息位,信息位的長度等於前綴碼中0的個數。
指數哥倫布編碼中前綴和後綴部分的長度根據碼元數值來確定:
0階指數哥倫布編碼模板 | 適用碼元值 |
---|---|
1 | 0 |
0 1 x | 1, 2 |
0 0 1 x x | 3~6 |
0 0 0 1 x x x | 7~14 |
0 0 0 0 1 x x x x | 15~30 |
0 0 0 0 0 1 x x x x x | 31~62 |
…… | …… |
編碼模板的後綴部分,xx以二進制的形式表示解碼後的數值
前綴0的長度以LeadingZeroBits表示,那麽解碼後數值為:\(codeNum = 2^{LeadingZeroBits} - 1 + (xxx)\)。(xxx)為二進制數值xxx的10進制表示。舉例如下:
指數哥倫布編碼碼字 | 碼元數值 |
---|---|
1 | 0 |
0 1 0 | 1 |
0 0 1 0 1 | 4 |
0 0 0 1 0 0 0 | 7 |
編解碼過程:
- 編碼:
codeNum = 13,
前綴0的個數:\(prefixLen = floor[log_2(codeNum+1)] = 3\);
後綴部分的二進制:\(codeNum+1-2^{prefixLen} = 14-8 = 6 = b(1 1 0)\)
因此13的指數哥倫布編碼碼字為0 0 0 1 1 1 0。 - 解碼:
指數哥倫布碼 0 0 0 0 1 0 1 0 1
解碼後的數值為 \(2^4-1+5 = 20\)
3. 有符號指數哥倫布編碼 se(v)
“有符號的指數哥倫布編碼值”是通過“無符號的指數哥倫布編碼的值”通過換算得到的
其換算關系為:\(n = (-1)^{(k+1)} \times Ceil(k / 2)\)
就是說:先按無符號方式解碼,得到的十進制數字兩個一組,絕對值相同,第一個是正的,第二個是負的。
下表為有符號和無符號指數哥倫布編碼之間的換算關系:
指數哥倫布編碼碼字 | 無符號解碼結果 | 有符號解碼結果 |
---|---|---|
1 | 0 | 0 |
0 1 0 | 1 | 1 |
0 1 1 | 2 | -1 |
0 0 1 0 0 | 3 | 2 |
0 0 1 0 1 | 4 | -2 |
k | \((-1)^{(k+1)} \times Ceil(k / 2)\) |
4. 截斷指數哥倫布編碼 te(v)
解碼時,首先需要判斷的是語法元素的取值範圍,假定為\([0, x], x≥1\)。根據x的取值情況,語法元素根據下面不同情況進行解析:
- 若x>1,解析方法同ue(v)相同
- 若x=1,語法元素值等同於下一位bit值的取反
5. 映射指數哥倫布編碼 me(v)
適用於預測模式為Intra_4x4, Intra_8x8或Inter的宏塊的coded_block_pattern的編碼。me(v)的映射方式並無指定的換算公式,通常由查表的方式進行。
三、指數哥倫布編碼同哈夫曼編碼的比較:
- 哈夫曼編碼在編碼過程中考慮了信源各個符號的概率分布特性,根據符號的概率分布進行編碼,不同的信源的哈夫曼編碼的結果不同;指數哥倫布編碼對所有信源統一
- 哈夫曼編碼在解碼前必須額外獲得一份當前信源的碼表;指數哥倫布編碼不需要
- 指數哥倫布編碼的壓縮比率通常比較低,對於有些信息甚至完全沒有壓縮效果;在不考慮碼表的情況下,哈夫曼編碼壓縮率更高
但是,實際上對於視頻壓縮而言,類似於哈夫曼編碼所提供的壓縮比率的優勢遠遠不夠,而且還需額外碼表。因此在實際的視頻編碼方法中使用的是指數哥倫布編碼,但是由於壓縮率低,只作為少數的輔助語法元素的編碼以及多數語法元素的二值化方法。
真正貢獻了高壓縮比的為CAVLC和CABAC編碼等,將在後續學習筆記中進行介紹。
【視頻編解碼·學習筆記】8. 熵編碼算法:基本算法列舉 & 指數哥倫布編碼