HEVC中的样点自适应补偿——Sample Adaptive Offset (SAO)
為什么需要SAO
當變化塊尺寸較大時,容易出現振鈴效應,SAO就是用來削弱這種效應的。
SAO首先利用分類器將樣點分類,然后根據類別對樣點值加上一個偏移值。
樣點的類別下標以及偏移值會被編碼到碼流中。
HEVC中有兩種SAO type,edge offset(EO) 和 band offset(BO),其中EO是根據樣點值與周圍樣點值的關系來分類,而BO是根據樣點本身的值來分類。
HEVC中以CTU為單位進行SAO,不同的CTU可以使用相同的SAO參數(也就是region merging),一個CTU包含的色度CTB共享SAO type,但是可以有不同的偏移值。
Edge Offset(EO)
上圖表示的是編碼中的振鈴效應,橫軸表示像素坐標,縱軸表示像素值,虛線代表實際值,實線代表編碼后的結果。可以看到,原本應該是邊緣的地方現在卻出現了波動。
那么怎么去除這種效應呢,很直觀的想法就是對樣點加上一個偏移值,讓虛線靠近實線,如對波峰處的樣點加上負的偏移,對波谷處的樣點加上正的偏移值。
EO有四種分類器,如下圖:
其中c代表當前樣點,a和b是其相鄰樣點,如果一個CTB是EO類型,那么它會在這四種分類器中選擇一個(根據RDO),并將下標進行編碼。
當一個CTB在上面四種分類器選擇某種方向的分類器后,該CTB里的所有樣點會根據相鄰樣點的情況被分為5類,分類規則如下表:
其中1到4類是需要進行偏移補償的情況,如下圖所示:
可以看到類別1和2需要正偏移補償,3和4需要負的偏移補償,這樣才會使得圖像更平滑,消除振鈴。
上面四種情形分別對應一種特定的偏移量,在編碼時只需要對偏移量的絕對值進行編碼,而偏移的正負可以通過類別的序號隱式獲得。
總結一下EO時需要傳輸的語法元素:首先是CTB使用EO的標志(色度分量可以共享一個標志),然后對每個CTB而言,要傳方向分類器的下標,以及對應的四個類別的偏移絕對值。
Band Offset(BO)
BO的示意圖如下:
橫坐標是樣點的位置,縱軸是樣點值,虛線是真實像素值,實線是編碼出來的像素值。可以看到,編碼結果與真實值存在著一定的偏差,從圖中看,將實現往下移一段距離可以減小這種偏差。BO就是將樣點值分為不同的band,然后對不同的band偏移不同的值來削弱振鈴效應。
一個CTU如果SAO type是BO,那么首先樣點會根據樣點值被分為32個等間距的band,對于常見的8bit像素(0-255),每個band的寬度就是8。對于CTB里面的樣點,每個樣點都會屬于一個特定的區間。在HEVC里面,只會選取4個相鄰的band進行補償。因為一個CTB里面的樣點值的范圍一般都是比較小的。
如下圖所示:
4個相鄰的band是通過最小的band下標來表示的。如上圖,只需要編碼下標k,就可以知道是band k, k+1,k+2,k+3這范圍內的樣點值需要補償。
假如現在通過RDO選擇k為1,那么需要補償的范圍就是像素值為8到39的樣點。對于每個band,補償的偏移不同,可正可負,即最終還要傳輸四個band對應的偏移值。而對CTB中像素值處于某個band所表示范圍的樣點而言,都需要加上對應的偏移值作為SAO之后的值。
SAO merge
在低延時應用中,不同的CTU可以使用相同的SAO參數,這樣可以降低復雜度。一個CTU可以使用其上方或者左方相鄰的CTU的SAO參數。主要是通過sao_merge_left_flag和sao_merge_above_flag來表示的。
SAO相關的語法元素
SPS里會有sample_adaptive_offset_enabled_flag,來表示當前序列是否使用SAO
Slice Header里面會有slice_sao_luma_flag和slice_sao_chroma_flag,來表示當前Slice不同亮度和色度的SAO是否使用
CTU的開始會編碼sao_merge_left_flag和sao_merge_above_flag,如果使用merge,則三個分量都使用merge
如果CTU沒有SAO 參數 merge,那么就會編碼新的SAO參數,如下圖:
首先是亮度分量的SAO type,
- 要么是EO,BO或者是不進行SAO,
- EO則編碼offset絕對值和EO的類別(就是哪個方向的分類器),BO則編碼offset的值和band的起始位置
接下來就是亮度和色度,它們共享SAO type,如果是EO,還共享EO的類別,BO則不共享band的起始位置
總結
以上是生活随笔為你收集整理的HEVC中的样点自适应补偿——Sample Adaptive Offset (SAO)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 织梦采集侠采集问题
- 下一篇: php递归函数理解,详解php递归函数