样点自适应补偿(SAO)技术
SAO : Sample adaptive offset
這是目前H265中比較熱門的技術,根據以前的測試,SAO性價比遠遠超過Deblock和ALF 。
1、 SAO的概念
在圖像中像素值劇烈變化的邊界區,經過編碼-解碼重建之后通常會出現波紋狀的失真現象,這種失真稱作振鈴效應。振鈴效應產生的根本原因在于邊界區高頻分量在編碼過程中丟失。為了減少高頻分量的損失,同時不降低編碼的效率,HEVC引入了SAO技術,從像素域入手對振鈴區域進行補償。
SAO在流程中的位置,encoder端:
decoder端:
2、基本原理
SAO對重建圖像在deblocking之后操作,操作對象為重建完成的一幀,以一個CTB為一個基本單位。SAO所采用的方式主要有三類:邊界補償(BO)、邊帶補償(EO)和參數融合(Merge)。
通過PSNR的計算公式可以看到,重構數據和原始YUV之間的差的平方和是決定PSNR的因素。SAO通過分析deblocking后的數據和原始YUV之間的關系來對deblock后的數據進行delta操作,使得盡量接近原始YUV,達到提高PSNR的目的。
一個最基本的想法就是把deblock的重構數據和原始YUV中每一個相同位置的pixel做差值,把這個差值傳給decoder,這樣可以完全恢復原始 YUV.但是這實際上是不現實的,如果每一個pixel都傳輸一個offset,這會導致碼率會非常的高,達不到壓縮的效果。(如同DPCM)
H265在碼率和PSNR之間做了一個tradeoff,以較小的碼率增加來提高PSNR。(1)邊界補償
邊界補償通過比較當前像素和相鄰像素的大小對當前像素分類。相鄰像素的位置分為四種模式:水平、垂直、左上、右上:
因為edgeIdx的計算是針對deblocking以后的重構圖像進行的,encoder和decoder使用相同的方法來計算,因此不需要傳輸這個信息給decoder,而是可以由decoder自己來計算,這樣雖然增加了計算量,但是可以降低碼率。
對于edgeIdx 為0的flat area,可以不需要做任何操作。對于1~4,SAO為每一個edgeIdx分配了一個offset,這個offset會add到重構像素中。因為SAO不是為每一個pixel分配一個offset,而是先把pixel進行梯度的計算,并且做edgeIdx的分類,對每一個edgeIdx類分配一個offset(對每一個CTB有4個offset就足夠),這樣可以減少碼率的消耗。另外,為了進一步降低碼率,H265 SAO規定對于edgeIdx=1,2這兩種情況下,offset值必須是正數;對于edgeIdx=3,4時,offset必須是負數。通過這種強行的要求,符號位可以不進行編碼。
(2)邊帶補償
帶狀補償將像素值強度等級劃分為若干個條帶,每個條帶內的像素擁有相同的補償值。進行補償時根據重構像素點所處的條帶,選擇相應的帶狀補償值進行補償。
SAOencoder把有效的YUV取值范圍(0-255 fullRange, 16-235 BT601/709) 平均分為32個band(如下圖,如果是0-255,就是每一個band的范圍是8,一共分成32個band),通過某些算法(可以通過RDO確定)來選擇其中連續的4個band進行補償,當CTB中的sample的Luma/Chroma處于這4個選定的band中時,需要對這個sample進行補償(把該band相關的offset值加到sample的值上)。
encoder端如何選擇4個band:
從上面這個圖中可以看到這個原理:在encoder端會統計當前CTB中的sample的Luma/chroma值,做32band的直方圖統計,每一個band中包含的該YUV中的sample求均值,下面舉個例子:
比如假設有一個band是31-38,假設該CTB中有3個pixel的值在這個band中,分別為:
32
34
36
這樣可以知道原始YUV該CTB中的sample出現在這個band中的均值為(32+34+36)/3= 34;
對deblock后的重構圖像同樣做這樣的處理,也求出該band中的均值,假設為32.
那么可見,deblocking后的重構YUV和原始YUV在該CTB上,并且該band上有均值上的差值為34-32=+2. SAO因此可以分配band offset=+2 到這個band上,在decoder端,為每一個處于該band上的deblocking后的sample值加上2,這樣可以保證在該band上出現的重構pixel和原始YUV上的該CTB的該band上的均值是相等的。
?
對32個band都做這樣的處理,最后選擇連續4個,offset值最大的band作為最終確定的需要補償的band。并且起始band值和4個band offset值寫到碼流中傳輸給decoder。通過這種band offset的方式,可以把均值差別最大的4個band補償成均值相等,來拉近原始YUV和重構圖像之間的差值。
?
一個問題:為什么band offset 模式中只是選擇4個連續的band?
標準給出的答案是:
1. 在flat area部分,大部分的pixel的取值應該會集中在很少的幾個band中,因此使用連續的4個band能夠覆蓋大部分的pixel。(也就是說如果對flat area的某一個CTB做直方圖的話,這個pixel會很集中在很少的幾個取值點,因此使用4個連續band可以很好的覆蓋.
2. 因為edge offset模式使用了4個offset值,為了不增加碼率,band offset也復用了這4個offset值的syntax,這樣不需要另外再增加syntax來專門表示band offset。
(3)參數融合
參數融合模式表示某一個CTB,其SAO的參數可以直接使用某個相鄰CTB的參數,只需要指定(標識,只需要傳送融合標志位即可)是哪個相鄰塊(左方還是上方)。這樣可以進一步降低碼率。需要注意的是因為H265引入了TILE/SLICE結構,而tile是并行處理的,另外也不能跨SLICE,因此當前CTB只有和left/TOP CTB處于同一個tile/SLICE時才能共享SAO參數。
需注意,在參數融合模式下,一個CTB的亮度CTB和色度CTB必須都采用融合相鄰塊(左或上)的參數。否則如果亮度和色度沒同時采用某相鄰塊的參數,則是非融合模式。采用非參數融合,即亮度和色度分量獨立根據自身像素值特點選擇劃分模式及補償值,在這種情況下兩個色度分量共用相同的劃分模式。
3、SAO的意義
SAO是一在deblocking后的一個后處理步驟,會影響到inter prediction的參考幀值。SAO是對重構像素進行了PSNR提升的一個重要步驟,直接對luma/chroma值進行非線性操作。H265 SAO做的tradeoff就是首先對CTB中的pixel進行分類,再對每一個類別分別進行處理,這樣避免了對每一個pixel直接進行處理帶來的高碼率的代價,從而轉換成了對分類后的類進行的處理,而分類的類別的數目是比較少的,對于band offset和edge offset都是4個類別。因此只是需要提供4個offset值就足夠。
大量模擬測試和資料顯示,SAO平均可以節約2%到6%的碼率,而編解碼的復雜度只增加2%左右!SAO主要目的和操作原理減少源圖像與重構圖像之間的失真。如果只看這點,實際上每幀編碼后的碼率反而會增加,因為多了SAO的相關語法和語義以及補償值的編碼!其實不然,雖然當前幀的碼率增加了幾個字節或者幾個bit,但是這點增加碼字使得源圖像與重構圖像的失真減少,使接下來的預測殘差更小了,從而大大的降低碼率了!總結
以上是生活随笔為你收集整理的样点自适应补偿(SAO)技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序流程图的基本画法大全
- 下一篇: SAO代码解析补充(二)