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

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

方法 mark enter 協議 int 十進制數 pan 進制數 tab

一、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)的映射方式並無指定的換算公式,通常由查表的方式進行。

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

  1. 哈夫曼編碼在編碼過程中考慮了信源各個符號的概率分布特性,根據符號的概率分布進行編碼,不同的信源的哈夫曼編碼的結果不同;指數哥倫布編碼對所有信源統一
  2. 哈夫曼編碼在解碼前必須額外獲得一份當前信源的碼表;指數哥倫布編碼不需要
  3. 指數哥倫布編碼的壓縮比率通常比較低,對於有些信息甚至完全沒有壓縮效果;在不考慮碼表的情況下,哈夫曼編碼壓縮率更高

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

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

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