H.266/VVC相關技術學習筆記25:H.264到H.265再到H.266中幀內角度預測模式發展歷程以及各階段技術細節詳解

趁着國慶的時間,詳細總結一下關於視頻編碼中的幀內預測,主要總結一下從H.264到H.265再到H.266中的幀內角度預測模式發展歷程以及各個階段角度模式的技術細節以及預測值計算流程。因爲之前看了角度模式,也忘了記筆記,現在有點淡忘其中的細節了,趁這幾天複習順帶總結一下。其中AVC和HEVC中角度預測的一大部分知識點是源於書的,但是感覺楊老師那本書中知識點脈絡不是很清楚,而且其中的計算細節也沒有講清楚,我結合朱老師那本書(這本感覺適合新手,對新手比較友好,講的很清楚,反觀楊老師那本比較適合高手進階)然後用自己的脈絡捋了一遍,按照自己的理解去總結一遍,儘可能最簡單直白地將角度預測講清楚。如有理解不到位的,歡迎指正。

一、H.264/AVC中的幀內預測模式

H.264/AVC中的幀內角度預測模式不是很多,而且根據宏塊的大小不同,角度預測的模式數量還不一樣。由於AVC中是以宏塊的形式進行編碼的。

1、對於亮度像素而言,獨立進行預測的塊的大小可以是16×16宏塊或者是4×4的子塊

①對於4×4的亮度子塊有9種可選的預測模式,適用於具有大量細節的圖像的預測編碼。這9種模式分別是8種角度模式+一個DC模式。具體角度模式的預測方向如下圖所示(直接拿書上的圖片了,自己畫有點麻煩~)。圖中虛線箭頭的根部是參考像素,箭頭所經過的是待編碼的預測像素。預測時,通過箭頭根部的一個或者多個參考像素的加權值來預測所經過的待編碼的像素,具體要用多少個參考像素以及權重的選取,這些和預測的角度以及當前預測像素所在的位置有關。想要在深入瞭解的同學可以參考一個大神的博客:【H.264/AVC視頻編解碼技術詳解】十七:幀內預測編碼的預測實現方法。由於本人直接是從H.266/VVC標準開始做起的,關於H.264/AVC中具體的技術細節以及相關的代碼我也沒有太多深入學習過,可能總結的不是很到位,所以這裏直接引用這位大佬關於AVC技術詳解的博客。
在這裏插入圖片描述
②對於16×16的亮度宏塊僅有4種可選的預測模式可以選擇。因此適用於具有平坦區域的圖像進行預測。這四種預測模式分別爲0(垂直)、1(水平)、2(DC)、3(平面),具體如下圖所示。注:這裏的平面叫做“plane”,這就是後續HEVC以及VVC中的Planar模式的前身。從上面可以看出,DC模式以及Planar模式早在AVC標準中就已經出現。
在這裏插入圖片描述

2、對於色度像素而言,獨立進行預測的塊的大小隻有8×8。

一方面考考慮到4:2:0的色度取樣模式,所以16×16的亮度宏塊對應的色度塊是8×8,另一方面考慮到人眼對於色度信號的分辨率一般低於亮度信號,因此在色度信號的幀內預測中統一取8×8塊的尺寸。色度的8×8塊同亮度16×16塊的預測模式數量一樣,只有4種,這四種預測模式一樣,但是編號的順序不一樣,對於色度塊來說:0(DC)、1(水平)、2(垂直)、3(平面)

在AVC中,每一個宏塊或者子塊如何在多種預測模式中選擇出一個最優的模式呢,這是很重要的一個問題,其中採用率失真優化(RDO)方法,也就是計算每種模式下預測值與原始值之間的失真,同時加上碼率的判斷,計算RDCost,cost最小的那個模式就是預測最準確、產生碼字最少的最優模式。即4×4的子塊需要在9種模式中進行率失真代價的比較,16×16的宏塊需要在4種模式中進行率失真代價的比較。RDO的方法一直沿用到了HEVC以及目前的最新一代標準VVC中了。

二、H.265/HEVC中的幀內亮度預測模式

