天天看點

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

為了有效地預測多種不同種類的内容,HEVC支援多種不同的預測方法。角度預測可以模拟多種不同方向的結構,而平面和DC模式适用于平滑和漸變區域。同樣對于任何角度預測模式都不能很好地适應的複雜紋理的像素塊,DC和平面模式還可以用于在這種情況下生成一種不帶有高頻資訊的“通用”預測塊。此外,對于DC和某些角度預測模式,幀内編碼還包括一些濾波後處理操作用于在塊的邊界提升像素之間的連續性以提高預測的品質。

HEVC中的角度預測方法用于高效地對圖像和視訊的不同方向性結構進行模組化的方法。該方法所選擇的預測方向經過設計,可以達到對典型視訊内容的編碼效率和編碼複雜度的平衡。算法對不同的預測塊大小和預測方向提出了嚴格的低複雜度要求,因為HEVC幀内預測所支援的預測模式遠遠超過H.264等前期标準。在HEVC中,HEVC定義了從4×4到32×32這四種不同大小的幀内預測塊尺寸,每種尺寸都支援33種不同的預測方形,是以一個解碼器必須支援總共132中組合。

HEVC定義了33中預測角度的集合,其精度為1/32。根據經驗,圖像内容中水準和垂直一緻通常出現的機率超過其他方向一緻。相鄰方向之間的角度差越接近這兩個方向便越小,越靠近對角線方向便越大,其目的在于在接近水準和垂直模式時可以提供更加精準的預測結果,而在出現機會較低的對角方向減小預測的運算負荷。各個預測方向如下圖所示:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

下表定義了各個預測模式與方向角度差之間的一一對應關系。角度差用參數A表示,在生成參考像素時會作為擷取參考資料的依據。

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

為了簡化預測過程,編碼器将目前像素塊上方的參考像素p[x][-1]和左方的參考像素p[-1][y]置于一個一維數組中。對于正角度(模式26~33和模式2~10),該數組直接拷貝預測方向上的像素值,公式如下:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

對于負角度,左側和上方的參考像素都會被使用到,此時參考數組中的非負索引的元素依舊如前文所述,負索引值所表示的像素通過映射獲得,公式如下:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

其中B與角度參數A的對應關系如下表:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

這部分該如何了解呢?以下兩張圖分别是正向角度的垂直模式/水準模式的方向示意圖:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測
【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

對于不同的預測方向,預測塊所使用的預測資料時不同的。由于預測像素的組織形式是一個一維數組,以頂點像素為中心向兩邊擴充。在正向角度預測時,隻需要或正方向或負方向的預測資料級就可以為預測塊進行指派。而對于負向角度,情況将有所不同。下圖表示負向角度下的預測方向示意圖:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

舉例,當mode為2時,預測方向為右上方對角線。處理代碼如下:

而後,模式的索引差将轉換為角度偏移差:

intraPredAngle這個變量中就儲存了目前模式同水準/垂直模式映射到邊界上的偏移值,精度為1/32像素。如果該參數為正,那麼将目前預測塊的上方和左方預測像素複制到兩個數組中,并依據目前模式的方向分類确定哪一個作為主要參考哪一個作為輔助參考:

當對于mode11時,情況将有所不同。

mode11的預測方向為水準向右,并略帶向右下方傾斜,其參考的像素大部分為左側像素,同時也會用到幾個上方的像素。具體所需的像素個數為塊尺寸×角度差參數A的絕對值÷32,對于64×64的mode11就是64×2÷32=4。這幾個值從refSide中每隔M個像素取一個,M的取值為invAngle的取值除以256。實作方法如下:

預測像素的值p[x][y]由pel[x][y]的目前位置按照模式規定的方向向參考像素數組上進行映射擷取,并按照1/32像素的精度進行內插補點。內插補點由最接近的兩個像素點按照線性關系生成。對于水準和垂直模式生成預測資料的公式如下:

水準模式:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

垂直模式:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

公式中的i表示對于垂直模式在y列和水準模式在x行的偏移值的整數部分,按照如下方式計算:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

公式中的f表示偏移的小數部分,計算方式如下:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

i和f這兩個常量适用于預測一組資料(垂直模式的一行和水準模式的一列),隻有線性插值操作需要對每個像素值進行操作。如果f值為0,那麼不進行線性插值,直接将參考資料用作預測資料。

具體實作如以下代碼所示:

對于DC預測模式,所有的預測資料采用同一數值,該數值由左方和上方參考資料的平均值生成。對于16×16或更小的DC預測塊還需要一個濾波過程來優化左邊和上方的邊界效果,具體方法第四節詳述。

角度預測可以對方向性結構的像素塊進行較為精确的預測,但在光滑的圖像區也會産生一些肉眼可見的邊界輪廓。類似的是,DC預測模式在中低碼率下也可能會産生一些塊效應。HEVC定義了平面模式用于處理類似的問題,可以生成一個在邊界上沒有不連續斷層的預測平面。其方法為依據水準和垂直的線性預測方法,公式如下:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

水準方向的預測結果Ph[x][y]和垂直方向上的預測結果Pv[x][y]按照以下方法生成:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

有些預測模式在預測像素塊的邊界處可能産生不連續的像素值斷層,對DC模式和角度預測中的水準和垂直模式尤為明顯。在DC模式下,頂部和左側邊界都會産生不連續效應,因為整個預測像素值都由同一個平均值替換。對于垂直模式,左側邊界可能産生不連續邊界,因為最左邊一列的預測像素值複制了塊上方最左側的參考像素。對于水準模式的最頂行也存在類似的問題。

為了降低塊邊界的這種不連續性,預測塊内部的邊界像素需要考慮塊邊界的斜率做一次濾波并用結果進行替換。這一步僅僅針對DC、水準和垂直模式,而且預測塊的尺寸小于32×32時進行。事實證明這種設定可以在編碼效率和運算複雜度上取得一個較好的平衡。另外,由于亮度分量有更為均衡的特性,預測塊邊界濾波操作僅限于亮度分量。

如果預測模式為垂直模式,預測像素p[0][y](y∈[0,N-1])由以下公式的結果進行替換:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

對于水準模式,操作類似。

對于DC模式,需要根據原預測像素的位置分為三種情況:

【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測
【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測
【HEVC學習與研究】41、HEVC幀内編碼的原理和實作(中)3、像素塊的幀内預測

繼續閱讀