HEVC-環路濾波 之去塊效應濾波

HEVC系列的目標:

1、對基本概念的進行了解,不深入公式推導當中。在學習進行之前存在的疑問,學習之後是不是都一一解決了?

2、在一段時間忘記相關概念的時候,是不是可以通過閱讀之前的記錄 最快的回憶起相關概念。

     環路濾波是什麼?環路濾波在編解碼框架的哪個部分?環路濾波是爲了解決什麼問題的?環路濾波用了哪些技術?環路濾波的流程是怎樣的?

一、 環路濾波是什麼?

    環路濾波顧名思義就是在環路上面對數據進行濾波操作,而所謂的濾波操作就是將數據乘上某一個權重數據。

二、環路濾波在編碼框架的哪個部分?

    從解碼端考慮,解碼端用於幀間/幀內預測解碼的數據 是熵解碼 反變換 反量化之後的數據。而在編碼端,幀間預測的數據是經過環路濾波處理的。這樣做雖然增加了複雜度,同時還需要多傳輸濾波相關的比特數。 但是濾波後的數據用於參考 能夠減少殘差的數據,這樣從整個編碼系統看來 編碼出來的比特數反而少了。

三、環路濾波是爲了解決什麼問題的?

   環路濾波主要是爲了解決塊效應和振鈴現象而設置的模塊。兩個問題產生的原因不同,解決的方法也不一樣。

  • 塊效應和去塊效應

    方塊效應是指圖像中編碼塊邊界的不連續性。塊效應是在環路濾波之前的模塊引入的。

    1、變換量化過程中的TU分塊導致的。

TU塊中變換量化編碼過程相互獨立,引入的量化誤差大小及其分佈特性相互獨立,導致相鄰塊邊界的不連續。

     2、預測編碼PU分塊導致。

在運動補償預測過程中,相鄰塊的預測值可能來自於不同圖像的不同位置,這樣就會導致預測殘差信號在塊邊界產生數值不連續。另外,時域預測技術使得參考圖像中存在的邊界不連續可能會傳遞到後續編碼圖像。

     解決塊效應的方法 是加入一個去塊效應模塊,這個模塊的作用是將塊與塊邊界附近的像素進行平滑濾波處理。使得邊界的不連續性不那麼明顯。

  • 振鈴效應和樣點自適應補償

    振鈴效應 是從量化過程中引入的,數據經過DCT變換、量化後,高頻的信息產生失真。這些失真的信息經過解碼恢復的時候就會在圖像邊緣周圍產生波紋現象。

    SAO(樣點自適應補償)濾波就是爲消除這種振鈴效應而設計的。它通過對重建圖像的分類,對每一類圖像像素值加減一個偏移,達到減少失真的目的。在HEVC中包含了兩種像素值補償方法:邊界補償(Edge Offset,EO)以及邊帶補償(Band Offset,BO)。在HEVC中SAO是以CTU爲基本單位的。

四、環路濾波採用了哪些技術?

