1. 程式人生 > >【HEVC學習與研究】42、HEVC幀內編碼的原理和實現(下)

【HEVC學習與研究】42、HEVC幀內編碼的原理和實現(下)

4、編碼幀內預測模式

大量增加可選擇的預測模式可以提供更高的編碼效率,同時要求編碼預測模式有更加高效的方法降低更多模式帶來的負擔。與H.264採用一個最可能模式不同的是,對於亮度分量,三個最可能模式用於預測實際的幀內預測模式。同時,也考慮了三個最可能模式中的冗餘資訊,重複的模式會使用其他模式進行替換。對於亮度分量,HEVC採用了同亮度分量相同的預測模式。在編碼亮度和色度幀內預測模式時,各個語法元素的設計也體現了亮度分量更多的最可能候選模式以及亮度分量的統計特性。

(1)亮度幀內預測模式的預測

HEVC對每種PU大小共支援總計33種角度模式,外加上DC和平面模式。由於支援的模式更多,類似於H.264的單一最可能模式在HEVC中效率不高。HEVC針對每種PU大小定義了三個最可能模式,其選擇依賴於相鄰PU所選的模式。同時,由於最可能模式之外的模式概率分佈接近平均,這樣也可以由一個不經過CABAC的定長編碼表示的結構來從剩餘32個模式中指定一個模式。
最可能模式的選擇根據左側和上方的相鄰塊的模式確定。如果某一個相鄰塊不是幀內編碼或者編碼模式為PCM模式,或左邊PU處於當前CTU之外,那麼該塊的模式在這個過程中等同於DC模式。設左側和上方PU的模式分別為A和B,如果A≠B,那麼這兩個模式分別設為MPM[0]和MPM[1]。對於MPM[2]的確定需要遵循以下原則:①如果A或B都不是平面模式,那麼MPM[2]設為平面模式;②否則,若A或B都不是DC模式,那麼MPM[2]設為DC模式;③否則(即AB中有一個平面一個DC模式),MPM[2]設為模式26,即垂直模式。如果A=B,那麼確定MPM的方法如下:①如果A和B都不是角度預測模式,那麼MPM分別設定為平面、DC和垂直模式;②否則,MPM[0]設為A/B,MPM[1]和MPM[2]選擇A的相鄰模式,公式如下


三個最可能模式確定後,會按照模式序號進行排序。如果當前預測模式等同於三個最可能模式之一,那麼只有該模式在MPM的索引值會傳遞給解碼器,否則將會傳遞一個5位且不經過CABAC的語法元素表示在MPM之外所選擇的幀內預測模式。

該部分的實現如下:

/** Get most probable intra modes
*\param   uiAbsPartIdx
*\param   uiIntraDirPred  pointer to the array for MPM storage
*\param   piMode          it is set with MPM mode in case both MPM are equal. It is used to restrict RD search at encode side.
*\returns Number of MPM
*/
Int TComDataCU::getIntraDirLumaPredictor( UInt uiAbsPartIdx, Int* uiIntraDirPred, Int* piMode  )
{
  TComDataCU* pcTempCU;
  UInt        uiTempPartIdx;
  Int         iLeftIntraDir, iAboveIntraDir;
  Int         uiPredNum = 0;
  
  // Get intra direction of left PU
  pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx );//獲取左方PU
  
  iLeftIntraDir  = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX;//左方PU為空或非Intra,左方的PU模式則設定為DC,否則設定為左方PU的模式
  
  // Get intra direction of above PU
  pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx, true, true );//獲取上方PU
  
  iAboveIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX;//上方PU為空或非Intra,上方的PU模式則設定為DC,否則設定為上方PU的模式
  
  uiPredNum = 3;
  if(iLeftIntraDir == iAboveIntraDir)
  {
	  //模式A和模式B相等的情況
    if( piMode )
    {
      *piMode = 1;
    }
    
    if (iLeftIntraDir > 1) // angular modes
    {
		//如果二者都是角度預測,那麼MPM[0]設定為該角度模式,MPM[1]和MPM[2]設定為該模式的相鄰模式
      uiIntraDirPred[0] = iLeftIntraDir;
      uiIntraDirPred[1] = ((iLeftIntraDir + 29) % 32) + 2;
      uiIntraDirPred[2] = ((iLeftIntraDir - 1 ) % 32) + 2;
    }
    else //non-angular
    {
		//如果二者都不是角度預測,那麼三種模式分別設定為平面、DC和垂直模式
      uiIntraDirPred[0] = PLANAR_IDX;
      uiIntraDirPred[1] = DC_IDX;
      uiIntraDirPred[2] = VER_IDX; 
    }
  }
  else
  {
	  //模式A與模式B不等
    if( piMode )
    {
      *piMode = 2;
    }
    uiIntraDirPred[0] = iLeftIntraDir;//MPM[0]和MPM[1]分別設定為這兩種模式
    uiIntraDirPred[1] = iAboveIntraDir;
    
    if (iLeftIntraDir && iAboveIntraDir ) //both modes are non-planar
    {
		//當兩個模式都不是平面模式時,MPM[2]設定為平面模式
      uiIntraDirPred[2] = PLANAR_IDX;
    }
    else
    {
		//至少有一個是平面模式時,如果另一個是DC模式,那麼MPM[2]設定為垂直模式;如果另一個不是DC模式,那麼MPM[2]設定為DC模式
      uiIntraDirPred[2] =  (iLeftIntraDir+iAboveIntraDir)<2? VER_IDX : DC_IDX;
    }
  }
  
  return uiPredNum;
}

(2)色度幀內預測模式的匯出

為了在增加了預測模式的數量的同時降低傳輸負載,HEVC定義了INTER_DERIVED模式表示該色度PU使用亮度PU相同的預測模式。對於一個PU,只有平面、垂直、水平、DC和匯出模式可供選擇。如果一個色度PU選擇了匯出模式,那麼幀內預測編碼按照對應的亮度PU的模式進行。角度預測模式34用於在推導模式為前四種模式時做替換之用,替換原則如下表:


(3)幀內預測模式編碼的語法結構

經過排序的三個最可能模式分別為SMPM[0]、SMPM[1]和SMPM[2]。prev_intra_luma_pred_flag表示亮度幀內預測模式等於三者之一,若相等,則定義mpm_idx表示SMPM[mpm_idx]為選定的幀內預測模式;否則,定義語法元素rem_intra_luma_pred_mode直接指定選定的幀內預測模式取值為[0,31]。亮度模式匯出方法如下:①設L=rem_intra_luma_pred_mode;②對於i=0,1,2,若L≥SMPM[i],則L++。
對於亮度幀內預測模式,匯出模式出現的概率最高,其餘四種的概率基本一致。語法元素intra_chroma_pred_mode二值化的方法如下表:


5、編碼演算法

由於HEVC定義的模式數量較多,在大多數場合下對所有模式進行率失真計算是不現實的。在HEVC參考程式碼中,SATD用於在進行率失真優化前篩選候選的亮度幀內預測模式。進入Full RDO的預測模式的數量根據對應PU的大小確定:4×4和8×8時8個,其他尺寸時3個。對於這些模式以及MPM中的候選模式,進行預測和變換操作獲取所需編碼資料量和對應失真。最後率失真最低的模式被選中。對於色度幀內編碼,由於模式數量較少,所有可能的預測模式都會基於率失真代價進行評估。
學術界對HEVC提出了多種快速幀內預測的演算法。其中之一就是減少塊尺寸的種類,如根據空間相鄰塊之前的判決的快速CU尺寸和模式判定演算法、根據貝葉斯判決準則的CU篩選演算法。另一種是減少候選幀內模式的方法,如在率失真計算階段減少候選模式數量並強制使用最可能模式的方法、根據源影象方向性和相鄰塊進行模式預篩選的方法等。

