HEVC-熵編碼

         HEVC 熵編碼 需要理解和學習的內容? 學習的目的還是主要用於回顧,後續如果用到相關的知識,希望能夠看到文章之後,能夠迅速的瞭解

1、熵編碼是什麼?熵編碼的目的?熵編碼的通用流程?

2、熵編碼的方法有哪些?

3、HEVC 中的熵編碼的方法有哪些,具體的流程是怎樣的?

一、熵編碼是什麼?熵編碼的目的?熵編碼的通用流程?

    瞭解熵編碼,首先要了解熵是什麼? 熵是衡量某個事件的信息量在編解碼中就是碼流的信息量。熵跟碼流的概率成反比。 碼流中某個符號出現的概率越大,那麼對應的熵就越小。也就是說在這個符號傳輸之前我就已經很大概率知道會是傳輸這個了。所以出現這個符號給我的信息是少的,而如果傳輸的這個符號是我基本上不會去猜的,那這個符號傳遞的信息就很多的,對應的熵就很多了。

   熵編碼的目的和視頻編解碼的目的是一致的,都是爲了減少碼流的數據量,使得能夠減少數據傳輸的帶寬。在之前的編解碼框架體系中,比如幀內用的是空間上的冗餘,幀間利用的是時間上的冗餘來達到壓縮的目的。 而熵編碼是從碼流整體的統計特性去考慮的。熵編碼通過去除碼流中的統計冗餘達到對數據的壓縮的。

    不同編碼的流程不一樣,但總的來說編碼需要滿足唯一可譯性。對於使用者來說,只需要知道協議中具體用到的編碼方法的流程即可。

二、 熵編碼方法有哪些? 

2.1 變長編碼(指數哥倫布編碼)

        變長編碼的特點:對信源輸出的消息(一個信源符號或者固定數目的多個信源符號)採用不同長度的碼字表示,這種編碼方式稱爲變長編碼。爲了提高編碼效率,需要根據符號出現的概率大小設計碼長,即對於大概率符號採用較短的碼字表示,小概率符號採用較長的碼字表示,以達到平均碼長最短的目的。

  • 指數哥倫布編碼過程

    指數哥倫布碼由前綴和後綴兩部分構成,前綴和後綴都跟指數哥倫布碼的階數k有關。非負整數N的k階指數哥倫布碼可用如下步驟生成。

①將數字N以二進制形式寫出,去掉最低的k個比特位,之後加1。

②計算①所得到二進制數的比特數,將比特數減一得到需要增加的前綴零的個數n。

然後在①得到的比特串加上n個0。

③將步驟①中去掉的最低k個比特位補回到②得到的比特串尾部就得到最後編碼的數據了。

以4的一階指數哥倫布編碼爲例:

①4的二進制表示爲100, 去掉最低1個比特位0變成10,加1後得到11。

②11的比特數爲2,因此前綴中0的個數爲1。將0補到11前面 得到011。

③在比特串最低比特位補上步驟①中去掉的0,最終碼字爲0110。

  • 指數哥倫布解碼過程

    解碼原理:解析k階指數哥倫布碼時,首先從比特流的當前位置開始尋找第一個非零比特,並將找到的零比特個數記爲m,第一個非零比特之後m+k位二進制比特串的十進制值爲Value,計算解碼值CodeNum。

                codeNum= 2的m+k次方- 2的k次方+ Value

比如0110,m = 1 ,m+k = 1+1 =2, value = 10的十進制爲2,codeNum = 4 - 2 + 2 = 4.

2.2  算術編碼

    算術編碼的原理:算術編碼的基本原理是:根據信源可能發生的不同符號序列的概率,把[0,1)區間劃分爲互不重疊的子區間,子區間的寬度是各符號序列的概率,這樣信源發出的不同符號序列將與各子區間一一對應。因此每個子區間內的任意實數都可以用來表示的符號序列,這個數就是該符號序列所對應的碼字。    與變長編碼不同,算術編碼是一種基於遞歸劃分的編解碼方法。其本質是給整個輸入序列分配一個碼字,而不是給每個輸入序列中的每個字符都分配碼字,平均意義上可以爲單個字符分配碼長小於1的碼字。因此,算術編碼可以得到接近最優的編碼結果。

  • 算術編碼的編碼流程

        用一個實例來解釋算術編解碼過程。假設信源共有A、B、C、D四種符號,且它們的概率分別爲A(0.3),B(0.3),C(0.2),D(0.2)。根據它們的概率將[0,1]分成4個子區間,使A、B、C、D四種符號與4個子區間一一對應。圖(a)爲算術編碼過程,若要編碼的序列爲ABB,第一個符號是A,所以新的子區間爲[0,0.3];然後把[0,0.3]當成單位1再按A、B、C、D的概率將其分爲4個不重疊的子區間,第二個符號是B,所以新的子區間爲[0.09,0.18];重複上述過程,用最後一個間隔中的任意數來表示符號序列編碼結果。此處輸出選擇0.0930爲符號序列ABB的編碼結果。

        

 

  • 算術編碼的解碼流程

        其解碼過程如圖(b)所示,首先,將[0,1]分成4個子區間,將編碼結果0.0930與區間大小相比較,選擇0.0930所在的區間輸出與區間對應的符號。本例子中0.0930在[0,0.3]之間,所以輸出第一個符號爲A;將[0,0.3]作爲新的區間並按概率分成4個子區間,用同樣的方法依次判斷後續符號,得到解碼結果ABB。

 

