HEVC中SAO 自適應樣點補償 詳細分析解讀

2021-06-11 14:56:13 字數 3265 閱讀 8823

hevc

中sao--自適應樣點補償:

本文分三個部分, 1.sample adaptive offset原理, 2.sao處理流程分析, 3.sao意義何在!

a)  

sao原理:

sao是在db之後進行, 輸入是重建幀和原始幀資料, 輸出是sao資料和sao後的重建幀. 自適應樣點補償是乙個自適應選擇過程,在去塊濾波後進行。

下面是整個hevc的編碼框圖, 可以看到sao是在整個幀編碼完成後得到重建幀後進行的,屬於slice級別(幀級).

首先把frame劃分為若干lcu, 然後對每個lcu中每個畫素進行sao操作.將根據其lcu畫素特徵選擇一種畫素補償方式,以減少源影象與重構影象之間的失真。自適應樣點補償方式分為帶狀補償(band offset,bo)和邊緣補償(edge offset,eo)兩大類。

帶狀補償將畫素值強度等級劃分為若干個條帶,每個條帶內的畫素擁有相同的補償值。進行補償時根據重構畫素點所處的條帶,選擇相應的帶狀補償值進行補償。

邊緣補償主要用於對影象的輪廓進行補償。它將當前畫素點值與相鄰的2個畫素值進行對比,用於比較的2個相鄰畫素可以在下圖中所示的4種模板中選擇,從而得到該畫素點的型別。解碼端根據碼流中標示的畫素點的型別資訊進行相應的補償校正。

對每個模板還要確定屬於那種型別,型別確定有下面**來決定.

sao處理流程分析:

sao主函式**結構如下:主要有3個函式完成所有操作.

void tencsampleadaptiveoffset::saoprocess()

} 其中tencsampleadaptiveoffset::rdosaounitall

函式完成對整個frame的所有lcu的yuv進行reset stats和calcsaostatscu,以及saocomponentparamdist得到最佳sao_type選擇.最後encodesaooffset.

void tencsampleadaptiveoffset::rdosaounitall() }

} 下面是子函式的說明:

也就是tencsampleadaptiveoffset::calcsaostatscuorg

主要是得到lcu中所有畫素各種saotype的所有資訊和狀態統計,

分析記錄各種saotype(sao_eo_0,sao_eo_1,sao_eo_2,sao_eo_3,sao_bo)

以及各種saotypelen和yuv分量對應的m_ioffsetorg和m_icount.

istats = m_ioffsetorg[0.1.2][0.1.2.3.4]; //yuv and sa0_type

icount = m_icount[0.1.2][ 0.1.2.3.4];

如果是bo,通過iclassidx =m_lumatablebo[prec[x]];來確定屬於那個條帶,並記錄istats[iclassidx] += (porg[x] - prec[x]);icount[iclassidx]++;這裡iclassidx

大小為0~32.

如果是eo, 通過iclassidx =m_auieotable[uiedgetype]來確定模板型別,並記錄istats[iclassidx] += (porg[x] -prec[x]);icount[iclassidx]++;

這裡iclassidx

大小為0~4.

其中對映關係如下:就是查表對映.

const uint tcomsampleadaptiveoffset::m_auieotable[9] = ;

隨後函式tencsampleadaptiveoffset::saocomponentparamdist

完成最佳saotype的選擇. 得到最佳dcostpartbest和typeidx等資訊.

下面兩個語句得到每個bo帶或者eo種類的offset.

m_ioffset[compidx][typeidx][classidx] = m_ioffsetorg[compidx][typeidx][classidx]/(m_icount[compidx][typeidx][classidx];

m_ioffset[compidx][typeidx][classidx] = clip3(-m_ioffsetth+1, m_ioffsetth-1, (int)m_ioffset[compidx][typeidx][classidx]);

m_ioffset[compidx][typeidx][classidx] = estiteroffset();

最後通過比較得到最佳dcostpartbest和typeidx.

if(m_dcost[ycbcr][typeidx] < dcostpartbest)

同樣tencsampleadaptiveoffset::sao2chromaparamdist完成色度的選擇.

tencsampleadaptiveoffset::saoprocess()

中的函式processsaounitall主要完成sao解碼的操作,也就是對重建幀進行saooffset疊加.

另外乙個同名函式saoprocess屬於com庫,主要是解碼使用,也就呼叫processsaounitall為主,負責恢復sao偏移量.

void tcomsampleadaptiveoffset::saoprocess(tcompic* pcpic, saoparam* pcsaoparam)

if(pcsaoparam->bsaoflag[1])}}

a)  

sao--自適應樣點補償意義何在:

sao意義:大量模擬測試和資料顯示, sao平均可以節約2%到6%的位元速率, 而編譯碼的複雜度只增加2%左右!sao主要目的和操作原理減少源影象與重構影象之間的失真。如果只看這點,實際上每幀編碼後的位元速率反而會增加,因為多了sao的相關語法和語義以及補償值的編碼!其實不然,雖然當前幀的位元速率增加了幾個位元組或者幾個bit, 但是這點增加碼字使得源影象與重構影象的失真減少,使接下來的**殘差更小了,從而大大的降低位元速率了!

我在想是否可以增加乙個無損編碼的hevc版本呢? 增加另外一些語法和語義,把源影象與重構影象之間的失真單獨拿出來再次採用其它無損編碼技術編碼,如果在需要超清晰的影象時,就可以和這個無損編碼的碼流組合解碼,重建無損影象.個人隨想!大家也可以發表下觀點啊!

HEVC中SAO 自適應樣點補償 詳細分析解讀

from hevc 中sao 自適應樣點補償 本文分三個部分,1.sample adaptive offset原理,2.sao處理流程分析,3.sao意義何在 a sao原理 sao是在db之後進行,輸入是重建幀和原始幀資料,輸出是sao資料和sao後的重建幀.自適應樣點補償是乙個自適應選擇過程,在...

HEVC中SAO 自適應樣點補償 詳細分析解讀

hevc 中sao 自適應樣點補償 本文分三個部分,1.sample adaptive offset原理,2.sao處理流程分析,3.sao意義何在 a sao原理 sao是在db之後進行,輸入是重建幀和原始幀資料,輸出是sao資料和sao後的重建幀.自適應樣點補償是乙個自適應選擇過程,在去塊濾波後...

網格自適應 Abaqus中的ALE自適應網格技術

ale 自適應網格主要用於 abaqus explicit 的大變形分析,以及 abaqus standard 中的聲疇 acoustic domain 沖蝕 ablation 和磨損問題。在 abaqus standard 的大變形分析中,儘管也可以設定 ale 自適應網格,但不會起到明顯的作用。...