HEVC中的去方块滤波——Deblocking Filter
Deblocking Filter的作用
Deblocking與SAO都是HEVC中的環(huán)路濾波器,重建圖像會(huì)首先經(jīng)過Deblocking,再進(jìn)行SAO。Deblocking主要用來去除編碼的塊效應(yīng),SAO消除圖像的振鈴效應(yīng)。
塊效應(yīng)(block artifact)
我們知道現(xiàn)在的主流編碼器都是使用基于塊的混合編碼框架,以編碼塊為單位進(jìn)行預(yù)測、變換、量化。
這就導(dǎo)致不同的編碼塊會(huì)使用不同的編碼參數(shù),進(jìn)而不同編碼重建塊之間的存在一定的差異,尤其在編碼塊邊界處較為明顯。
編碼塊邊界處不連續(xù)的現(xiàn)象就是塊效應(yīng)。
這種現(xiàn)象在QP較大時(shí)比較明顯,因此QP越大Deblocking的強(qiáng)度也越大。塊效應(yīng)如下圖所示:
濾波邊界判決
濾波位置
在HEVC中,濾波只對(duì)橫坐標(biāo)或縱坐標(biāo)位于8像素的整數(shù)倍處的邊界進(jìn)行,所謂邊界即是CU、PU或TU的交界處。
濾波順序
在一幅圖像中,首先對(duì)豎直的邊界進(jìn)行濾波,之后在對(duì)水平的邊界進(jìn)行。如下圖:
圖中每個(gè)網(wǎng)格大小都是8x8,首先會(huì)從左至右進(jìn)行實(shí)線邊界的濾波(如果是邊界的話),接下來會(huì)從上至下進(jìn)行虛線邊界的濾波(如果是邊界)。
在HEVC中,豎直的邊界之間濾波互不影響,因此可以同時(shí)進(jìn)行。對(duì)于水平邊界同理。
邊界強(qiáng)度(Boundary strength, Bs)
一個(gè)邊界是否需要濾波需要看它的邊界強(qiáng)度。主要是通過相鄰的塊的編碼信息來判斷,如預(yù)測模式或運(yùn)動(dòng)矢量。Bs的取值由下表得到:
可以看到:
- 當(dāng)兩個(gè)相鄰塊有一個(gè)以上的幀內(nèi)預(yù)測塊時(shí),Bs=2
- 當(dāng)兩個(gè)相鄰塊有一個(gè)以上的非零變換系數(shù)塊時(shí),Bs=1
- 當(dāng)兩個(gè)相鄰塊的運(yùn)動(dòng)矢量差值絕對(duì)值大于一個(gè)色度分量像素時(shí),Bs =1
- 當(dāng)兩個(gè)相鄰塊參考不同圖像時(shí),Bs =1
- 其余情況Bs=0
即我們認(rèn)為相鄰塊的預(yù)測模式、運(yùn)動(dòng)矢量、變換系數(shù)差異越大時(shí),它們的邊界就越明顯。
對(duì)于亮度度分量,只有當(dāng)Bs>0才會(huì)應(yīng)用Deblocking,而對(duì)于色度分量,只有Bs>1才會(huì)應(yīng)用Deblocking
此外,對(duì)于亮度分量而言,邊界兩邊的像素如何進(jìn)行Deblocking需要進(jìn)一步判斷,而對(duì)于色度分量,兩邊則相同,不用進(jìn)一步判斷。
Bs獲取的流程如下圖,其中P,Q代表兩個(gè)相鄰的塊
Deblocking以4x4像素塊為基本單位進(jìn)行,如下圖,對(duì)于豎直邊界而言,每次進(jìn)行Deblocking的像素為其兩側(cè)的兩個(gè)4x4像素塊。
計(jì)算出當(dāng)前邊界的Bs后,如果Bs滿足條件,還需要進(jìn)一步判斷邊界兩側(cè)的像素是否滿足下式:
其中beta跟量化參數(shù)有關(guān),可以查表得到,不用關(guān)注。其余的p和q對(duì)應(yīng)上圖中的像素值。這個(gè)式子就在說雖然兩個(gè)塊的差異較為明顯,中間有一條邊界,但是兩個(gè)塊內(nèi)部應(yīng)該是比較平坦的,內(nèi)部差異較小,這樣才是我們想要濾波的情況。
濾波強(qiáng)度
HEVC中有兩種濾波模式:強(qiáng)濾波、一般濾波。確定當(dāng)前邊界要濾波后還要判斷是要進(jìn)行強(qiáng)濾波還是一般濾波。
濾波強(qiáng)度不要和邊界強(qiáng)度搞混了。邊界強(qiáng)度Bs是告訴你這里有沒有邊界,濾波強(qiáng)度則是來判斷邊界是不是很明顯,需不需要狠狠地濾一波。
是否進(jìn)行強(qiáng)濾波由下面3個(gè)式子判斷:
其中Tc也是查表得到的。i=0,3 也就是說要判斷4x4塊中的第1行和第4行是否滿足這三個(gè)式子,都滿足就進(jìn)行強(qiáng)濾波。
整體的流程圖如下:
接下來介紹一般濾波和強(qiáng)濾波怎么做
一般濾波
對(duì)于一般濾波,有可能改變一個(gè)像素值,也有可能改變兩個(gè)像素值,需要通過下式來判斷:
7.5式用來判斷P中改變幾個(gè)像素值,7.6式用來判斷Q中改變幾個(gè)像素值。如果滿足式子則改變兩個(gè),否則改變一個(gè)。
這兩個(gè)式子的含義就是說塊越平坦也就意味著P和Q的邊界越明顯,即需要改變的像素也就越多。
兩個(gè)式子分別對(duì)邊界的兩邊進(jìn)行判斷,有可能一邊需要改變一個(gè)像素,而另一邊需要改變兩個(gè)像素。
對(duì)于邊界兩邊兩個(gè)4x4的塊而言,每一行都需要進(jìn)行上述操作。
除了7.5 與7.6的條件外,還需要滿足一個(gè)條件才能進(jìn)行濾波:
其中tct_ctc?是查表得到的,這個(gè)式子是為了避免斜坡型的紋理被濾波。整體濾波的判斷流程如下:
濾波后的像素值由下式得到:
也就是在原始像素的基礎(chǔ)上加上偏移值,具體偏移值怎么算的還有一系列式子,這里就不說了。
通過濾波,消除塊效應(yīng),如下示意圖:
強(qiáng)濾波
強(qiáng)濾波通常作用于平坦區(qū)域,這些區(qū)域的塊效應(yīng)往往更加明顯。強(qiáng)濾波每四個(gè)像素改變?nèi)齻€(gè)像素的值。如下:
Q塊也是同理,將式中的p換成q即可。
色度分量的Deblocking
前面說到過,色度分量只有Bs=2時(shí)才進(jìn)行Deblocking。
色度分量的濾波比較簡單,只改變每四個(gè)像素中的一個(gè),即p0和q0,的值。也不用分強(qiáng)濾波還是一般濾波,邊界兩側(cè)也都是改變一個(gè)像素。
像素值的濾波方式跟式7.7和7.8一樣,只不過其中的delta由下式獲得:
自適應(yīng)濾波
前面式子中有兩個(gè)參數(shù)是查表得到的即β\betaβ和 tct_ctc?。其實(shí)我們可以自己定義他們的值,進(jìn)而實(shí)現(xiàn)對(duì)濾波的自適應(yīng)控制。像HM中就有輸入?yún)?shù)可以控制。在PPS中也會(huì)有相應(yīng)的語法元素:tc_offset_div2 和 beta_offset_div2。實(shí)際的 tct_ctc?值就等于 tct_ctc? + tc_offset_div2 * 2, β\betaβ同理。
總結(jié)
以上是生活随笔為你收集整理的HEVC中的去方块滤波——Deblocking Filter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为你的Windows XP瘦身(转)
- 下一篇: C/C++简单实现文件分块