三、HEVC 中的熵編碼

3.1 0階哥倫布編碼

  • 0階哥倫布編碼

    在熵編碼中,很多語法元素都採用指數哥倫布碼的形式映射爲二進制比特流。零階指數哥倫布碼由前綴和後綴串接而成,前綴長度Lpfx 和後綴長度Lsfx 滿足Lpx-1=Lstx。

前綴: 具有一元碼的形式,即0...001,其中零的個數M爲M = [log2(CodeNum+1)], 其中,CodeNum爲編碼數值索引,對於無符號數V,其索引CodeNum等於V;對於有符號數V,索引CodeNum則爲:CodeNum =2V-1, V> 0;-2V,     V≤0;根據待編碼數值,可以選擇無符號數的指數哥倫布編碼ue(v)或是有符號數的指數哥倫布編碼se(1)。

後綴:爲INFO的十進制值的二進制表示形式:  INFO= CodeNum+1-2的M次方

  • 零階指數哥倫布的解碼

        先讀取第一個1前面0的個數M,接着讀取第一個1後面M個信息位,根據前面INFO的公式可得CodeNum的計算方式:CodeNum=1-2的M次方 + INFO-1。計算出碼字CodeNum,最後根據編碼方式ue(v)/ se(v) 中CodeNum 和 V 的關係 由CodeNum反推得到V。

  • 零階指數哥倫布編碼的參數

        零階指數哥倫布編碼方法被用於視頻參數集(Video Parameter Set,VPS)、序列參數集( Sequence Parameter Set, SPS )、圖像參數集( Picture ParameterSet,PPS)和片頭信息等所涉及的大部分語法元素中。具體的語法元素以及它所採用的是無符號數的指數哥倫布編碼ue(v)還是有符號數的指數哥倫布編碼se(v)。

3.2 cabac 編碼

    cabac編碼的碼流是二進制的,所以cabac的第一個流程就是將非二進制的碼流進行二進制化。cabac 是屬於算術編碼的範疇,也就意味着基本上遵守着算術編碼的流程,從上面的算術編碼的流程來看,決定某個碼流比特在哪個區間的是該碼流的概率,所以需要先得到將要編碼的這個數據的概率。 但是碼流是源源不斷的生成,所以在碼流沒有結束的時候是不可能知道概率。 這個就需要用到上下文建模,通過上下文建模來估計待編碼位的概率。

    上下文建模估算概率用的理論是 生成碼流的語法元素並不是獨立,相互具有相關性,通過這個上下文的相關性能夠比較正確的估算出來待編碼位的概率。這樣估算出來的概率通過編碼後能夠提高編碼性能。

    總的來說就是上下文建模及概率估計更新  這個過程就是進行概率狀態索引σ的更新,概率狀態索引σ在後續的 編碼過程中決定了編碼的區間。而編碼過程就是根據代編碼bin的值來確定編碼區間。編碼結束後,編碼區間的值就是最後編碼生成的值。

  • 二進制化

 (1)截斷萊斯二進制化。
       截斷萊斯由兩個參數進行控制分別位門限值cMax、萊斯參數R。跟哥倫布編碼類似,截斷萊斯也是由前綴和後綴串接而成。

假設要編碼的數據爲V,截斷萊斯的兩個參數爲位門限值cMax、萊斯參數R。

前綴碼:

設P=V>> R,

若P小於值(cMax>> R),則前綴碼由P個1和一個0組成,長度爲P+1。

若P大於等於值(cMax>> R),則前綴碼由(cMax>> R)個1組成,長度爲(cMax>> R)。

後綴碼:

V小於cMax時,其後綴值S爲S=V-(P<< R)後綴碼爲S的二元化串,長度爲R。

V大於等於cMax時,無後綴碼。

