H.265 SAO技术
原博文地址:http://blog.sina.com.cn/s/blog_80ce3a5501012r4t.html
SAO : Sample adaptive offset
這是目前H265中比較熱門的技術(shù),根據(jù)以前的測試,SAO性價比遠(yuǎn)遠(yuǎn)超過Deblock和ALF.
?
paper: Sample Adaptive Offset for HEVC
???????????????????????????1.??SAO在流程中的位置和歷史:
????
從流程中可以看到,SAO和ALF是loop內(nèi)的操作,接在Deblocking filter的后面,輸入包括原始的YUV圖像和Deblocking的輸出,最后產(chǎn)生部分需要參數(shù)需要entropy進(jìn)行編碼。ALF是類似的。
????
Decoder端:
??
SAO原始的思想來自于Samsung的提案JCTVC-A124。可以參考這個文檔獲得詳細(xì)的信息。在三星的提案中提出了比較復(fù)雜的BDC(Band - correction, 位于ALF和DPB之間)和EXC(extreme-value correction,位于Deblocking he ALF之間,也就是現(xiàn)在SAO的位置),BDC和EXC都是對pixel進(jìn)行分類,然后為每一個分類分配一個offset值。這個offset就是在 entropy中要編碼的參數(shù)。不同的是,BDC使用的是pixel的intensity(Luma值)來對pixel進(jìn)行分類;而EXC使用的模板中心 pixel和neibor pixel之間的梯度來進(jìn)行的分類(edge特性).
?
使用經(jīng)過BDC/EXC處理后的參考幀,能夠取得更好的壓縮率,但是因為BDC/EXC太復(fù)雜,因此沒有被H265采用。
但是基于BDC/EXC提出的SAO(JCTVC-BO77/C147/D122/E049)最后被采用了。
?
在原始的提案中SAO分為LUMA SAO和CHROMA SAO(JCTVC-F056)。
?
SAO的offset包含BO(Band offset)和EO(Edge offset)。
?
SAO采用了不同于BDC/EXC的pixel分類的方法,降低了復(fù)雜度。
?
???????????????????????2. SAO算法提出的理論基礎(chǔ)
?
在對SAO算法分析之前,需要對三星的BDC/EXC的算法進(jìn)行了解,參考JCTVC-A124文檔。
第一次提出了幾個概念:
?CU : Coding Unit,可以是16x16,32x32,64x64,128x128。然而,CU 的size可以不是固定的,而是可以變化的,在SPS中定義了LCU/SCU來限制CU size的變化范圍。(必須是正方形)
??sps->log2_min_coding_block_size_minus3???(SCU)
??sps->log2_diff_max_min_coding_block_size (LCU)
?
可以把一個picture劃分成LCU的集合,在每一個LCU中再進(jìn)行CU的劃分(CU hierarchy Depth). Hierarchy 的層次決定了可以出現(xiàn)的CU的size的數(shù)目: 比如
???LCU = 128X128, MAX_hierarchy_depth = 5
那么CU可以出現(xiàn)的size只有5種,為:
???128x128(LCU), 64x64, 32x32 , 16x16, 8x8(SCU)
?
?
在一個LCU中可以包含INTER CU和INTRA CU,因此CU才是等同于MB。 LCU只是一個概念上的值,在編碼上還是以CU為單位。
?
?PU:??Prediction Unit,是prediction時使用的size,包括intra prediction/inter prediciton類似于H264中的partition。
TU:??transform Unit, DCT transform時使用的unit,比如DCT4X4/8X8/16X16/32X32/64X64,可以包含一個或者多個PU。更大的DCT size有利用處理超分辨率的圖像。
?
其實在H264的時候,也有這些概念,只不過
??CU -> MB
??PU -> PARTITION
??TU -> DCT4X4/8X8
在H265中提供了更大的size的選擇。這也是為了支持超分辨率的圖像的原因。
?
????????????????3. H265 draft SAO 算法
通過PSNR的計算公式可以看到,重構(gòu)數(shù)據(jù)和原始YUV之間的差的平方和是決定PSNR的因素。SAO通過分析deblocking后的數(shù)據(jù)和原始YUV之間的關(guān)系來對deblock后的數(shù)據(jù)進(jìn)行delta操作,使得盡量接近原始YUV,達(dá)到提高PSNR的目的。
一個最基本的想法就是把deblock的重構(gòu)數(shù)據(jù)和原始YUV中每一個相同位置的pixel做差值,把這個差值傳給decoder,這樣可以完全恢復(fù)原始 YUV.但是這實際上是不現(xiàn)實的,如果每一個pixel都傳輸一個offset,這會導(dǎo)致碼率會非常的高,達(dá)不到壓縮的效果。(如同DPCM)
H265在碼率和PSNR之間做了一個tradeoff,以較小的碼率增加來提高PSNR。下面就看H265是怎么做的。
?
H265是基于CTB來做SAO。通過分析deblock重構(gòu)pixel和原始輸入YUV之間的關(guān)系將pixel分成了三種SAO模式:
??????
如上表中可以看到,可以不做SAO/Band offset/edge offset 三個mode。
EdgeOffset mode:
在這種模式下,SAO首先需要為該CTB選擇使用哪一種梯度模式,水平/垂直/45度/135度。這是用sao_eo_class來表示。
??????????
當(dāng)為某個CTB選擇使用了上面某種梯度模式后,開始計算該CTB中的當(dāng)前sample P和相鄰2個pixel之間的關(guān)系,用edgeIdx表示:
?????
因為edgeIdx的計算是針對deblocking以后的重構(gòu)圖像進(jìn)行的,encoder和decoder使用相同的方法來計算,因此不需要傳輸這個信息給decoder,而是可以由decoder自己來計算,這樣雖然增加了計算量,但是可以降低碼率。
對于edgeIdx 為0的flat area,可以不需要做任何操作。對于1~4,SAO為每一個edgeIdx分配了一個offset,這個offset會add到重構(gòu)像素中。因為SAO不是為每一個pixel分配一個offset,而是先把pixel進(jìn)行梯度的計算,并且做edgeIdx的分類,對每一個edgeIdx類分配一個offset(對每一個CTB有4個offset就足夠),這樣可以減少碼率的消耗。另外,為了進(jìn)一步降低碼率,H265 SAO規(guī)定對于edgeIdx=1,2這兩種情況下,offset值必須是正數(shù);對于edgeIdx=3,4時,offset必須是負(fù)數(shù)。通過這種強行的要求,符號位可以不進(jìn)行編碼。
?
Bandoff Mode:
SAO encoder把有效的YUV取值范圍(0-255 fullRange, 16-235 BT601/709) 平均分為32個band(如下圖,如果是0-255,就是每一個band的范圍是8,一共分成32個band),通過某些算法來選擇其中連續(xù)的4個band進(jìn)行補償,當(dāng)CTB中的sample的Luma/Chroma處于這4個選定的band中時,需要對這個sample進(jìn)行補償(把該band相關(guān)的offset值加到sample的值上)。
???????????????????
encoder端如何選擇4個band:
從上面這個圖中可以看到這個原理:在encoder端會統(tǒng)計當(dāng)前CTB中的sample的Luma/chroma值,做32band的直方圖統(tǒng)計,每一個band中包含的該YUV中的sample求均值,下面舉個例子:
比如假設(shè)有一個band是31-38,假設(shè)該CTB中有3個pixel的值在這個band中,分別為:
???????????????32
???????????????34
???????????????36
這樣可以知道原始YUV該CTB中的sample出現(xiàn)在這個band中的均值為(32+34+36)/3= 34;
對deblock后的重構(gòu)圖像同樣做這樣的處理,也求出該band中的均值,假設(shè)為32.
那么可見,deblocking后的重構(gòu)YUV和原始YUV在該CTB上,并且該band上有均值上的差值為34-32=+2. SAO因此可以分配band offset=+2 到這個band上,在decoder端,為每一個處于該band上的deblocking后的sample值加上2,這樣可以保證在該band上出現(xiàn)的重構(gòu)pixel和原始YUV上的該CTB的該band上的均值是相等的。
?
對32個band都做這樣的處理,最后選擇連續(xù)4個,offset值最大的band作為最終確定的需要補償?shù)腷and。并且起始band值和4個band offset值寫到碼流中傳輸給decoder。 通過這種band offset的方式,可以把均值差別最大的4個band補償成均值相等,來拉近原始YUV和重構(gòu)圖像之間的差值。
?
一個問題:為什么band offset 模式中只是選擇4個連續(xù)的band?
標(biāo)準(zhǔn)給出的答案是:
1. 在flat area部分,大部分的pixel的取值應(yīng)該會集中在很少的幾個band中,因此使用連續(xù)的4個band能夠覆蓋大部分的pixel。(也就是說如果對flat area的某一個CTB做直方圖的話,這個pixel會很集中在很少的幾個取值點,因此使用4個連續(xù)band可以很好的覆蓋.
2. 因為edge offset模式使用了4個offset值,為了不增加碼率,band offset也復(fù)用了這4個offset值的syntax,這樣不需要另外再增加syntax來專門表示band offset。
?
?
?
附錄上H265語法來表示上面的信息:
?????
從上面的語法中可以看到,對于edgeoffset模式,提供sao_eo_class_luma/chroma的值來選擇使用什么模式的梯度。并且為1-5這4種edgeIdx提供了offset值,一共4個offset。沒有符號位提供。
對于band offset 模式,提供了sao_band_position來表示4個連續(xù)band的起始band是哪一個。并且為這4個band分別提供了band offset值,并且提供了符號位。
?
另外,如果當(dāng)前CTB的SAO參數(shù)和左邊或者上面的CTB的SAO參數(shù)相同,那么也就不需要為當(dāng)前CTB再傳輸SAO參數(shù)了,而是直接使用左邊CTB或者TOP CTB中的SAO參數(shù)即可。這樣可以進(jìn)一步降低碼率。這就是sao_merge_left_flag/sao_merge_up_flag的作用。需要注意的是因為H265引入了TILE/SLICE結(jié)構(gòu),而tile是并行處理的,另外也不能跨SLICE,因此當(dāng)前CTB只有和left/TOP CTB處于同一個tile/SLICE時才能共享SAO參數(shù)。
?
?
總結(jié): SAO是一在deblocking后的一個后處理步驟,會影響到inter prediction的參考幀值。SAO是對重構(gòu)像素進(jìn)行了PSNR提升的一個重要步驟,直接對luma/chroma值進(jìn)行非線性操作。H265 SAO做的tradeoff就是首先對CTB中的pixel進(jìn)行分類,再對每一個類別分別進(jìn)行處理,這樣避免了對每一個pixel直接進(jìn)行處理帶來的高碼率的代價,從而轉(zhuǎn)換成了對分類后的類進(jìn)行的處理,而分類的類別的數(shù)目是比較少的,對于band offset和edge offset都是4個類別。因此只是需要提供4個offset值就足夠。
總結(jié)
以上是生活随笔為你收集整理的H.265 SAO技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java程序员面试题大全含答案(2018
- 下一篇: 台电p10hd拆解_台电X19HD玩家拆