4.1 去塊效應

    去塊效應的最終目的是: 爲了 不同的塊邊界自適應選擇是否濾波及濾波強度,如對平滑區域處的不連續邊界做強濾波處理,對紋理較豐富的區域弱濾.波乃至不濾波。

    去方塊濾波模塊的總體流程:首先圖像分割成一個個8x8塊,找8x8塊的邊界,包括水平和垂直,取邊界兩側的4x4進行組合形成8x4(垂直)或者4x8(水平),邊界就落在這8x4/4x8的塊中間了。對這些8x4/4x8進行邊界強度(BS),然後BS>0的時候進行計算濾波開關的決策計算,對於濾波打開的情況下進行濾波強度的計算,以得到邊界的濾波強度(不濾波、弱濾波或強濾波)及濾波參數,在BS大於0而且濾波開關打開的情況下才進行濾波操作,即根據所選擇的濾波強度及濾波參數對像素進行相應的修正。

     如下圖BS>0是BS的計算過程,計算得到的BS大於0,進入式7-1就是一個濾波開關的決策過程,如果開關時開的情況下 進入濾波強度的決策。然後根據不同的濾波強度進行濾波處理。

  •  分塊找邊界 確定邊界的處理順序

    對圖像進行分塊的大小是8x8。TU和PU最小都是8x8,所以塊濾波取這個大小是爲了覆蓋所有TU和PU的邊界。而實際是將8x8塊分成兩部分獨立進行去方塊濾波處理,垂直邊界以8x4爲基本單位,水平邊界以4x8爲基本單位

  • 計算邊界強度BS

    邊界強度跟濾波強度是兩個概念,邊界強度間接影響濾波強度,邊界強度( Boundary Strength, BS),其取值爲0、1或2。

    亮度分量:

    邊界強度值爲0時,表示該邊界不需要濾波,亮度分量邊界強度值爲1或2時,會進行後續模塊處理,並且值會影響後續“濾波強弱選擇”中的閾值。

    色度分量:

    邊界強度值爲0、1時,表示該邊界不需要濾波,只有邊界強度值爲2時,纔會對其進行濾波。

    計算流程:

    如下圖。P\Q如前圖所示,邊界強度值在一定程度上反映了兩個相鄰塊編碼參數的一致性。 相鄰塊採用的編碼參數越一致,那麼BS就越小,邊界的塊效應就越小。

 

  • 確定邊界是不是要進行濾波(濾波開關)

邊界需不需要濾波的規則是 邊界兩邊比較平滑但是邊界處出現了差異,這個差異不能太大,太大就是圖像邊界而不是編碼過程中引入的。如下圖,

 

問題是該如何取衡量邊界的差異,HEVC中是用8X4塊中最上6個和最下6個像素進行計算得到的,計算的值稱爲紋理度。

 

            垂直塊邊界區域的紋理度定義爲

Cb小於某個閾值時開啓邊界濾波,這個閾值通過邊界兩邊塊的QP值算出來的。

  • 確定邊界是進行什麼強度的濾波(濾波強度)

濾波強度也跟邊界處的差異有關,差異越大需要越強的濾波,但不能超過一定範圍。判斷的方式如下

強濾波: 式(7-2) ~ (7-7) 均滿足時,否則採用弱濾波。

其中式(7-2)和式(7-3) 用於判斷邊界兩邊像素值的變化率。

其中式(7-4)和式(7-5)用於判斷邊界兩側像素是否平坦。

其中式(7-6)和式(7-7) 用於判斷在邊界處像素的跨度是否控制在一定的範圍內。 其中tc是判斷的閾值,跟QP、 slice_tc_offset div2 (片級補償值)以及前面計算到的QS有關。

 

 

  • 進行濾波操作

1、亮度分量強濾波

    強濾波會對邊界兩側的像素進行大範圍、大幅度的修正,邊界像素p(m,n)和q(m,n)都要進行修正,m取值0,1,2,且n取值0,1,2。也就是對邊界左右兩邊3個共6個像素進行修正。像素值的修正公式略。但是是跟前面tc有關 也就是其中跟QP、 slice_tc_offset div2 (片級補償值)以及前面計算到的QS有關。

2、亮度分量弱濾波

    弱濾波操作中修正的像素範圍及幅度較小,而且需要根據每一行像素的具體情況確定每行的濾波操作。一般情況下不修復或者只修復一個點。

3、色度分量濾波

    當獲取邊界強度模塊判定BS=2時,色度分量需要進行濾波操作,色度濾波的過程跟邊界左右兩邊4 共8個像素都有關係。

五、解碼相關的語法

1. SPS級語法語義

       pcm_loop_filter_disabled_flag: 該語法元素用於說明對於一個編碼單元CU,在pcm_ enabled_ flag 爲1的條件下是否採用環路濾波技術,包括

