HEVC-環路濾波之樣點自適應補償

sao 是什麼? sao解決了什麼問題? sao用了什麼技術?

一 、 sao是什麼以及解決了什麼問題

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

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

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

  • sao在解碼器中的位置

    從前面知道去方塊濾波是在圖像重建之後,在重建的圖像上面進行操作的。sao 是在deblock之後進行的,其在編碼框架中所處的位置跟deblock的位置一致。

二、 sao採用了什麼技術

    sao根據當前像素與周邊像素大小差異  或者是像素自身的像素值的情況分爲  邊界補償和邊帶補償。

2.1 邊界補償(EO )

    邊界補償對像素進行分類的計算方法是:通過當前像素和周圍像素進行比較來進行分類,根據周圍像素所處的位置可以分爲4種模式:水平方向(EO_0)、垂直方向(EO_1)、 135°方向(EO_2)以及45°方向(EO_3)。其中,c表示當前像素,a和b表示相鄰像素。

而在每一種模式情況下,當前跟周圍的大小關係又可以分爲5個不同種類

①如果a<c且b<c,則將像素c劃分爲種類1。

②如果c<a且c==b或者c=a且c<b,則將像素c劃分爲種類2。

③如果c>a且c==b或者c==a且c> b,則將像素c劃分爲種類3。

④如果c>a且c>b,則將像素c劃分爲種類4。

⑤如果不屬於以上4種情況,則將像素c劃分爲種類0。

    像素所處的種類 決定了像素的補償值匹配。種類1和種類2的補償值大於等於0,種類3和種類4的補償值小於等於0。對於邊界補償來講,只需要傳送補償值的絕對值,解碼器根據像素補償種類即可判斷出它的符號。

2.2 邊帶補償(BO)

    邊界補償根據重構後的像素值進行分類,總共分成32類 也就是32個邊帶。 比如說8bit,其像素值範圍爲0-255。每個邊帶有8個像素。同一個邊帶範圍內的像素使用相同的補償值。 一般情況下,在一定的圖像區域內,像素值的波動範圍很小,一個CTB中的大多數像素屬於少數幾個邊帶。H.265/HEVC 標準規定一個CTB只能選擇4條連續的邊帶,並只對屬於這4個邊帶的像素進行補償。 選擇哪4條邊帶可以通過率失真優化方法確定,然後將最小邊帶號以及4個補償值傳至解碼端。

2.3 參數融合

    參數融合 也就是對於一個CTB塊,其sao參數使用的是相鄰的sao參數,編碼時只需要傳遞 使用了哪個sao即可。如下C爲當前塊,AB爲鄰近塊,C可以使用A或者B塊的sao參數。

 

三、 sao相關的語法元素

  • ctu級語法元素

(1) sao_merge_left_flag。

    該語法元素代表當前CTU塊的SAO參數信息是否與左側相鄰塊進行了融合,取值爲0或1。

    當等於1時,表示當前CTU塊的SAO信息,即語法元素sao _type_ idx_luma, sao_ type_idx_chroma, sao_band_position, sao_eo_class_luma, sao_eo_class_chroma, sao_offset_abs 以及sao_offset_sign的值是根據左側CTU塊的相應語法元素得到的;

    當該值等於0時,表示以上構成SAO信息的語法元素的值不是從左側CTU得到的。其默認值爲0。

(2) sao_merge_up_flag

      跟上面的參數類似,但是這裏是跟上面的元素merge。

(3) sao_type_idx_luma。

 該語法元素代表亮度分量的補償類型

數組SaoTypeIdx[cIdx][rx][ry]表示色彩分量爲cldx且位置爲(rx,ry)處的CTB塊的補償類型.

該變量取值爲0時,表示不補償;

該變量取值爲1時,表示邊帶補償;

該變量取值爲2時,表示邊界補償。

亮度分量的補償類型,即數組SaoTypeIdx[0][rx][ry]的值由以下步驟得到。

如果sao_type_idx_luma 存在,則將其賦給SaoTypeIdx[0][rx][ry]。

否則,進行以下步驟。

若sao_merge_left_flag=1,則將SaoTypeIdx[0][rx- 1][ry] 的值賦給SaoTypeIdx[0][rx][ry]。

若sao_merge_ up_ flag=1, 則將SaoTypeIdx[0][rx][ry-1]的值賦給SaoTypeIdx[0][rx][ry]。

否則,將SaoTypeldx[0][rx][ry]設置爲0。

(4) sao_type_ idx_chroma。

該語法元素代表色度分量的補償類型

色度分量的補償類型,即數組SaoTypeIdx[cIdx][x][ry]的值(cIdx=1,2) 由以下步驟得到。

如果sao_ type_ idx_ chroma 存在,則將其賦給SaoTypeIdx[cIdx][x][ry]。

