Intra Luma Prediction

 

在宏塊的幀內預測過程當中,有四種宏塊類型:I_4x4,I_8x8,I16x16,I_PCM。他們都須要在相鄰塊作去塊濾波以前進行幀內預測。html

 

亮度幀內預測的整體流程

1-4獲取當前block的幀內預測模式的預測,5-7得到最佳預測模式並對應預測模式的預測作後續處理編碼

  1. 首先須要得到當前4x4(8x8)預測塊有左、上的4x4(8x8)相鄰塊A、B,假設其所在宏塊爲mbAddrA、mbAddrB。
  2. 若是mbAddrA或mbAddrB中任意一個宏塊不可用於幀內預測( 請參考),那麼就會設置DC = 1,不然DC = 0。
  3. 若是DC = 1,或者相鄰宏塊mbAddrA,mbAddrB不是以I_8x8或者I_4x4方式編碼的,代表A、B不適用於當前的預測過程,那麼設置A、B爲PredModeA = PredModeB = 2。

    不然DC = 0,而且mbAddrA與mbAddrB都是以I_8x8或者I_4x4方式編碼的,則分別取得A與B的預測模式PredModeA, PredModeB。spa

    預測模式的選取分爲三種狀況:3d

    1. 左與上的相鄰塊都在當前宏塊,即此時當前宏塊還未決定是採用I_8x8仍是I_4x4或者其餘的預測方式。那麼當前塊的相鄰塊A,B的預測模式就採用與這輪的宏塊模式相同的方式的預測模式。如,當前正以I_8x8進行幀內預測,那PredModeA = PredMode8x8A,PredModeB = PredMode8x8_B.

    2. 左與上的宏塊都位於相鄰宏塊,即當前塊位於宏塊的左上角。此時左與上塊所在的宏塊都已選定了所採用的幀內宏塊預測方式,所以不管當前塊是在哪輪的幀內預測上(I_4x4或I_8x8),都應採用相鄰宏塊的預測方式來做爲當前塊的相鄰塊的幀內預測模式,PredModeA = PredModeMacroBlockA,PredModeB = PredModeMacroBlockB.

    3. 左或上的其中一個塊爲相鄰宏塊,僅有一個(左或上)塊位於當前宏塊。這種狀況下,位於其餘宏塊的相鄰塊採用其所在宏塊的幀內預測模式,位於當前宏塊的相鄰塊採用這一輪預測模式。PredModeA = PredMode4x4A,PredModeB = PredModeMacroblockB.

       

     

  4. 根據相鄰塊的幀內預測模式獲得當前預測模式的預測:

    PredPredMode = Min(PredModeA, PredModeB)htm

  5. 上面獲得的只是一個預測值,並非當前塊實際的預測模式。所以還須要經過計算獲得最適合當前塊的預測模式PredMode
  6. 若是PredPredMode == PredMode,說明上方的預測是準確的,設置PredModeFlag = 1;

    不然PredModeFlag = 0。    blog

  7. I_4x4與I_8x8都有9個模式,可是在PredModeFlag = 0的時候,說明預測獲得的預測模式PredPredMode能夠被排除在外了,所以剩下的模式只有8個,這樣剛恰好只用上3個bit就能表示。因此按照下方的作法,可使原來4個bit才能表示的mode用3個bit就能表示:
    1. 若是PredMode < PredPredMode,remPredMode = PredMode
    2. 若是PredMode > PredPredMode,remPredMode = PredMode -1

    remPredMode爲最後用來編碼的mode圖片

     

 

如今所剩下的惟一疑點就是步驟5的:如何經過計算得當前塊的最優預測模式。rem

 

預測模式一共有9種。他們的序號與名稱見下方表格get