6、HEVC與H.264幀內編碼的主要區別

HEVC和H.264幀內編碼都是基於空間影象預測的方法,預測後都會進行變換編碼,而HEVC的演算法更加複雜。
第一,為了同HEVC的塊分割結構一致,並且更適合於平滑影象區域的編碼,HEVC支援的預測塊大小最大可到32×32;
第二,預測的方向從H.264的8種增加到了33種用於提升對方向性結構的預測效果。HEVC可選的所有預測方向適用於亮度和色度,而H.264適用於色度的方向只有水平和垂直兩種。並且HEVC針對垂直、水平和DC模式在邊界畫素上進行了優化;
第三,HEVC在參考資料部分缺失的情況下可以對其進行補全,並在這種情況下可以使用所有預定的預測模式;
第四,預測模式編碼次用了同H.264不同的方法,使用三個最可能模式進行預測,且選中的模式始終作為色度分量的有效候選模式之一;
以上區別總結如下表:


相關推薦

HEVC學習研究42HEVC編碼原理實現

4、編碼幀內預測模式 大量增加可選擇的預測模式可以提供更高的編碼效率,同時要求編碼預測模式有更加高效的方法降低更多模式帶來的負擔。與H.264採用一個最可能模式不同的是,對於亮度分量,三個最可能模式用於預測實際的幀內預測模式。同時,也考慮了三個最可能模式中的冗餘資訊,重複的

HEVC學習研究39HEVC編碼原理實現

【前面N篇博文都講了一些HEVC幀內預測的程式碼結構和簡單的方法,但是尚未對整體的演算法和實現做一個比較完整的描述。本篇藉助參考文獻《High Efficiency Video Coding (HEVC) -- Algorithms and Architectures》的

HEVC學習研究26HEVC的算數編碼實現

關於HEVC的前25篇博文全文發表在新浪部落格,地址為:http://blog.sina.com.cn/s/articlelist_1376260467_0_1.html。從第26篇開始部落格全文發在

機器學習基石筆記綜述

model 但是 目標 學習 imp 選擇 處理 定義 條件 課程定位: 註重基礎、故事性 機器學習定義: data - Algo - improve 機器學習使用條件 1、有優化的目標,可量化的。 2、規則不容易寫下來,需要學習。 3、要有數據 一個可能的推薦

機器學習基石筆記感知機

證明 機器學習 sign 線性可分 缺點 學習 犯錯 nbsp 錯誤 感知機算法: 1、首先找到點,使得sign(wt * xt) != yt,   那麽如果yt = 1,說明wt和xt呈負角度,wt+1 = wt + xt能令wt偏向正角度。   如果yt = -1, 說

機器學習基石筆記不同類型的機器學習

質數 一個 非監督 輸入 編號 不同 象棋 按順序 pla 一、不同的output 1、二分類 2、多分類 3、回歸問題 4、structured learn: 從一個句子 -> 句子每個 詞的詞性。   輸出是一個結構化的東西。   例子:蛋白質數據 ->

機器學習基石筆記無法學習

機器學習 估計 事情 永遠 pro app out 天下 oba 天下沒有白吃的午餐,從樣本內到樣本外永遠無法估計。 抽樣的話,樣本內頻率和樣本外概率相等PAC (probably approximately correct) 一個重要的事情是樣本要在總體分布中取。 E

資料結構演算法基本

一、絮絮叨叨 計劃寫一系列資料結構與演算法的部落格: 一是給自己立個flag——堅持做完, 二是記錄自己的學習過程,總結和分享知識 1、Why? 面試 =》考查基礎 =》資料結構與演算法 工作 =》有助於理解、使用框架;優化程式,提升效率、效能 鍛鍊邏輯思

資料結構演算法陣列

一、線性表 1、定義 線性表(Linear List):零個或多個數據元素的有限序列。 序列(有序):若元素存在多個,則第一個元素無前驅,最後一個無後繼,其他每個元素都有且只有一個前驅和後繼 2、數

