我是靠谱客的博主 心灵美电灯胆,最近开发中收集的这篇文章主要介绍AV1技术学习之Chroma from Luma(CfL),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、Chroma from Luma原理

Chroma from Luma(CfL)是一种色度帧内预测技术,是通过建立重建亮度像素和色度像素的线性模型来预测色度像素的:

其中L^{r}表示亮度重建像素,线性模型参数α和β可以通过线性二乘法来确定:

其中M、N表示当前色度块的宽度和高度,C_{ij}表示位于(i,j)的真实色度像素值。

通过线性二乘法的计算,可以直接在编解码端通过计算获得α和β参数,而不需要将α和β写入码流中,但是最小二乘法的计算复杂度太高,并且在解码端无法得到真实的色度像素值,为了解决上述问题,提出了一种编码α计算β来获得线性参数的方法,如下图所示:

通过对亮度重建像素去均值获得亮度像素的“AC” Contribution,可以降低α和β的计算复杂度,如下所示:

为了降低计算复杂度,AV1中α共有16个候选值,范围是0-2,步长为1/8,在编码端,通过率失真优化准则选出的伸缩因子α,如下公式所示;之后再将选出的α写入码流传给解码端,解码端通过在码流中解码可以获得α值

同时,由于在解码端无法获得真实的色度像素值,所以AV1使用当前块的DC预测值(即左边和上边相邻像素块的均值)来近似代替beta ^{AC},得到其最终线性模型如下所示:

其中,L^{AC}是去平均后的重建亮度像素(对于4:2:2和4:2:0格式的YUV需要对其重建亮度块进行下采样);DC指的是当前色度块的DC模式的预测值(即相邻参考像素的均值)。

二、AV1中CfL技术实现 

在AV1中,伸缩因子α共有16个值,范围是0-2,步长为1/8,每个α都有三个符号,即positive、negative和zero,为了减少复杂度,AV1分别将U和V分量的α的值和符号进行了联合编码。

  /*! brief Chroma from Luma: Joint sign of alpha Cb and alpha Cr */
  int8_t cfl_alpha_signs;
  /*! brief Chroma from Luma: Index of the alpha Cb and alpha Cr combination */
  uint8_t cfl_alpha_idx;

U和V分量alpha的符号如下表所示:

SignU/SignVName of SignU/SignV
0CFL_SIGN_ZERO
1CFL_SIGN_NEG
2CFL_SIGN_POS

AV1中使用cfl_alpha_signs语法元素对U/V分量的符号进行联合编码,cfl_alpha_signs的值如下表所示:

cfl_alpha_signsName of signUName of signV
0CFL_SIGN_ZEROCFL_SIGN_NEG
1CFL_SIGN_ZEROCFL_SIGN_POS
2CFL_SIGN_NEGCFL_SIGN_ZERO
3CFL_SIGN_NEGCFL_SIGN_NEG
4CFL_SIGN_NEGCFL_SIGN_POS
5CFL_SIGN_POSCFL_SIGN_ZERO
6CFL_SIGN_POSCFL_SIGN_NEG
7CFL_SIGN_POSCFL_SIGN_POS

在代码中的实现(js表示JointSign,即UV分量的联合符号):

// CFL_SIGN_U is equivalent to (js + 1) / 3 for js in 0 to 8
#define CFL_SIGN_U(js) (((js + 1) * 11) >> 5)
// CFL_SIGN_V is equivalent to (js + 1) % 3 for js in 0 to 8
#define CFL_SIGN_V(js) ((js + 1) - CFL_SIGNS * CFL_SIGN_U(js))

AOM中与CFL相关的函数实现:

  • cfl_rd_pick_alpha 选出U/V分量各自的最佳alpha值并返回相应alpha的码率 Part 1:分别计算U/V分量对应alpha符号为零情况下的RD Cost Part 2:分别计算U/V分量符号不为零情况下的RD Cost,并记录最佳的jointSign和alpha值
  • cfl_store 对恢复出的亮度重建像素进行下采样并保存
  • cfl_subsampling_hbd或者cfl_subsampling_lbd 在YUV4:2:2或者YUV4:2:0格式下对亮度像素进行下采样
  • cfl_store_dc_pred 保存DC预测值,将DC值按行保存
  • cfl_load_dc_pred 加载DC预测值,将DC值加载到整个色度块中
  • cfl_predict_block 进行CFL预测
  • cfl_compute_parameters 计算AC Contribute 下采样的重建亮度像素-平均后的下采样的重建亮度像素(平均和减法操作)
  • cfl_get_predict_lbd_fn或者cfl_get_predict_hbd_fn 计算 C = alpha * AC + DC
  • write_cfl_alphas 将jointSign和U/V分量的alpha的绝对值写入码流中

最后

以上就是心灵美电灯胆为你收集整理的AV1技术学习之Chroma from Luma(CfL)的全部内容,希望文章能够帮你解决AV1技术学习之Chroma from Luma(CfL)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部