日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

H.265 SAO技术

發布時間:2024/8/1 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H.265 SAO技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近開始研究hevc的sao技術,看到一篇非常好的博文,適合初學者,轉載到此以便以后查閱。
原博文地址:http://blog.sina.com.cn/s/blog_80ce3a5501012r4t.html

SAO : Sample adaptive offset

這是目前H265中比較熱門的技術,根據以前的測試,SAO性價比遠遠超過Deblock和ALF.

?

paper: Sample Adaptive Offset for HEVC

???????????????????????????1.??SAO在流程中的位置和歷史:

????

從流程中可以看到,SAO和ALF是loop內的操作,接在Deblocking filter的后面,輸入包括原始的YUV圖像和Deblocking的輸出,最后產生部分需要參數需要entropy進行編碼。ALF是類似的。

????
Decoder端:

??


SAO原始的思想來自于Samsung的提案JCTVC-A124。可以參考這個文檔獲得詳細的信息。在三星的提案中提出了比較復雜的BDC(Band - correction, 位于ALF和DPB之間)和EXC(extreme-value correction,位于Deblocking he ALF之間,也就是現在SAO的位置),BDC和EXC都是對pixel進行分類,然后為每一個分類分配一個offset值。這個offset就是在 entropy中要編碼的參數。不同的是,BDC使用的是pixel的intensity(Luma值)來對pixel進行分類;而EXC使用的模板中心 pixel和neibor pixel之間的梯度來進行的分類(edge特性).

?

使用經過BDC/EXC處理后的參考幀,能夠取得更好的壓縮率,但是因為BDC/EXC太復雜,因此沒有被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分類的方法,降低了復雜度。

?

???????????????????????2. SAO算法提出的理論基礎

?

在對SAO算法分析之前,需要對三星的BDC/EXC的算法進行了解,參考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中再進行CU的劃分(CU hierarchy Depth). Hierarchy 的層次決定了可以出現的CU的size的數目: 比如

???LCU = 128X128, MAX_hierarchy_depth = 5

那么CU可以出現的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的計算公式可以看到,重構數據和原始YUV之間的差的平方和是決定PSNR的因素。SAO通過分析deblocking后的數據和原始YUV之間的關系來對deblock后的數據進行delta操作,使得盡量接近原始YUV,達到提高PSNR的目的。

一個最基本的想法就是把deblock的重構數據和原始YUV中每一個相同位置的pixel做差值,把這個差值傳給decoder,這樣可以完全恢復原始 YUV.但是這實際上是不現實的,如果每一個pixel都傳輸一個offset,這會導致碼率會非常的高,達不到壓縮的效果。(如同DPCM)

H265在碼率和PSNR之間做了一個tradeoff,以較小的碼率增加來提高PSNR。下面就看H265是怎么做的。

?

H265是基于CTB來做SAO。通過分析deblock重構pixel和原始輸入YUV之間的關系將pixel分成了三種SAO模式:

??????

如上表中可以看到,可以不做SAO/Band offset/edge offset 三個mode。

EdgeOffset mode:

在這種模式下,SAO首先需要為該CTB選擇使用哪一種梯度模式,水平/垂直/45度/135度。這是用sao_eo_class來表示。

??????????

當為某個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必須是負數。通過這種強行的要求,符號位可以不進行編碼。

?

Bandoff Mode:

SAO encoder把有效的YUV取值范圍(0-255 fullRange, 16-235 BT601/709) 平均分為32個band(如下圖,如果是0-255,就是每一個band的范圍是8,一共分成32個band),通過某些算法來選擇其中連續的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。

?

?

?

附錄上H265語法來表示上面的信息:

?????

從上面的語法中可以看到,對于edgeoffset模式,提供sao_eo_class_luma/chroma的值來選擇使用什么模式的梯度。并且為1-5這4種edgeIdx提供了offset值,一共4個offset。沒有符號位提供。

對于band offset 模式,提供了sao_band_position來表示4個連續band的起始band是哪一個。并且為這4個band分別提供了band offset值,并且提供了符號位。

?

另外,如果當前CTB的SAO參數和左邊或者上面的CTB的SAO參數相同,那么也就不需要為當前CTB再傳輸SAO參數了,而是直接使用左邊CTB或者TOP CTB中的SAO參數即可。這樣可以進一步降低碼率。這就是sao_merge_left_flag/sao_merge_up_flag的作用。需要注意的是因為H265引入了TILE/SLICE結構,而tile是并行處理的,另外也不能跨SLICE,因此當前CTB只有和left/TOP CTB處于同一個tile/SLICE時才能共享SAO參數。

?

?

總結: SAO是一在deblocking后的一個后處理步驟,會影響到inter prediction的參考幀值。SAO是對重構像素進行了PSNR提升的一個重要步驟,直接對luma/chroma值進行非線性操作。H265 SAO做的tradeoff就是首先對CTB中的pixel進行分類,再對每一個類別分別進行處理,這樣避免了對每一個pixel直接進行處理帶來的高碼率的代價,從而轉換成了對分類后的類進行的處理,而分類的類別的數目是比較少的,對于band offset和edge offset都是4個類別。因此只是需要提供4個offset值就足夠。

總結

以上是生活随笔為你收集整理的H.265 SAO技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。