IntraPredMode Name of Intra4x4PredMode Name of Intra8x8PredMode
0 Intra_4x4_Vertical Intra_8x8_Vertical
1 Intra_4x4_Horizontal Intra_8x8_Horizontal
2 Intra_4x4_DC Intra_8x8_DC
3 Intra_4x4_Diagonal_Down_left Intra_8x8_Diagonal_Down_left
4 Intra_4x4_Diagonal_Down_right Intra_8x8_Diagonal_Down_right
5 Intra_4x4_Vertical_Right Intra_8x8_Vertical_Right
6 Intra_4x4_Horizontal_Down Intra_8x8_Horizontal_Down
7 Intra_4x4_Vertical_Left Intra_8x8_Vertical_Left
8 Intra_4x4_Horizontal_Up Intra_8x8_Horizontal_Up

 

可見4x4與8x8的預測模式都是以同樣的順序排列。it

除了序號爲2的DC模式外,其餘模式都是經過相鄰塊的邊緣像素點來進行線性預測的,預測方向以下

在圖像上,像素點座標是按照左上至右下的順序遞增的。按照這種規律,能夠獲得一個座標軸以下

這樣的話,預測模式就能夠看作是斜率,只要知道座標軸上的點(相鄰塊邊界像素值),便可經過斜率(預測模式),獲得該斜線上的座標。

就以上圖的這種狀況爲例,能夠看到當mode=4時,斜率爲1,即

$y=x+b$

$-b=x-y$

$-b$就是當$y=0$時,在x軸上的偏移,所以有

$p[-b,0]=p[x –y,0]$

因爲同一條線上的值相等,因此有

$p[x,y]=p[x-y,0]$

同理,當$mode=5$時,斜率爲2,有

$y=2\times{(x+b)}$

獲得

$p[-b,0]=p[x-\frac{y}{2},0]=p[x,y]$

 

固然,以上只是大體闡述了用幀內預測來獲得像素點的值的方式,在實際進行幀內預測的時候並不會這麼簡單,並且Intra4x4與Intra8x8在細節上也會有一些差異。下面會更詳細地討論Intra4x4預測模式。

 

Intra4x4

