【視頻編解碼·學習筆記】8. 熵編碼算法:基本算法列舉 & 指數哥倫布編碼

1、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)

2、指數哥倫布編碼分類 & 編解碼過程:

同以前介紹的哈夫曼編碼同樣,指數哥倫布編碼一樣屬於變長編碼(VLC)的一種編碼

兩者顯著區別:spa

  • 信源相關性:哈夫曼編碼依賴於心願的機率分佈;指數哥倫布編碼與信源無關
  • 額外信息:哈弗曼編碼的數據必須額外攜帶與該信源匹配的碼錶;指數哥倫布編碼不需額外信息

1. 指數哥倫布編碼的分類

經常使用的指數哥倫布編碼一般能夠分爲四類:code

語法元素描述符 編碼方法
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進製表示。舉例以下:it

指數哥倫布編碼碼字 碼元數值
1 0
0 1 0 1
0 0 1 0 1 4
0 0 0 1 0 0 0 7

編解碼過程:table

  • 編碼: 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)的映射方式並沒有指定的換算公式,一般由查表的方式進行。

3、指數哥倫布編碼同哈夫曼編碼的比較:

  1. 哈夫曼編碼在編碼過程當中考慮了信源各個符號的機率分佈特性,根據符號的機率分佈進行編碼,不一樣的信源的哈夫曼編碼的結果不一樣;指數哥倫布編碼對全部信源統一
  2. 哈夫曼編碼在解碼前必須額外得到一份當前信源的碼錶;指數哥倫布編碼不須要
  3. 指數哥倫布編碼的壓縮比率一般比較低,對於有些信息甚至徹底沒有壓縮效果;在不考慮碼錶的狀況下,哈夫曼編碼壓縮率更高

可是,實際上對於視頻壓縮而言,相似於哈夫曼編碼所提供的壓縮比率的優點遠遠不夠,並且還需額外碼錶。所以在實際的視頻編碼方法中使用的是指數哥倫布編碼,可是因爲壓縮率低,只做爲少數的輔助語法元素的編碼以及多數語法元素的二值化方法。

真正貢獻了高壓縮比的爲CAVLC和CABAC編碼等,將在後續學習筆記中進行介紹。

相關文章
相關標籤/搜索