深度學習TheanoLSTM網路-情感分析

概述 本文提供一個如何使用Theano實現使用LSTM結構的RNN例子。模型被用來通過電影綜述來進行情感分析,綜述資料來源於Large Movie Review Dataset,即IMDB。 在這個任務中,給定一個電影,這個模型能夠預測電影是posit

演算法設計分析6最大欄位

/** * 書本:《演算法分析與設計》 * 功能:若給定n個整陣列成的序列a1, a2, a3, ......an, 求該序列形如ai+a(i+1)+......+an的最大值 * 檔案:MaxSum.cpp * 時間:2014年11月30日17:37:26 * 作者:cu

HttpClient學習實戰1.使用httpClient實現getpost資訊傳輸

一般網路會給我們提供許多資料介面,我們的一些資訊並不是我們本系統提供而是第三方給我們提供的,他們通常會給我們一個提供資料來源的介面,訪問這個介面可以獲取相應的資料用於我們自己的應用中(WebService和現如今的json/xml通過http資訊的傳輸模式都是如此)。 ht

資料結構演算法貪心演算法解決揹包問題。java程式碼實現

揹包問題(貪心演算法) 貪心演算法思想 簡單的說,就是將大問題轉化為最優子問題,例如本題所要求的,揹包容量有限,要想使物品的總價值最高,那麼,我們必須儘可能的選擇權重高的(即單位價值更高)的物品進行裝載。 在揹包問題中,物品是可拆的,即可以分成任意部分進行裝載,而最終實現的目標是

SQL注入技巧拓展————4高階SQL注入:混淆繞過

【0×01】 – 簡介 大家好,這是一篇致力於文件化我們所從事的高階SQL注入技術的文章。 本文將要揭示能用於現實CMSs和WAFs程式中的高階繞過技術和混淆技術。文中所提到的SQL注入語句僅僅是一些繞過保護的方法。還有一些其他的技術能用於攻擊WEB程式,但是很不幸我們不能告訴你,因為它們就是0

資料結構演算法Huffman樹&&Huffman編碼附完整原始碼

出處:http://blog.csdn.net/ns_code/article/details/19174553 Huffman Tree簡介     赫夫曼樹(Huffman Tree),又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值{w1,

機器學習實戰系列讀書筆記之AdaBoost演算法公式推導例子講解

最近在看整合演算法AdaBoost,推薦先看李航的統計學習方法第8章,然後再看機器學習實戰第7章,李航的書上的公式推導講的很詳細了,但是很多地方對於初學者來說,還是需要時間去理解和消化的。本文將從以下幾個方面來介紹AdaBoost演算法。一、AdaBoost演算法公式推導二、

React自制全家桶分析React的虛擬DOMDiff演算法

一、React如何更新DOM內容: 1.  獲取state 資料 2.  獲取JSX模版 3.  通過資料 +模版結合,生成真實的DOM, 來顯示,以下行程式碼為例(簡稱程式碼1)  1 <div id=' abc '><span>hello

資料結構演算法內部排序之四:歸併排序快速排序含完整原始碼

前言      之所以把歸併排序和快速排序放在一起探討,很明顯兩者有一些相似之處:這兩種排序演算法都採用了分治的思想。下面來逐個分析其實現思想。歸併排序實現思想       歸併的含義很明顯就是將兩個或者兩個以上的有序表組合成一個新的有序表。歸併排序中一般所用到的是2-路歸併

實用代碼片段將json數據綁定到html元素

bsp lac website dex spl his can ace htm jQuery擴展 jQuery.fn.extend({ ‘jsonBind‘:function(json){ var dom=this; dom.find(‘[json-b

C# 16進制字符串字節數組之間的轉換

bool sub ber con tostring mat cep 字節數組 log 1 /// <summary> 2 /// 字符串轉16進制字節數組 3 /// </summary> 4 /// <param