對於一個4x4塊來講,在進行幀內預測時會用到相鄰像素點有13個,如上方圖片中紅色方塊所示。可是在相鄰宏塊不可用於intra預測的時候,該相鄰宏塊上的像素點是不可用的,也就是說會存在相鄰像素點不可用的狀況。可是存在一個特殊狀況:若是不可用的是(4~7,-1),而(3,-1)是可用的,那會令(4~7,-1)的值等於(3,-1)的像素點的值去進行預測。

 

  1. Intra 4x4 Vertical Prediction Mode

    $Pred{4}\times{4}_{L}[x,y] = p[x,-1]$

     

  2. Intra 4x4 Horizontal Prediction mode

    $Pred{4}\times{4}_{L}[x,y] = p[-1,y]$

     

  3. Intra 4x4 DC Prediction Mode
    • If (0~3,-1) and (-1,0~3) is available for Intra 4x4 prediction

      $Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]} + \sum_{x=0}^{3}{p[x,-1]}}$

    • Else if only (0~3, -1) is available for Intra 4x4 prediction

      $Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{x=0}^{3}{p[x,-1]}}$

    • Else if only (-1, 0~3) is available for Intra 4x4 prediction

      $Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]}} $

    • Else none is available for Intra 4x4 prediction

      $Pred{4}\times{4}_{L}[x,y] = 1<<(BitDepth-1)$

     

  4. Intra 4x4 Diagonal Down Left Prediction Mode

    • If $x = y = 3$

      $Pred{4}\times{4}_{L}[x,y] = (p[6,-1] + 3\times{p[7,-1]} + 2) >> 2$

    • Else

      $Pred{4}\times{4}_{L}[x,y] = (p[x + y,-1] + 2\times{p[x + y + 1,-1]} + p[x + y +2, -1] + 2) >> 2$

    由上面的式子能夠看出,在斜的方向上預測時,會參考不止一個相鄰像素點,而是周圍的兩到三個。

     

  5. Intra 4x4 Diagonal Down Right Prediction Mode

    • If $x > y$

      $Pred{4}\times{4}_{L}[x,y] = (p[x-y-2,-1] + 2\times{p[x-y-1,-1]} + p[x-y, -1] + 2) >> 2$

    • Else if $x < y$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y-x-2] + 2\times{p[-1,y-x-1]} + p[-1,y-x] + 2) >> 2$

    • Else

      $Pred{4}\times{4}_{L}[x,y] = (p[0,-1] + 2\times{p[-1,-1]} + p[-1,0] +2)>>2$

     

  6. Intra 4x4 Vertical Right Prediction Mode

    $zVR = 2\times{x}+y$

    • If $zVR = 0,2,4,6$

      $Pred{4}\times{4}_{L}[x,y] = (p[x-\frac{y}{2}-1,-1] + p[x-\frac{y}{2}, -1] + 1) >> 1$

    • Else if $zVR = 1,3,5$

      $Pred{4}\times{4}_{L}[x,y] = (p[x-\frac{y}{2}-2,-1]+2\times{p[x-\frac{y}{2}-1,-1]} + p[x-\frac{y}{2}, -1] + 2) >> 2$

    • Else if $zVR = -1$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$

    • Else $zVR = -2, -3$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y-1]+2\times{p[-1,y-2]} + p[-1,y-3] + 2) >> 2$

     

  7. Intra 4x4 Horizontal Down Prediction

    $zHD = 2\times{y}-x$

    • If $zHD = 0,2,4,6$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y-\frac{x}{2}-1] + p[-1,y-\frac{x}{2}] + 1) >> 1$

    • Else if $zHD = 1,3,5$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y-\frac{x}{2}-2]+2\times{p[-1,y-\frac{x}{2}-1]} + p[-1,y-\frac{x}{2}] + 2) >> 2$

    • Else if $zHD = -1$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$

    • Else $zHD = -2, -3$

      $Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$

     

  8. Intra 4x4 Vertical Left Prediction Mode

    • If $y = 0,2$

      $Pred{4}\times{4}_{L}[x,y] = (p[x+\frac{y}{2},-1] + p[x+\frac{y}{2}+1,-1] + 1) >> 1$

    • Else $ y = 1,3$

      $Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$

     

  9. Intra 4x4 Horizontal Up Predition

    $zHU = x + 2\times{y}$

    • If $zHU = 0,2,4$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y+\frac{x}{2}] + p[-1,y+\frac{x}{2}+1] + 1) >> 1$

    • Else if $zHU = 1,3$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,y+\frac{x}{2}]+2\times{p[-1,y+\frac{x}{2}+1]} + p[-1,y+\frac{x}{2}+2] + 2) >> 2$

    • Else if $zHU = 5$

      $Pred{4}\times{4}_{L}[x,y] = (p[-1,2]+3\times{p[-1,3]} + 2) >> 2$

    • Else $zHU > 5$

      $Pred{4}\times{4}_{L}[x,y] = p[-1,3]$

 

以上,能夠看到Intra4x4預測的整個流程。在上面的圖能夠看到各個預測所須要的相鄰像素點,若是該像素點不可用於Intra4x4的預測,那麼依賴於該像素點的預測模式是不可用的。

 

Intra8x8

8x8塊的幀內預測跟4x4的基本上是同樣的,能夠看作放大了的4x4塊。例如上面提到的相鄰宏塊不可用的狀況,8x8塊在預測時也會用(7,-1)去補全(8~15,-1)。而預測的方向也是與上面4x4預測的9個徹底同樣。

可是有一個不一樣的地方,就是8x8塊在預測以前會去作一次邊界像素點的濾波,濾波後所得的新像素點會被用於當前8x8塊的預測,不一樣於4x4會直接去用邊界像素點了進行預測。

 

 

Intra16x16

Intra16x16是對整個宏塊進行幀內預測,這種比4x4的更爲簡單,只有四種預測模式

Intra16x16PredMode Name of Intra16x16PredMode
0 Intra_16x16_Vertical
1 Intra_16x16_Horizontal
2 Intra_16x16_DC
3 Intra_16x16_Plane

其中模式0,1,2能夠看作是Intra4x4模式的放大版,模式3能夠參考Chroma Intra Prediction的模式3

 

I_PCM

PCM模式就是把一個宏塊共256個像素點的值不作任何處理,直接進行熵編碼的模式,Chroma也有PCM這個模式。

相關文章
相關標籤/搜索