概述
一、Chroma from Luma原理
Chroma from Luma(CfL)是一种色度帧内预测技术,是通过建立重建亮度像素和色度像素的线性模型来预测色度像素的:
其中表示亮度重建像素,线性模型参数α和β可以通过线性二乘法来确定:
其中M、N表示当前色度块的宽度和高度,表示位于(i,j)的真实色度像素值。
通过线性二乘法的计算,可以直接在编解码端通过计算获得α和β参数,而不需要将α和β写入码流中,但是最小二乘法的计算复杂度太高,并且在解码端无法得到真实的色度像素值,为了解决上述问题,提出了一种编码α计算β来获得线性参数的方法,如下图所示:
通过对亮度重建像素去均值获得亮度像素的“AC” Contribution,可以降低α和β的计算复杂度,如下所示:
为了降低计算复杂度,AV1中α共有16个候选值,范围是0-2,步长为1/8,在编码端,通过率失真优化准则选出的伸缩因子α,如下公式所示;之后再将选出的α写入码流传给解码端,解码端通过在码流中解码可以获得α值
同时,由于在解码端无法获得真实的色度像素值,所以AV1使用当前块的DC预测值(即左边和上边相邻像素块的均值)来近似代替,得到其最终线性模型如下所示:
其中,是去平均后的重建亮度像素(对于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/SignV | Name of SignU/SignV |
0 | CFL_SIGN_ZERO |
1 | CFL_SIGN_NEG |
2 | CFL_SIGN_POS |
AV1中使用cfl_alpha_signs语法元素对U/V分量的符号进行联合编码,cfl_alpha_signs的值如下表所示:
cfl_alpha_signs | Name of signU | Name of signV |
0 | CFL_SIGN_ZERO | CFL_SIGN_NEG |
1 | CFL_SIGN_ZERO | CFL_SIGN_POS |
2 | CFL_SIGN_NEG | CFL_SIGN_ZERO |
3 | CFL_SIGN_NEG | CFL_SIGN_NEG |
4 | CFL_SIGN_NEG | CFL_SIGN_POS |
5 | CFL_SIGN_POS | CFL_SIGN_ZERO |
6 | CFL_SIGN_POS | CFL_SIGN_NEG |
7 | CFL_SIGN_POS | CFL_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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复