相比於AVC,爲了提高預測的精度,HEVC中的幀內亮度預測模式總共增加到35種,其中有33種角度預測模式、平面模式(Planar)、直流模式(DC)。每種模式都有其對應的模式編號:0(Planar)、1(DC)、2-34(33種角度模式)。
1、Planar模式
適用於紋理比較平滑(即像素值變化緩慢)的區域,尤其是變化趨勢比較一致的區域。Planar模式使用水平和垂直方向的兩個線性濾波器,並將二者的平均值作爲當前塊像素的預測值。因此,每個像素的預測值可能是不同的。

2、DC模式
適用於大面積的平坦區域,對當前塊內所有的像素都使用同一個預測值,即所有參考像素的平均值。

3、角度模式
HEVC的幀內亮度角度預測和AVC中的類似,但是更加細化了這些預測方向(擴展到33種),以更好地適應視頻內容中不同方向的紋理。這33種角度模式如下圖所示,其中模式26(上側第0格)和模式10(左側第0格)分別表示垂直和水平方向,其餘模式的預測方向都可以看成在垂直或水平方向上做了一個偏移(偏移距離最多爲32格),這個偏移值可正可負。(需要注意的是:對於模式11-25,當前塊的預測需要同時用到上方以及左側的參考像素(可以自己用尺子之類的比劃一下,在這些角度下會有一部分的當前像素是需要用到當前角度放射不到地方的像素進行預測)。因爲爲了使用一種統一的形式來計算預測像素值,在HEVC標準中採用了一種“投影像素”的方法,對於模式18-25(垂直偏左類模式),由於有些當前像素需要用到左側的參考像素,因此需要將左側的參考像素按照給定的方向投影至上方參考像素的左側;對於模式11-17(水平偏上類模式),由於有些當前像素需要用到上側的參考像素,要將上方參考像素按給定的方向投影至左側參考像素的上方)

在這裏插入圖片描述

HEVC中幀內預測過程(以下的用圖都爲PPT所繪,如有不規範的地方請多包涵~)

HEVC中幀內預測過程主要分爲3個步驟:

1、參考相鄰像素的獲取:

在幀內預測最開始需要先確保相鄰參考像素存在且幀內可用,因此這一步就是要對那些不可用的參考像素進行填充爲接下來的幀內預測做好準備。在AVC中只有當前塊的正上方和正左側的像素能作爲參考像素,這是因爲AVC中的塊劃分都是固定的宏塊,而HEVC中允許不同尺寸的編碼塊,因此有時候左下方和右上方的像素存在且可用,所以HEVC中幀內參考像素的範圍擴展到了當前塊左上角、左下方以及右上方的範圍。如下圖所示(nTbs爲當前編碼塊的寬和高):
在這裏插入圖片描述
需要注意的是,在某些情況下參考像素有可能不可用。HEVC標準會使用最鄰近的像素進行填充,具體的填充方法如下:
①如果ABCDE區域的所有像素都存在且幀內可用,則不需要進行填充;
②如果ABCDE區域的所有像素都不存在且幀內不可用,則所有的參考像素都填充爲固定像素值,對於8比特深度,填充128;對於10比特深度,填充512。
③若ABCDE區域有部分像素不存在或者幀內不可用;
(1)若左側最下面的像素點P[-1][nTbs×2-1]幀內不可用,則依次從下往上,然後從左到右遍歷,直到找到第一個可用的像素點將該點出的像素值填充到到P[-1][nTbs×2-1]。
(2)然後再從左下像素點P[-1][nTbs×2-2]開始從下到上逐個遍歷,若遍歷到當前的像素點P[x][y]不存在或者幀內不可用,則用該點下方的像素點P[x][y+1]填充到當前點P[x][y]。
(3)最後對上側的像素從左到右逐個遍歷,如果當前的像素點P[x][y]不存在或者幀內不可用,則用該點左方的像素點P[x-1][y]填充到當前點P[x][y]。

2、參考像素的平滑濾波:

