4.5 CFL预测(Chroma from Luma)
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
CFL预测(Chroma from Luma)是AV1帧内预测中的一种特殊色度预测模式,基于亮度信息来预测色度,利用亮度和色度之间的相关性。这是一种特殊的色度预测模式,只用于色度平面。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
CFL预测概述
位置: src/frame/decoding_process.py - predict_chroma_from_luma()
规范文档: 7.11.2.8 Chroma from luma prediction process
功能说明
CFL预测基于亮度信息来预测色度,利用亮度和色度之间的相关性。这是一种特殊的色度预测模式,只用于色度平面。
应用场景
- 色度预测:当色度模式为
UV_CFL_PRED时使用 - 利用亮度相关性:亮度和色度通常有较强的相关性
- 减少色度编码开销:通过亮度信息预测色度,减少需要编码的色度残差
CFL Alpha解码
位置: src/tile/tile_group.py - __read_cfl_alphas()
解码流程
-
检查色度模式
if tile_group.UVMode == Y_MODE.UV_CFL_PRED: self.__read_cfl_alphas(av1) -
解码Alpha值
cfl_alpha_u = read_S(av1, 'cfl_alpha_u') cfl_alpha_v = read_S(av1, 'cfl_alpha_v') tile_group.CflAlphaU = cfl_alpha_u - CFL_ALPHA_MAX tile_group.CflAlphaV = cfl_alpha_v - CFL_ALPHA_MAX
预测流程
-
计算亮度平均值
lumaAvg = sum(lumaBlock) / (w * h) -
计算色度预测
pred[i][j] = Clip1( lumaAvg + Round2((lumaBlock[i][j] - lumaAvg) * alpha, shift), BitDepth)
CFL预测原理
CFL预测基于以下假设:
- 亮度和色度之间存在线性关系
- 色度值可以通过亮度值的线性变换得到
- Alpha参数控制线性关系的强度
CFL预测流程图
graph TD
A[CFL预测开始] --> B{色度模式为UV_CFL_PRED?}
B -->|否| C[跳过CFL预测]
B -->|是| D[解码CFL Alpha值<br/>CflAlphaU CflAlphaV]
D --> E[获取亮度块<br/>lumaBlock]
E --> F[计算亮度平均值<br/>lumaAvg]
F --> G[遍历每个像素位置]
G --> H[计算色度预测<br/>pred = lumaAvg + alpha * lumaDelta]
H --> I[裁剪到有效范围<br/>Clip1]
I --> J{还有像素?}
J -->|是| G
J -->|否| K[CFL预测完成]
style A fill:#e1f5ff
style B fill:#fff9c4
style K fill:#c8e6c9
CFL预测的优势
- 利用相关性:充分利用亮度和色度之间的相关性
- 减少编码:通过亮度预测色度,减少色度残差
- 自适应:Alpha参数可以根据块特征自适应调整
总结
CFL预测利用亮度和色度之间的相关性,通过亮度信息预测色度,减少色度编码开销。它是AV1帧内预测体系的重要补充,特别适合处理亮度和色度相关性强的图像内容。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- 预测实现:
src/reconstruction/prediction.py - Tile解码:
src/tile/tile_group.py - 解码流程:
src/frame/decoding_process.py
- 预测实现:
上一篇: 调色板预测

浙公网安备 33010602011771号