否則,進行以下步驟。

若sao_ merge_ left_ flag=1,則將SaoTypeIdx[0][rx - 1][ry]的值賦給SaoTypeIdx[cIdx][rx][ry]。

若sao_ merge_ up_ flag=1, 將SaoTypeIdx[0][rx][ry-1]的值賦給SaoTypeIdx[cIdx][rx][ry]。

否則,將SaoTypeIdx[cIdx][rx][ry]設置爲0。

(5) sao_offset_ abs[cIdx][rx][ry][i].

該語法元素表示色彩分量爲Idx,位置爲(rx,ry)的 CTB,它的第i個種類的補償值

當其不存在時,通過以下步驟得到。

若sao_merge_ left_flag=1,將sao_ offtset_ abs[cIdx][rx- -1][ry][i]的值賦給sao_ offset _abs[cIdx][rx][ry][i]。

若sao_ merge_ up_ flag=1, 則將sao_ offset_ abs[cIdx][rx][ry-1][i]

的值賦給sao_ offset_ _abs[cIdx][rx][ry][i]。

否則,將其設爲0。

(6)sao_ offset_ sign[cIdx][rx][ry][i]。

當SaoTypeIdx[cIdx][rx][ry]=1, 即邊帶補償時,該值代表了色彩分量爲Idx,位置爲(rx,ry)的CTB,它的第i個補償值的符號

當該值不存在時 跟前面類似可以通過上面或者左邊的值得到。

(7) sao_band_ position[cIdx][rx][ry]。

該語法元素代表了進行邊帶補償的最小邊帶位置。當該值不存在時 跟前面類似可以通過上面或者左邊的值得到。

(8) sao_eo_class_luma

該語法元素代表了亮度分量的邊界補償模式

數組SaoEoClass[cIdx][rx][ry]表示了色彩分量爲cIdx, 在位置(rx,ry)處的CTB的補償類型。

SaoEoClass[0][rx][ry]通過以下步驟得到。如果sao_ eo_ _class_ luma 存在,則將其值賦給SaoEoClass[0][rx][ry]。

當該值不存在時 跟前面類似可以通過上面或者左邊的同樣的sao 參數值得到。

(9) sao_ eo_class_chroma。

    該語法元素代表了色度分量的邊界補償模式。SaoEoClass[cIdx][rx][ry]的值(cIdx=1 ,2)通過以下步驟得到。

如果sao_ eo_ class_chroma 存在,則將其值賦給SaoEoClass[cIdx][rx][ry]。

當該值不存在時 跟前面類似可以通過上面或者左邊的同樣的sao 參數值得到。

  • SPS級SAO語義

sample_adaptive_offset_ enabled_ flag: 

該語法元素標識是否採用SAO補償技術。當該值取1時,表示使用;該值取0時,表示不使用。

  • PPS級SAO語義

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

pps_loop_filter_across_slices _enabled_flag: 該語法元素用於標識在Slice的左邊界以及上邊界處是否執行環路濾波操作。當取值爲1時,表示執行;取值爲0時,表示不執行。

slice_sao_ uma_ flag: 該語法元素標識當前Slice的亮度分量是否允許進行SAO操作。當取值爲1時,表示允許進行SAO;取值爲0時,表示不允許進行SAO。當該語法元素未出現時,默認其值爲0。

slice_sao_ chroma flag: 該語法元素標識當前Slice的色度分量是否允許進行SAO操作。當取值爲1時,表示允許進行SAO;取值爲0時,表示不允許進行SAO。當該語法元素未出現時,默認其值爲0。

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

四、總結

    sao相對於deblock 模塊來說相對簡單。首先它是作用與重構後的圖像 在 去塊濾波之後,它處理的基本單位是ctu。sao實際可以分爲 三種類型的補償方式,具體採用哪種方式 編碼器用的是率失真來進行選擇率失真可以說是貫穿整個編碼過程,許許多多的編碼參數都是這個決定的。

    sao如果是跟周圍的像素進行比較來分類的話 就是邊界補償 根據比較像素的方向 可以有4種模式,而每種模式中 跟周邊像素大小的不同又可以分爲5種方式,而需要補償的情況是其中的4種。

    sao如果是用自身像素值的分類的話就是邊帶補償,不同像素深度是8還是10比特,都是按照像素的範圍固定的分爲32個邊帶。

而在一個ctu內部只補償4連續4個邊帶裏面的像素,其他就不補償了。

    sao最後一種方式 有點類似於像素的幀內預測,用的是周邊ctu的sao參數直接預測出當前ctu的sao參數。

    總的來說 sao在編碼端是要了解如何運用率失真來決策補償模式,然後具體某個模式需要傳輸什麼信息到解碼端。而解碼端呢,需要了解編碼端傳輸過來的各種參數的意義。

 

 

 

 

 

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