環路濾波(四):LMCS

LMCS( luma mapping with chroma scaling)是VVC中新增的技術,其位於去方塊濾波之前,也被稱爲環路重整形(in-loop reshaper)。該技術用於HDR和SDR視頻中。

LMCS包括兩部分:(1)基於自適應分段線性模型的環內亮度映射;(2)基於亮度的色度殘差縮放;

 

上圖是解碼端的LMCS框架,上面是亮度處理下面是色度處理。淡藍色框在映射域(mapped domain)包括反量化、反變換、亮度幀內預測、亮度預測值和殘差值相加;非陰影框在普通域(非映射)(original domain)包括環路濾波、運動補償、色度幀內預測、色度預測值和殘差值相加、DPB中參考圖像存取。淺黃色框是LMCS相關功能,包括亮度信號正向和逆向映射、基於亮度的色度縮放。SPS中有一個標誌位控制LMCS功能開啓。

基於分段線性模型的環內亮度映射

環內亮度映射是調整輸入信號的動態範圍來提高壓縮效率。對於HDR圖像其動態範圍很高可能需要10比特才能表示,而顯示設備可能只有8比特這就需要色調映射改變信號的範圍。

亮度映射通過一個前向映射函數FwdMap和與之對應的逆向映射函數InvMap實現。FwdMap是一個分段線性模型,有16個均勻分段。InvMap可由FwdMap推導出,所以碼流中只需傳輸FwdMap函數。

亮度映射模型在tile組級別( tile group level)上傳輸,即每個tile組的模型相互獨立。首先傳輸一個標誌位表示當前tile組是否存在分段映射模型,如果存在則傳輸相應模型參數。tile組中還存在另外一個標誌位表示當前tile組是否使用LCMS。

分段線性模型將輸入信號的動態範圍映射到16個等長區間,每個區間的線性映射參數用映射到該區間的碼字數表示。以10比特輸入爲例,2^10=1024,每個區間默認有1024/16=64個碼字,區間實際傳輸的碼字數用來計算縮放因子和調整映射函數。

FwdMap的每個分段區間由InputPivot[]和MappedPivot[]定義。InputPivot[]和MappedPivot[]按下列方法生成(假設輸入信號爲10比特):

1)OrgCW = 64
2)For i = 0:16, InputPivot[ i ] = i * OrgCW
3)For i=0:16, MappedPivot[i] is calculated as follows:  
MappedPivot[ 0 ] = 0;
for( i = 0; i <16 ; i++)
  MappedPivot[ i + 1 ] = MappedPivot[ i ] + SignalledCW[ i ]
SignalledCW[ i ]是第i個分段區間傳輸的碼字數。

映射過程(前向或逆向)可以通過 look-up-tables (LUT)或動態計算(on-the-fly computation)實現。

如果使用LUT,每個tile組可以預先計算和存儲FwdMapLUT和InvMapLUT,然後可以通過FwdMap(Y_pred)=FwdMapLUT[Y_pred]和InvMap(Y_pred)=InvMapLUT[Y_pred]進行前向和逆向映射。

如果使用動態計算,以前向映射FwdMap 爲例,爲了得到亮度像素所屬的區間,首先像素值要右移6位得到所屬區間,然後檢索該區間的模型參數並使用動態計算得到映射值。假設區間索引爲i,令a1=InputPivot[i],a2=InputPivot[i+1],b1=MappedPivot[i],b2=MappedPivot[i+1],則映射函數可以表示爲:

 

逆映射InvMap 過程類似,只不過上面比特右移操作換成條件檢測,因爲映射域的區間不是均勻劃分的。

基於亮度的色度殘差縮放

如果使用了亮度映射,且當前tile組沒有使用dual tree partition,則需要一個額外的標誌位表示是否使用基於亮度的色度殘差縮放。

如果沒有使用亮度映射或當前tile組使用了dual tree partition,不允許使用基於亮度的色度殘差縮放。且當色度塊小於等於4時也不允許使用基於亮度的色度殘差縮放。

色度殘差縮放依賴於相應亮度預測塊平均值,計算方式如下:

 

int  Reshape::calculateChromaAdj(Pel avgLuma)
{
  int lumaIdx = Clip3<int>(0, (1<<m_lumaBD) - 1, avgLuma);
  int iAdj = m_chromaAdjHelpLUT[getPWLIdxInv(lumaIdx)];
  return(iAdj);
}

整個色度塊的縮放因子都相同,縮放過程如下:

感興趣的請關注微信公衆號Video Coding

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章