在AVC中,幀內預測時在某些角度模式下的參考像素會進行一定的濾波操作,以更好的利用鄰近像素之間的相關性,從而提高預測精度。在HEVC中沿用這一做法,對8×8或者更大的預測塊的部分參考像素在進行預測之前進行平滑濾波預處理,以減少噪聲對預測的影響。而且對其進行了發展如下:
①HEVC根據預測塊尺寸以及幀內預測模式的不同,會選擇性地對預測塊的參考像素集進行平滑處理:
(1)對8×8預測塊的參考像素,只需要對2、18、34這三種角度模式進行常規平滑濾波
(2)對16×16預測塊的參考像素,除了水平方向附近的9、10、11,以及垂直方向附近的25、26、27不需要進行濾波,其餘的27個角度模式都需要進行常規平滑濾波
(3)對32×32預測塊的參考像素,除了水平模式10和垂直模式26外,其餘的31個角度模式都需要進行平滑濾波;對於32×32預測塊總共有兩種平滑濾波的方法:一種是常規濾波,一種是強濾波。關於這兩種濾波下面詳細介紹。
總結來說,較大的塊和越遠離垂直或者水平方向的預測模式,越是要對參考像素進行平滑處理。

②常規平滑濾波:
參考像素的常規平滑濾波可以通過一個3抽頭的濾波器來實現,具體的如下圖(a)所示:
當前參考像素P[x][y],是利用其左右兩邊或者上下兩邊的參考像素進行121的3抽頭平滑濾波;需要注意的是,P[-1][nTbs×2-1]和P[nTbs×2][-1]處的像素不進行濾波;左上角的像素P[-1][-1]利用其右邊以及下方的參考像素點進行平滑濾波;

在這裏插入圖片描述
③強平滑濾波:
強平滑濾波只對於32×32的大塊進行,當在SPS中的強濾波標誌有效的條件下,還需要估計參考像素集的局部活動性。如果活動性低於某個閾值,則用一個雙線性插值濾波器對參考像素進行強平滑濾波。即一個32×32的預測塊是否要進行強平滑濾波,需要同時滿足以下四個條件:
(1)預測塊的尺寸爲32×32,即nTbs=32;
(2)允許強濾波標誌的flag爲1;
(3)Abs(P[-1][-1]+P[nTbs×2-1][-1]-2×P[nTbs×2-1][-1])<(1<<(BitDepthY-5));
(4)Abs(P[-1][-1]+P[-1][nTbs×2-1]-2×P[-1][nTbs×2-1])<(1<<(BitDepthY-5));
其中不等式左邊的值就是表示參考像素的活動性。如果小於這個閾值,就表明參考像素處在低紋理的區域,強度爲常數或者接近線性變化。
當滿足上面四個條件以後,32×32的預測塊的參考像素按照上圖(b)中的方式進行線性插值,權值是當前像素點P[x][y]相距兩頭的距離,x和y就是當前參考像素在X軸和Y軸上的座標值。上圖的例子是拿一個32×32的預測塊舉例子的,因此兩個權值的總和是64,當P[x][y]距離哪一頭的像素越近,其權值就相對較大,因爲其和當前參考像素點P[x][y]的紋理更接近,相關性更強;反之,權值越小。
強濾波通過沿着每個方向上的線性內插值取代真實樣點值,取消了小的局部變化。尤其對於32×32的大樣點區域,可以明顯改善結構性失真。

3、預測像素的計算:

①Planar模式的預測值:
如下圖所示,預測塊內的像素P的預測值由4個參考像素來決定,首先要用當前像素左邊參考像素b和右上的參考像素a按照距離進行加權和得到P_Hor=(nTbs-x)b+xa;再用當前像素上邊參考像素d和左下的參考像素c按照距離進行加權和得到P_Ver=(nTbs-y)d+xc;最後求得最終的預測值P=(P_Hor+P_Ver+nTbs)>>(Log2(nTbs)+1)。這裏是代碼中的實現,實際上這三步的計算就是先對水平和垂直上的參考像素各自求加權平均,最後對插值之後的兩個值求平均。
在這裏插入圖片描述
②DC模式的預測值:
DC模式的預測值就是對所有相鄰參考像素求平均值,當前預測塊中所有像素點的預測值就爲該平均值。

