1. 程式人生 > >H.265---樣點自適應補償(SAO)技術

H.265---樣點自適應補償(SAO)技術

轉自:https://blog.csdn.net/chenzongduozhu/article/details/62891475

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)邊界補償

邊界補償通過比較當前畫素和相鄰畫素的大小對當前畫素分類。相鄰畫素的位置分為四種模式:水平、垂直、左上、右上:

 

當為某個CTB選擇使用了上面某種梯度模式後,開始計算該CTB中的當前sample P和相鄰2個pixel之間的關係,用edgeIdx表示:

 

因為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,但是這點增加碼字使得源影象與重構影象的失真減少,使接下來的預測殘差更小了,從而大大的降低位元速率了!