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()

解码流程

  1. 检查色度模式

    if tile_group.UVMode == Y_MODE.UV_CFL_PRED:
        self.__read_cfl_alphas(av1)
    
  2. 解码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
    

预测流程

  1. 计算亮度平均值

    lumaAvg = sum(lumaBlock) / (w * h)
    
  2. 计算色度预测

    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预测的优势

  1. 利用相关性:充分利用亮度和色度之间的相关性
  2. 减少编码:通过亮度预测色度,减少色度残差
  3. 自适应:Alpha参数可以根据块特征自适应调整

总结

CFL预测利用亮度和色度之间的相关性,通过亮度信息预测色度,减少色度编码开销。它是AV1帧内预测体系的重要补充,特别适合处理亮度和色度相关性强的图像内容。


参考资源:

上一篇: 调色板预测

posted @ 2026-01-10 07:50  chai51  阅读(1)  评论(0)    收藏  举报