③角度預測模式的預測值:
結合下面各角度的偏移值表格以及上圖中各種預測模式的方向所示,我們可以發現各個模式的格點(角度)分佈是不均勻的,就拿模式18-34舉例,越是靠近垂直方向(26),分佈就越是密集,越是靠近對角方向的分佈就越是稀疏。這樣設計的原因就是由於自然界中景物的垂直運動或者邊緣的佔比很高,水平方向的分佈也是如此。在幀內的33種角度預測模式中,稱2-18爲水平方向類預測模式,18-34爲垂直方向類預測模式,需要注意的是,表格中所表示的格數是在1/32像素插值精度下表示的,也就是說,將一個整像素放大了32倍,32格實際上只表示一個整像素的距離,因此在後面計算預測值的時候需要進行除以32的歸一化操作。
在這裏插入圖片描述
下面以垂直類18-34爲例給出預測像素的具體的計算步驟:
(1)獲取參考像素數組Ref[x]
獲取參考像素之前需要清楚一些知識點,幀內角度模式預測的基本原理就是通過當前像素沿某個方向在參考像素集上投影,“投影中”的那個參考像素就是當前像素的預測值,但是很多情況下並不能投中某個參考像素,原因就是該方向上或者投在了兩個像素之間。而且很關鍵的一點就是當前預測塊內的像素既需要嘗試投在上方參考像素,也需要嘗試投在左方參考像素,這樣就是導致計算複雜度的升高。因此HEVC中首次設計將上方和左側的兩個參考像素集通過投影的方式轉化爲一個一維的參考像素集。具體爲:如果是模式11-17,需將上方的參考像素集投影到左側參考像素集的上方;如果是模式19-25,需將左側的參考像素集投影到上方參考像素集的左側。
上面偏移值表格中的偏移值也可以稱爲intraPredAngle[k],其中k爲模式號。因此參考像素集的獲取如下圖公式所示,intraPredAngle[k]<0表示在模式19-25之間,此時需要將左側的參考像素投影到左上側;intraPredAngle[k]>0表示在模式26-34之間:

在這裏插入圖片描述
這裏“投影”的那部分在實際的代碼操作部分中,需要設置一個如下表所示的反角度參數表invAngle用來代替計算預測時麻煩的除法運算,就是爲了替代上圖公式中的Round((32∗x)/(intraPredAngle[k])),在代碼中替換爲Ref[x]=p[-1][-1+((x×invAngle[k]+128)>>8)]。
在這裏插入圖片描述
經過上面一些列的操作,就可以得到一個一維的參考像素集Ref[x],接下來的預測就可以參考這個一維數組進行。
(2)設置計算預測值必要的參數iIdx和iFact
iIdx表示不同模式所對應的索引,實際上是相對於當前預測像素點X座標或者Y座標的相對偏移像素值(是除以32歸一化後的整像素精度表示)。iFact表示權重參數,是在最後求預測值時候進行加權操作需要用到的權重。下面首先解釋一下預測值計算的原理,才能更好的理解上面那些參數以及預測值計算的真正意義。這裏就拿模式26-34來舉例子,如下圖所示,對於每個預測方向,可以根據比例關係C_x / y=d / 32計算出預測點p(x,y)在上方參考像素行中的真實的投影點位置,得到投影點橫座標相對於p(x,y)橫座標的位移C_x = (y×d)/32。
在這裏插入圖片描述
這裏的C_x實際就是參數iIdx,d實際上表示預測模式方向相對於垂直方向的偏移格數(即前面提到的invAngle[k],範圍爲-32~+32),在上圖中就表示當前塊右下角的點在當前預測方向下的投影參考點相對於右下角點的橫座標偏移值。因此最終可以定義偏移索引iIdx和權重因子iFact如下:
               iIdx=C_x=(y×d)/32; (1)
               iFact=w=(y×d)&31; (2)