去方塊濾波以及像素自適應補償。當該語法元素取值爲1時,表示不使用;取值爲0時,表示使用。

      loop_filter_across_tiles_enabled_flag: 該語法元素用於說明在tile的邊界處是否執行環路濾波操作,包括去方塊濾波和像素自適應補償。當取值爲1時,表示執行;取值爲0時,表示不執行。

     pps_ loop_ filter_ across_ slices_ enabled_ flag: 該語法元素用於說明在Slice的左邊界以及上邊界處是否執行環路濾波操作。當取值爲1 時,表示執行;取值爲0時,表示不執行。

    deblocking_filter_ control_ present_ flag: 該語法元素指出控制去方塊濾波的語法元素是否出現在PPS中。當取值爲1時,表示在PPS中有控制.去方塊濾波的語法元素;取值爲0時,表示沒有。

    deblocking_filter_override_ enabled_flag: 該語法元素指出在Slice 頭部是否出現語法元素deblocking_filter_override_flag。 當取值爲1時,表

示在Slice頭部存在語法元素deblocking_filter_ override_ flag; 取值爲0時,表示在Slice頭部不存在該語法元素。其默認值爲0。

    pps_ deblocking_ filter _disabled_ flag: 該語法元素表示在語法元素

    slice_ deblocking filter_ disabled_ flag 未出現的條件下,是否對各個Slice執行去方塊濾波。當取值爲1時不執行;取值爲0時執行。默認值爲0。

    pps beta_ offset_ div2& pps_ tc_ offset_ div2: 該語法元素表示去方塊濾波參數p/2和tc/2的默認補償值,該補償值還可以在Slice的頭部進行重載。其取值範圍爲[- 6,6],當該語法元素未出現時,認爲其值爲0。

2. Slice 級語法語義

    deblocking_filter_ override_ flag: 該語法元素表明在Slice的頭部是否出現去方塊濾波參數。當取值爲1時,表明出現了去方塊濾波參數;當取值爲0時,表明未出現。其默認值爲0。

    slice_ deblocking_ filter_ disabled_ flag: 該語法元素表明對於當前Slice是否進行去方塊濾波操作。當其取值爲1時,表示不進行;取值爲0時,

表示進行。當該語法元素未出現時,其值等於語法元素pps_deblocking_filter_disabled_flag 的值。

    slice_ beta_ offset_ div2&slice_ tc_ offset_ div2: 該語法元素表明當前Slice的去方塊濾波參數β/2和tc/2的補償值,其取值範圍爲[-6,6]。 當該語法元素未出現時,slice_beta_offset_ div2 的值等於pps_ beta_ offset_ div2的值,slice_ tc_ offset_ _div2 的值等於pps_ tc_ offset_ _div2 的值。

slice_loop_filter_ across_ slices_ enabled_ flag: 該語法元素表明對於當前Slice的左邊界及上邊界是否進行環路濾波操作,包括去方塊濾波和像素自適應補償。當取值爲1時,表示可能進行( 具體情況要根據後續條件判斷);取值爲0時,不進行環路濾波。當該語法元素未出現時,其值等於pps_ loop_ filter_ _across_ slices_ enabled_ flag 的值。

六、總結

    塊效應是編碼塊與塊之間的預測,變換參數方法等不一樣導致的塊邊界像素的不連續。 解決這個問題的方法是對邊界周圍的像素點進行濾波修正。濾波修正處理的是左右或者上下兩個8x8之間的垂直和水平邊界,實際計算的範圍是邊界周圍8x8像素矩陣拆分成的兩個4x8或者8x4像素矩陣。首先計算邊界強度,邊界強度跟邊界周邊兩個4x4塊採用的預測和變換的參數相關。計算得到邊界強度後,對於邊界強度大於0的,進一步判斷是否需要濾波。是否需要濾波是通過邊界像素的差異來決定的。如果是需要濾波的情況,還需繼續判斷是使用強濾波還是弱濾波。這一步的判斷跟邊界差異,QP,邊界強度以及sps 中片級償值 有關。最後就依照公式進行濾波像素修正。強濾波修正的範圍比較大。

 

 

 

 

 

 

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