(2)定長二進制化。

假設某一給定語法元素的值爲x, 且0≤x≤Max,則直接利用十進制數轉

換爲二進制數法則來得到x的定長二值符號串,其長度l2 =[log2 Max]

  • 上下文模型

    上下文模型實際上有兩個作用,一個是在編碼下一個數據前,輸出概率狀態索引σ到二進制算法編碼中 控制編碼的區間。二是噹噹前數據到底並且編碼完成的時候更新概率狀態索引σ。

     1、初始化其上下文概率模型

        首先在編碼第-一個 二進制符號前要初始化其上下文概率模型。從前面可以知道上下文模型的一個特點就是當前的編碼跟之前的編碼有關聯。所以初始化的時候要設定一個初始的編碼值,在HEVC中就是最大概率符號MPS,其表示待編碼的Bin很有可能出現的符號,取值爲1或0。與之對應的,待編碼的Bin 不可能出現的符號即爲最小概率符號LPS。

初始化流程:
爲每一個上下文模型索引分配了一個初始值V,通過V來計算上下文模型的初始變量MPS和σ。計算方法如下:

其中a、b、c、d和e爲中間變量,QPy 爲片層亮度量化參數。

2、概率模型更新

       概率模型更新實際上是根據當前編碼的二進制通過查表來更新概率狀態索引σ。 表如下包括兩個表,一個表是當前編碼的二進制是最大概率符號MPS,一個是當前編碼的二進制是最小概率符號LPS。

概率模型更新方法: 若編碼的二元符號值等於MPS,則通過查表變量σ更新爲

                  σ更新= transIdxMps(σ)

當編碼的二元符號值等於LPS時,如果變量σ值爲零,就互換MPS和LPS的值,而且更新變量σ。

否則不互換MPS和LPS,只更新變量σ,通過查表

                σ更新= transIdxLps(σ)

 

  • 二進制算法編碼

    二進制算術編碼實際也是算術編碼,所以編碼流程也就是碼流不斷的進來到編碼模塊,通過碼流確定編碼的編碼區間的大小和區間的下界。首先是一個[0,510]的區間,然後來一個二進制,輸出一個編碼區間的size 和區間的下屆,在來一個二進制,在前面輸出的編碼區間內,重新輸出編碼區間的size 和區間的下屆,直到編碼結束。

     常規編碼模式:  編碼器的輸入值是上下文模型變量和待編碼的Bin值,編碼器的狀態是當前編碼區間大小R和區間下限L。根據給定的概率模型變量對當前區間進行細分。首先計算索引值p:

    ρ=(R>> 6)&3

通過查表得到LPS對應的子區間Rps:RLps=rangeTabLps[σ][p]。對當前MPS的子區間RMps:RMps=R- RLps。

如果當前二進制符號Bin等於MPS,則MPS的編碼區間RMps作爲下一個二元符號的編碼區間R,區間下限L不變;

如果當前二進制符號Bin等於LPS,則LPS的區間RLps作爲下一個二元符號的編碼區間R,區間下限L要增加RMps的長度。隨後根據當前Bin值更新上下文模型。

        旁路編碼模式:無須對概率進行自適應更新,而是採用0和1概率各佔1/2的固定概率進行編碼,因此該編碼較爲簡單。爲了使區間劃分操作更加簡便,不採用直接對區間長度二等分的方法,而採用保存編碼區間長度不變,使區間下限L值加倍的方法來實現區間劃分,效果是一樣的。

 

四、總結

    HEVC中熵編碼是去除編碼數據的統計冗餘來達到編碼壓縮的目的。這裏面利用很多信息論的理論,這些理論都是通過數學公式證明的,對於實際使用者而言,不用深入到具體的公式裏頭,只需要對使用的方法和具體的步驟瞭解即可。

   HEVC中使用了指數哥倫布編碼以及上下文自適應編碼這兩種技術對編碼參數,殘差數據進行熵編碼,其中指數哥倫布編碼流程簡單,通過對編碼數據計算前綴值和後綴值即可。

   而上下文自適應二進制編碼 流程比較複雜,首先要將非二進制的數據進行二進制化,然後根據一些先驗的信息去初始化上下文模型,所謂的上下文模型是體現編碼數據的統計信息的,實際就是一個根據編碼數據更新編碼概率的流程。上下文模型在編碼前輸出概率狀態索引到二進制編碼模塊。最後進行二進制編碼,二進制編碼是根據編碼數據 和 上下文模型輸出的概率狀態索引 確定編碼區間大小和編碼下屆的過程。編碼完當前的數據後,還需要對上下文模型進行更新,也就是更新概率狀態索引。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章