接着再根據下圖繼續解釋上述兩公式,下圖(a)中表示實際的整像素點陣,i=x+C_x。其中 i 爲過預測點p(x,y)的預測方向線和參考像素行的交點。上式(1)中(y×d)除以32後使C_x稱爲歸一化的長度單位(即歸一化到整像素的單位長度),目的是使其和x的實際座標定義相一致。因爲前面提到的各角度的偏移值表格實際上是以1/32像素精度表示的也就是說那個表格是以將整像素單位擴展了32倍爲基礎而設計的表中的一格就代表1/32像素32格才代表1個整像素。或者我們可以換個角度,從數學的角度來分析,式(1)其實就是利用相似三角形的定律求出C_x,這樣理解會比較簡單,但還是建議搞清楚其中包含的像素精度的問題。接下來說說上式(2),其中(y×d)也可以表示未進行歸一化的C_x,就是以32格爲單位,即仍然是以1/32精度表示的距離,在和“31”進行“按位與”的操作後,實際上就是去掉了大於32的部分,保留下來的小於32的部分就是作爲下圖(b)中表示R_(i,0)到 i 點的距離,也就是權重w。
在這裏插入圖片描述
以上兩個參數在代碼中的實現實際如下:
               iIdx=((y+1)×intraPredAngle[k])>>5;
               iFact=((y+1)×intraPredAngle[k])&31;

(3)預測值的計算
仍然如上圖(a)所示,其中的 i 點可以看成p(x,y)點沿着預測方向向參考像素行的投影點,p(x,y)點的預測值就等於這個投影點的插值,該插值就是由其左右相鄰的兩個參考像素R_(i,0)和R_(i+1,0)的線性內插而得,也可以說是加權求和。靠近i點的參考像素權重大,遠離i點的參考像素權重小。如上圖(b)所示,相鄰兩個參考像素的距離在1/32精度下爲32個格單位,因此最終的加權預測值表示如下:
             P(x,y)=((32-w)×R_(i,0) + w×R_(i+1,0)+16)>>5;
具體地,在代碼中的最終預測值計算分兩種情況:
當iFact不等於0時,即i點夾在兩個參考像素點之間,預測值計算如下:
       PredSamples[x][y]=((32-iFact)×Ref[x+iIdx+1] + iFact×Ref[x+iIdx+2]+16)>>5;
當iFact等於0時,即i點正好投影在左相鄰的那個參考像素點上,預測值計算如下:
       PredSamples[x][y]=Ref[x+iIdx+1] ;

注意:這裏需要說明的是,在以上所有公式中的“>>5”表示右移5,即除以32,目的就是將放大了32倍的權重歸一化,將1/32精度下的距離恢復爲整像素精度。還有以上所有的分析結果都是針對模式26-34的情況,其餘2-25模式的預測值的計算也和上述方法類似。

三、H.266/VVC中幀內角度預測模式

1、VVC中的65種常規角度模式以及針對矩形塊的寬角度模式

在VVC的早起版本VTM1.0之前(包括VTM1.0)中的角度預測模式仍然爲33種角度,但是從BMS1.0之後的版本爲了能夠捕捉到自然視頻中呈現的任意邊緣方向,因此將常規角度預測模式擴展到65種,加上Planar、DC模式總共有67種角度幀內預測模式(針對亮度分量)。如下圖所示,VVC中新添加的角度模式在圖中用紅色虛線箭頭表示,Planar模式和DC模式保持不變:
在這裏插入圖片描述
而且由於在HEVC和VVC中的劃分方式的不同,在HEVC中的劃分方式只能劃分出正方形的塊,因此沿順時針方向將常規角度幀內預測方向定義爲45度(角度模式2)至-135度(角度模式34)。而且其每一側的長度是2的冪,因此在使用DC模式的時候,可以不需要用除法,直接用移位表示除法計算出DC的預測值。而在VVC中,由於劃分方式的多樣化,允許混合樹以及二叉樹、三叉樹的劃分,使得最終的編碼塊極有可能不是正方形的,而是長寬不等的矩形。因此在VVC的VTM1.0版本之後就新引入了針對這種非正方形塊的寬角度幀內預測模式(wide-angle intra prediction modes),即對於非正方形的塊,會根據塊的寬高比自適應地將幾種常規的角度幀內預測模式替換爲寬角度幀內預測模式,所謂的寬角度就是對於寬度大於高度的塊,右上角的角度允許超過45度;對於高度大於寬度的塊,左下角的角度允許超過45度。而且對於DC模式,非正方形的塊可能會難免引入除法運算,因此爲了避免複雜的除法運算,就僅僅將較長的那一面用於計算非正方形塊的平均值。

2、下面具體來看看寬角度模式具體是怎麼用的:

首先對於尺寸爲W×H像素的預測塊,頂部參考像素集和左側參考像素集的尺寸均爲(W + H + 1),需要覆蓋所有預測像素在順時針方向上從45度到-135度的範圍。如下圖所示,不論是正方形塊還是不對稱的矩形塊,其預測角度都被限制在這個範圍之內:
在這裏插入圖片描述
當出現不對稱的非方形塊時,對於某些預測模式,將從較遠的參考像素集中去獲取當前的預測像素,雖然距離較近的參考像素集中的像素更可信,相關性也更強,但是由於預測角度的限制,使得不能夠獲取到距離較近的參考像素,例如下圖所示,對於左邊(W>H)的塊,右上方的參考像素T和預測點A的距離更近,但是由於預測角度不能超過(-135,45)度的範圍,因此只能去選擇其對角方向的左側參考像素L;右圖的(H>W)的塊也是類似的情況。

在這裏插入圖片描述
所以寬角度就是應對以上問題而被設計的,寬角度模式並不增加幀內預測模式的總數,仍然是67種幀內亮度預測模式,並且幀內編碼方式不變。寬角度在使用的時候實際上是自適應地替換了非方形塊的幾種常規幀內角度預測模式,而且替換後的寬角度模式仍然使用被替換的那個常規角度模式的索引發送到解碼端,在解碼端解析該常規模式索引,然後再重新映射到相對應的寬角度模式的索引。
寬角度模式是否使用是根據一個wide-angle “flip mode”的標誌位來標識當前塊寬角度模式是否開啓。當寬角度模式啓用的時候如果實際的預測樣本使用的是需要被翻轉的的那個常規(2-66)角度模式則需要根據翻轉信號所指示的寬角度方向切換參考像素集如果原本是Top,現在使用Left;如果原本是Left,現在使用Top)。在當前的VVC版本中,寬角度模式總共有28種方向,一側各14個寬角度模式,左側爲(-1、-2…-14),上側爲(67,68…80)。但是實際上,這28種模式號並沒有真正加入到幀內預測模式的索引中去,就是因爲如上所說,寬角度模式需要傳遞的是其對應的常規角度的模式索引。不過仍然還是爲寬角度模式預留了14個模式的“隱形位置”,由於每一側只有14種寬角度,因此最多預留14個就足夠了,所以導致色度幀內預測模式中的三種CCLM模式要排到81,82,83了(當然實際的代碼中還是67,68,69)。

由於寬角度模式下所替換的常規角度模式的數量取決於當前預測塊寬高比,具體如下表所示:
在這裏插入圖片描述
下圖展示瞭如何將矩形塊的常規角度模式替換爲寬角度模式。在此示例中,模式2和模式3替換爲廣角模式67和模式68,其中每個寬角度幀內預測方向都與一個常規幀內預測方向相關聯,並且與該常規幀內預測方向相反,使用的參考樣本也在相對側。其中模式67的方向指向模式3的相反方向,而模式68的方向指向模式4的相反方向 。

在這裏插入圖片描述

3、寬角度模式存在的問題

當角度預測方向超過45度時會存在不連續的問題,如下圖所示,在寬角度幀內預測的情況下,兩個垂直相鄰的預測樣本可能會使用兩個不相鄰的參考樣本,這兩個參考樣本中間的間隙可能會導致一些負面的影響。因此需要使用邊緣平滑和低通參考像素樣本濾波器去消除這種負面效應。當然如果滿足非分像素偏移的寬角度模式是不需要進行任何插值操作,可直接複製參考樣本像素值到當前預測像素中,這些模式有以下8種 [-14, -12, -10, -6, 72, 76, 78, 80]。
在這裏插入圖片描述

4、VVC中的角度預測具體步驟可以參考HEVC中的計算步驟,大致都是相同的,這裏就不多做贅述,關於當前版本的VVC中角度預測模式的代碼有時間我會在後續的博客更新~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章