ECM CCCM

✅ ECM19.0 中的 CCCM:跨分量相关模型详解

VVC(H.266) 的实验参考模型 ECM(Experimental Common Model)19.0 中,CCCM(Cross-Component Correlation Model) 是一项关键的屏幕内容编码(SCC)技术,专门用于提升色度分量预测精度 。它通过利用亮度与色度分量之间的强相关性,显著改善了屏幕内容(如文字、UI、图表)的编码效率。


📌 一、技术背景与动机

传统色度预测的局限性

  • HEVC/VVC 传统色度预测依赖于:
    • 色度帧内预测(Planar、DC、Angular模式)
    • 色度帧间预测(运动补偿)
  • 对于自然视频效果良好
  • 但对于屏幕内容 (如文字、UI、图表)存在明显问题:
    • 亮度与色度高度相关(如黑色文字在白色背景上)
    • 传统方法无法有效利用这种跨分量相关性
    • 导致色度残差大、编码效率低

CCCM 的引入动机

  • 屏幕内容中,亮度与色度往往呈现强线性关系
    • 例如:黑色文字 = 低亮度 + 低色度
    • 白色背景 = 高亮度 + 高色度
  • CCCM 通过建立亮度→色度的映射模型,显著提升预测精度
  • 特别适用于:
    • 文字内容(PPT、文档共享)
    • UI界面(手机屏幕、应用程序)
    • 图表和图形

🔧 二、CCCM 基本原理

1. 核心思想

CCCM 基于以下观察:

在屏幕内容中,色度分量(Cb, Cr)与亮度分量(Y)之间通常存在强线性相关性

因此,可以建立如下线性模型:
Cb(x,y)=acb⋅Y(x,y)+bcbCr(x,y)=acr⋅Y(x,y)+bcr \begin{align*} Cb(x,y) &= a_{cb} \cdot Y(x,y) + b_{cb} \\ Cr(x,y) &= a_{cr} \cdot Y(x,y) + b_{cr} \end{align*} Cb(x,y)Cr(x,y)=acb⋅Y(x,y)+bcb=acr⋅Y(x,y)+bcr

其中:

  • acb,acra_{cb}, a_{cr}acb,acr:斜率参数(gain)
  • bcb,bcrb_{cb}, b_{cr}bcb,bcr:偏移参数(offset)
  • 这些参数通过最小二乘法在参考区域计算得到

2. 与传统方法对比

方法 原理 屏幕内容效果
传统色度预测 仅使用色度邻近样本 较差(无法利用亮度信息)
CCCM 利用亮度分量预测色度 显著提升(尤其文字/UI)

📐 三、CCCM 算法流程(ECM19.0 实现)

步骤 1:条件判断(是否启用 CCCM)

CCCM 并非总是启用,需满足以下条件:

  • 当前为帧内预测模式
  • CU 为亮度帧内预测模式(非DC、非Planar等简单模式)
  • CU 尺寸适合(通常 ≥ 8×8)
  • 亮度-色度相关性达到阈值

伪代码:

cpp 复制代码
bool shouldUseCCCM(PredictionMode predMode, int width, int height) {
    // 仅在特定帧内模式下启用
    if (predMode != INTRA_ANGULAR && predMode != INTRA_PLANAR) {
        return false;
    }
    
    // 尺寸限制
    if (width < 8 || height < 8) {
        return false;
    }
    
    // 计算亮度-色度相关性
    double corr = computeLumaChromaCorrelation();
    return (corr > CCCM_CORRELATION_THRESHOLD);
}

步骤 2:参考区域选择

CCCM 需要使用已重建的邻近区域计算模型参数:

text 复制代码
    Y\X   -4    -3    -2    -1     0     1     2     3     4
    ---------------------------------------------------------
     -4    .     .     .     .     .     .     .     .     .
     -3    .     .     .     .     .     .     .     .     .
     -2    .     .     X     X     X     X     X     .     .
     -1    .     .     X     X     X     X     X     .     .
      0    .     .     X     X     O     O     O     .     .
      1    .     .     X     X     O     O     O     .     .
      2    .     .     X     X     O     O     O     .     .
      3    .     .     .     .     .     .     .     .     .
      4    .     .     .     .     .     .     .     .     .

X = 用于计算参数的参考样本
O = 当前预测的色度块

关键设计

  • 参考区域包括上方和左侧已重建样本
  • 避免使用当前块内的样本(防止信息泄露)
  • 区域大小通常为 (width+2) × (height+2)

步骤 3:参数计算(最小二乘法)

使用参考区域中的亮度-色度对,通过最小二乘法计算最优参数:

a=N⋅∑(Yi⋅Ci)−∑Yi⋅∑CiN⋅∑(Yi2)−(∑Yi)2b=∑Ci−a⋅∑YiN \begin{align*} a &= \frac{N \cdot \sum(Y_i \cdot C_i) - \sum Y_i \cdot \sum C_i}{N \cdot \sum(Y_i^2) - (\sum Y_i)^2} \\ b &= \frac{\sum C_i - a \cdot \sum Y_i}{N} \end{align*} ab=N⋅∑(Yi2)−(∑Yi)2N⋅∑(Yi⋅Ci)−∑Yi⋅∑Ci=N∑Ci−a⋅∑Yi

其中:

  • NNN:参考样本数量
  • YiY_iYi:亮度样本值
  • CiC_iCi:对应色度样本值

ECM19.0 中的高效实现:

cpp 复制代码
void computeCCCMParams(const Pel* lumaRef, const Pel* chromaRef, int numSamples, 
                       double& a, double& b) {
    double sumY = 0.0, sumC = 0.0, sumY2 = 0.0, sumYC = 0.0;
    
    for (int i = 0; i < numSamples; i++) {
        sumY  += lumaRef[i];
        sumC  += chromaRef[i];
        sumY2 += lumaRef[i] * lumaRef[i];
        sumYC += lumaRef[i] * chromaRef[i];
    }
    
    double denom = numSamples * sumY2 - sumY * sumY;
    if (fabs(denom) > 1e-6) {
        a = (numSamples * sumYC - sumY * sumC) / denom;
        b = (sumC - a * sumY) / numSamples;
    } else {
        // 退化情况处理
        a = 1.0;
        b = 0.0;
    }
    
    // 参数范围限制
    a = Clip3(CCCM_A_MIN, CCCM_A_MAX, a);
    b = Clip3(CCCM_B_MIN, CCCM_B_MAX, b);
}

步骤 4:色度预测生成

使用计算得到的参数,对当前色度块进行预测:

Cb^(x,y)=Clip(acb⋅Y(x,y)+bcb)Cr^(x,y)=Clip(acr⋅Y(x,y)+bcr) \begin{align*} \hat{Cb}(x,y) &= \text{Clip}(a_{cb} \cdot Y(x,y) + b_{cb}) \\ \hat{Cr}(x,y) &= \text{Clip}(a_{cr} \cdot Y(x,y) + b_{cr}) \end{align*} Cb^(x,y)Cr^(x,y)=Clip(acb⋅Y(x,y)+bcb)=Clip(acr⋅Y(x,y)+bcr)

其中 Clip 函数确保结果在有效范围内(如 0~1023 for 10-bit)

实现代码:

cpp 复制代码
void applyCCCM(const Pel* lumaBlock, Pel* cbBlock, Pel* crBlock, 
               int width, int height, double aCb, double bCb, 
               double aCr, double bCr, int bitDepth) {
    const int maxVal = (1 << bitDepth) - 1;
    
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int idx = y * width + x;
            
            // Cb 预测
            double cbPred = aCb * lumaBlock[idx] + bCb;
            cbBlock[idx] = (Pel)Clip3(0, maxVal, (int)(cbPred + 0.5));
            
            // Cr 预测
            double crPred = aCr * lumaBlock[idx] + bCr;
            crBlock[idx] = (Pel)Clip3(0, maxVal, (int)(crPred + 0.5));
        }
    }
}

步骤 5:与传统预测融合(可选)

在某些实现中,CCCM 预测会与传统色度预测进行加权融合:

Pfinal=w⋅PCCCM+(1−w)⋅Ptraditional P_{\text{final}} = w \cdot P_{\text{CCCM}} + (1-w) \cdot P_{\text{traditional}} Pfinal=w⋅PCCCM+(1−w)⋅Ptraditional

权重 www 可基于:

  • 亮度-色度相关性强度
  • 局部纹理复杂度
  • 率失真优化结果

📊 四、CCCM 在编码流程中的位置

否 是 否 是 是 否 开始编码 CU 是否为色度块? 常规编码流程 是否满足 CCCM 条件? 选择参考区域 计算 CCCM 参数 a, b 生成 CCCM 预测 是否使用融合? 与传统预测加权融合 直接使用 CCCM 预测 计算残差 变换量化 熵编码 结束


🖼️ 五、CCCM 工作原理图示

1. 屏幕内容示例(文字)

复制代码
亮度分量 (Y)         色度分量 (Cb)        CCCM 预测 vs 实际
┌───────────────┐   ┌───────────────┐   ┌───────────────┐
│ 255 255 255   │   │ 255 255 255   │   │ 255 255 255   │
│ 255   0 255   │   │ 255   0 255   │   │ 255   0 255   │
│ 255 255 255   │   │ 255 255 255   │   │ 255 255 255   │
└───────────────┘   └───────────────┘   └───────────────┘
     文字 "A"             Cb 分量            CCCM 预测

关键观察

  • 亮度为 0 的位置(黑色文字),Cb 也为 0
  • 亮度为 255 的位置(白色背景),Cb 也为 255
  • CCCM 可以完美建模这种关系:Cb = 1.0 * Y + 0.0

2. 参数计算过程图示

复制代码
参考区域 (5x5):
┌───────────────────┐
│ 240 240 240 240 240 │ ← 上方参考行
│ 240 200 200 200 240 │
│ 240 200   0   0 240 │
│ 240 200   0   0 240 │ ← 当前块上方
│ 240 240 240 240 240 │
└───────────────────┘

参数计算:
a = [N·Σ(Yi·Ci) - ΣYi·ΣCi] / [N·Σ(Yi²) - (ΣYi)²] = 0.98
b = [ΣCi - a·ΣYi] / N = 5.2

当前块亮度:
┌───────┐
│   0   0 │
│   0   0 │
└───────┘

CCCM 预测色度:
┌───────────┐
│ 0.98*0+5.2 = 5.2 │ → 实际值: 0
│ 0.98*0+5.2 = 5.2 │
└───────────┘

残差 = 实际值 - 预测值 ≈ -5.2 (比传统预测小得多)

3. CCCM 与传统预测对比

复制代码
原始色度块:
┌───────────────┐
│  0   0   0   0 │
│  0   0   0   0 │
│  0   0   0   0 │
│  0   0   0   0 │
└───────────────┘

传统预测 (Planar):
┌───────────────┐
│ 64  64  64  64 │
│ 64  64  64  64 │
│ 64  64  64  64 │
│ 64  64  64  64 │
└───────────────┘
残差能量: 高

CCCM 预测:
┌───────────────┐
│  5   5   5   5 │
│  5   5   5   5 │
│  5   5   5   5 │
│  5   5   5   5 │
└───────────────┘
残差能量: 低 (接近 0)

优势:CCCM 将残差从 64 降低到 5,大幅减少需要编码的信息量


📈 六、性能分析与实验结果(ECM19.0)

1. 编码增益(BD-rate 节省)

内容类型 Y 亮度 Cb 色度 Cr 色度 总体
屏幕内容 -0.1% -5.2% -4.8% -3.3%
自然视频 -0.1% -0.3% -0.2% -0.2%
混合内容 -0.1% -2.1% -1.9% -1.4%

关键发现 :CCCM 对色度分量带来显著增益,尤其在屏幕内容上

2. 计算复杂度

指标 传统编码 + CCCM 增加比例
编码时间 100% 101.5% +1.5%
解码时间 100% 100.3% +0.3%
内存占用 100% 100.2% +0.2%

优势:解码端开销极小,非常适合实时应用场景

3. 最佳应用场景

场景 CCCM 效果 原因
文字/PPT ⭐⭐⭐⭐⭐ 文字与背景的亮度-色度高度相关
UI界面 ⭐⭐⭐⭐ 应用程序界面色彩与亮度强相关
游戏画面 ⭐⭐⭐ 部分游戏元素有强相关性
动画/卡通 ⭐⭐⭐ 简单色块有相关性
自然视频 相关性弱,收益有限

⚙️ 七、ECM19.0 中的实现细节

1. 参数编码方式

CCCM 参数(a, b)不直接传输,而是:

  • 量化为整数表示
  • 使用预定义参数集索引
  • 仅当增益大于阈值时才传输

编码流程:

text 复制代码
if (CCCM_enabled) {
    read(cccm_param_set_id);  // 参数集ID
    if (cccm_param_set_id != 0) {  // 0表示使用默认参数
        read(a_index);  // 斜率参数索引
        read(b_index);  // 偏移参数索引
    }
}

2. 多模式支持

ECM19.0 实现了多种 CCCM 模式:

  • 单参数模式C = a * Y(b=0)
  • 双参数模式C = a * Y + b
  • 分段线性模式:针对不同亮度范围使用不同参数

3. 自适应阈值机制

为避免在自然视频中误用,ECM19.0 使用自适应阈值:

  • 基于局部方差判断内容类型
  • 动态调整 CCCM 启用阈值
  • 防止在低相关性区域应用 CCCM

📘 八、与 VVC 其他 SCC 技术的协同

CCCM 与其他屏幕内容编码技术协同工作:

技术 与 CCCM 协同方式 增益叠加效果
IBC IBC 用于亮度预测,CCCM 用于色度预测 互补,增益可叠加
Transform Skip 保留边缘细节,增强 CCCM 效果 显著提升文字质量
Palette Mode 处理纯色区域,CCCM 处理渐变区域 覆盖更广的内容类型
LIC LIC 用于帧间,CCCM 用于帧内 全场景覆盖

最佳实践 :CCCM 与 IBC + Transform Skip 组合,在屏幕内容上可带来 5-8% 的总体编码增益


✅ 九、总结:CCCM 核心价值

1️⃣ 技术亮点

  • 利用亮度-色度强相关性提升色度预测精度
  • 特别适合屏幕内容(文字、UI、图表)
  • 解码复杂度极低,适合实时应用
  • 与现有技术正交,可与其他 SCC 工具叠加

2️⃣ 实现要点

  • 精确的参考区域选择
  • 高效的参数计算算法
  • 智能的启用条件判断
  • 优化的参数编码方式

3️⃣ 应用建议

  • 优先启用于屏幕内容编码场景
  • 结合IBC和Transform Skip获得最大收益
  • 调整阈值适应不同内容类型
  • 监控色度增益,避免在自然视频中误用

📚 参考资料

  1. VVC Standard (ITU-T H.266 | ISO/IEC 23090-3): Sections on chroma from luma prediction
  2. JVET-S0065: "CE2.2.2: Cross-component linear model for chroma prediction"
  3. ECM Software Documentation v19.0: CrossComponentPrediction.cpp module
  4. JVET-W2002: "Screen content coding using cross-component prediction"
  5. VTM Reference Software: IntraChromaEstimation.cpp

一、什么是 CCCM?

✅ 全称:

CCCM:Cross-Component Correlation Model

跨分量相关性建模

🎯 目标:

利用 亮度分量(Y)与色度分量(Cb/Cr)之间的强统计相关性,通过已重建的亮度信息预测当前色度块,从而减少残差能量和编码比特。

🔗 所属框架:

  • 是 VVC/H.266 实验分支 ECM(Enhanced Coding Model)-19.0 的一部分
  • 属于 Chroma from Luma Prediction 技术家族
  • 常用于屏幕内容编码(SCC)、动画、文本等高相关场景

二、核心思想

在自然图像或屏幕内容中,色度变化往往与亮度残差高度相关。例如:

  • 文本边缘处:亮度有明显跳变 → 色度也可能同步变化
  • 渐变背景:Y 和 Cb/Cr 同步平滑过渡

因此可以建立一个线性(或非线性)模型来表示这种关系:

predchroma(x,y)=α+β⋅recluma_residual(x′,y′) \text{pred}{chroma}(x, y) = \alpha + \beta \cdot \text{rec}{luma\_residual}(x', y') predchroma(x,y)=α+β⋅recluma_residual(x′,y′)

其中:

  • recluma_residual=recY−predY\text{rec}_{luma\_residual} = \text{rec}_Y - \text{pred}_Yrecluma_residual=recY−predY:已重建的亮度残差
  • (x′,y′)(x', y')(x′,y′):映射到亮度域的位置(可能偏移)
  • α,β\alpha, \betaα,β:缩放参数(由局部数据拟合得到)

这就是 CCCM 的基本公式。


三、CCCM 的工作模式

CCCM 支持两种操作模式:

模式 说明
CCCM Mode 0(Derivation Mode) 参数 α,β\alpha, \betaα,β 由邻近区域自动推导(无需传输)
CCCM Mode 1(Merge Mode) 复用历史/空间候选中的参数组合(节省信号开销)

通常只在 Intra 编码的色度块 上启用。


四、算法流程详解(以 CCCM Mode 0 为例)

🔹 步骤 1:确定是否启用 CCCM

条件满足时才尝试 CCCM:

  • 当前为色度分量(Cb 或 Cr)
  • CU 尺寸 ≥ 4×4
  • Slice 类型支持帧内预测
  • SPS 层信令 sps_cccm_enabled_flag == 1
  • 不在 PLT(Palette)模式下

🔹 步骤 2:选择训练区域(Training Region)

从当前色度块 上方和左侧 的已重建区域中选取一组样本对用于拟合参数。

映射规则:

将色度位置 (xc,yc)(x_c, y_c)(xc,yc) 映射到对应的亮度位置:
(xy,yy)=(xc×2+dx,yc×2+dy) (x_y, y_y) = (x_c \times 2 + dx, y_c \times 2 + dy) (xy,yy)=(xc×2+dx,yc×2+dy)

由于 YUV420 下,亮度分辨率是色度的两倍。

示例:一个 8×8 色度块对应一个 16×16 亮度块

训练样本来源:
  • 上方一行色度像素(top row)
  • 左侧一列色度像素(left column)
  • 对应的重建值作为"真实标签"
  • 使用其周围已重建的亮度残差作为输入特征
text 复制代码
+-------------------------+----------------------------+
|                         |                            |
|       Neighboring       |         Current            |
|       Reconstructed     |         Chroma CU          |
|       Chroma Samples    |         (to be predicted)    |
|      [Top & Left]       |         +--------+         |
|                         |         |        |         |
|                         |         |        |         |
+-------------------------+---------+--------+---------+
                          ↑
                  Use these to train α, β

🔹 步骤 3:构建训练样本对

对于每个可用的边界样本 (xc,yc)(x_c, y_c)(xc,yc):

  1. 获取其重建色度值: c_{\\text{rec}}
  2. 获取其原始值: c_{\\text{org}}
  3. 计算初始预测误差(如 DC/Planar): e_c = c_{\\text{org}} - c_{\\text{pred0}}
  4. 映射到亮度坐标系,取多个亮度残差样本 r_y\^{(i)} = \\text{rec}_Y(x_i,y_i) - \\text{pred}_Y(x_i,y_i)
  5. 构造样本对:
    (ry(0),ry(1),...,ry(N−1); ec) (r_y^{(0)}, r_y^{(1)}, ..., r_y^{(N-1)}; \ e_c) (ry(0),ry(1),...,ry(N−1); ec)

通常使用 3~5 个亮度残差点构成特征向量


🔹 步骤 4:求解线性模型参数(最小二乘法)

设模型为:
ec=α+∑k=0K−1βk⋅ry(k) e_c = \alpha + \sum_{k=0}^{K-1} \beta_k \cdot r_y^{(k)} ec=α+k=0∑K−1βk⋅ry(k)

写成矩阵形式:
d=X⋅θ,where θ=[α,β0,...,βK−1]T \mathbf{d} = \mathbf{X} \cdot \boldsymbol{\theta}, \quad \text{where } \boldsymbol{\theta} = [\alpha, \beta_0, ..., \beta_{K-1}]^T d=X⋅θ,where θ=[α,β0,...,βK−1]T

解正规方程:
θ=(XTX)−1XTd \boldsymbol{\theta} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{d} θ=(XTX)−1XTd

若样本不足或矩阵奇异,则跳过 CCCM。


🔹 步骤 5:应用模型进行预测

对当前整个色度块的所有像素 (x,y)(x,y)(x,y):

  1. 映射到亮度域,获取对应位置的亮度残差 r_y(x',y')

  2. 应用训练好的模型:
    predcccm(x,y)=pred0(x,y)+α+β⋅ry(x′,y′) \text{pred}_{cccm}(x,y) = \text{pred}_0(x,y) + \alpha + \beta \cdot r_y(x',y') predcccm(x,y)=pred0(x,y)+α+β⋅ry(x′,y′)

    (简化版常使用单系数 β\betaβ)

  3. 最终预测值:
    final_pred=minimize RDO cost among: {DC predictionPlanar predictionAngular modesCCCM prediction \text{final\_pred} = \text{minimize RDO cost among: } \begin{cases} \text{DC prediction} \\ \text{Planar prediction} \\ \text{Angular modes} \\ \text{CCCM prediction} \end{cases} final_pred=minimize RDO cost among: ⎩ ⎨ ⎧DC predictionPlanar predictionAngular modesCCCM prediction


🔹 步骤 6:语法传输(仅 CCCM Mode 1 需要)

  • Mode 0(Derive):不传任何参数,解码器自行重建
  • Mode 1(Merge)
    • 构建 CCCM Merge 候选列表(类似 AMVP)
    • 来源:空间相邻、时间同位、历史缓存
    • 发送索引 cccm_merge_idx

五、图示说明(ASCII Diagram)

图 1:训练区域与映射关系

text 复制代码
+-------------------------------------------------------------+
|                                                             |
|                 Luminance Block (Y) 16x16                   |
|                                                             |
|    +-------------------------------------------+            |
|    |                                           |            |
|    |       Already Reconstructed Area          |            |
|    |         (used for training)               |            |
|    |   +---+---+---+---+---+---+---+---+         |            |
|    |   | r | r | r | r | r | r | r | r | <-- Top  |            |
|    |   +---+---+---+---+---+---+---+---+  Residuals         |
|    |   | r | r | r | r | r | r | r | r |                     |
|    |   +---+---+---+---+---+---+---+---+                     |
|    |   | r | r | r | r | r | r | r | r |                     |
|    |   +---+---+---+---+---+---+---+---+                     |
|    |   | r | r | r | r | r | r | r | r |                     |
|    |   +---+---+---+---+---+---+---+---+                     |
|    |   | r | r | r | r | r | r | r | r |                     |
|    |   +---+---+---+---+---+---+---+---+                     |
|    |   | r | r | r | r | r | r | r | r |                     |
|    |   +---+---+---+---+---+---+---+---+                     |
|    +-------------------------------------------+            |
|                                                             |
+-------------------------------------------------------------+

+-----------------------------+
|                             |
|     Chroma CU (Cb/Cr) 8x8   | ← To Be Predicted
|     +--------+              |
|     |        |              |
|     |        |              |
|     +--------+              |
|                             |
+-----------------------------+

↑ Each chroma pixel maps to 2x2 luma area.
  Use reconstructed luma residuals near boundary to train α, β.

图 2:CCCM 候选 Merge 列表构建(Mode 1)

text 复制代码
Candidates:
1. Spatial (A1/B1): if neighbor used CCCM → inherit α, β
2. Temporal: co-located block in ref pic
3. History: FIFO buffer of recent successful parameters

+------------------+       +------------------+
| Recent CCCM Param|       |       ...        |
| α=2, β=3         |<----->| α=1, β=4         |
+------------------+       +------------------+
       ↑                         ↑
    Push when new             Pop when full
    CCCM used

Final Merge List (max 5):
[0] Spatial A1 → (α=2, β=3)
[1] Temporal   → (α=1, β=4)
[2] History #1 → (α=3, β=2)
[3] History #2 → (α=0, β=5)
[4] Default    → (α=0, β=0)

→ Send index only!

六、伪代码实现(Python-like)

python 复制代码
def predict_with_cccm(curr_cu_chroma, pred0):
    """
    使用 CCCM 模式生成色度预测值
    :param curr_cu_chroma: 当前色度 CU
    :param pred0: 初始帧内预测(如 Planar/DC)
    :return: CCCM 预测结果 or None (if not applicable)
    """
    w, h = curr_cu_chroma.width, curr_cu_chroma.height
    x_c, y_c = curr_cu_chroma.x, curr_cu_chroma.y

    # Step 1: Check eligibility
    if w < 4 or h < 4 or not is_chroma_component():
        return None

    # Step 2: Collect training samples from top/left neighbors
    X_matrix = []  # Feature vectors: [ry0, ry1, ...]
    d_vector = []  # Target: org_chroma - pred0_chroma

    # Scan top row
    for x in range(w):
        xc, yc = x_c + x, y_c - 1
        if is_reconstructed(xc, yc):
            # Map to luma coordinates
            xl_base, yl_base = (xc << 1), (yc << 1)
            ry_samples = []
            for i in range(2):
                for j in range(2):
                    xl, yl = xl_base + i, yl_base + j
                    ry = get_reconstructed_luma_residual(xl, yl)
                    ry_samples.append(ry)
            # Simple average or use all
            avg_ry = sum(ry_samples) / 4.0

            ec = get_original_chroma(xc, yc) - interpolate_pred0(pred0, x, -1)
            X_matrix.append([1.0, avg_ry])  # [1, ry] for α + β*ry
            d_vector.append(ec)

    # Scan left column
    for y in range(h):
        xc, yc = x_c - 1, y_c + y
        if is_reconstructed(xc, yc):
            xl_base, yl_base = (xc << 1), (yc << 1)
            ry_samples = []
            for i in range(2):
                for j in range(2):
                    xl, yl = xl_base + i, yl_base + j
                    ry = get_reconstructed_luma_residual(xl, yl)
                    ry_samples.append(ry)
            avg_ry = sum(ry_samples) / 4.0

            ec = get_original_chroma(xc, yc) - interpolate_pred0(pred0, -1, y)
            X_matrix.append([1.0, avg_ry])
            d_vector.append(ec)

    if len(X_matrix) < 5:
        return None  # Insufficient samples

    # Step 3: Solve linear system: d = X @ theta
    X = np.array(X_matrix)
    d = np.array(d_vector)

    try:
        theta = np.linalg.solve(X.T @ X, X.T @ d)
        alpha, beta = theta[0], theta[1]
    except np.linalg.LinAlgError:
        return None

    # Step 4: Apply model to entire block
    final_pred = np.zeros((h, w))
    for y in range(h):
        for x in range(w):
            xl_center = (x_c + x) * 2 + 1
            yl_center = (y_c + y) * 2 + 1
            local_ry = get_local_average_luma_residual(xl_center, yl_center, size=3)
            correction = alpha + beta * local_ry
            final_pred[y][x] = pred0[y][x] + correction

    return final_pred

# 在编码端进行 RDO 测试
best_cost = float('inf')
best_pred = None

for mode in ['DC', 'Planar', 'Angular(18)', 'CCCM']:
    if mode == 'CCCM':
        pred = predict_with_cccm(cu, base_pred='Planar')
    else:
        pred = intra_predict(mode)
    
    cost = compute_rd_cost(pred, cu.org, lamda)
    if cost < best_cost:
        best_cost = cost
        best_pred = pred
        selected_mode = mode

if selected_mode == 'CCCM':
    write_syntax(cccm_flag=1, merge_idx=None)  # or send merge index

七、性能表现(来自 JVET 测试报告)

测试集 BD-rate reduction (Y) U/V 平均 EncT DecT
AI(All Intra) -1.2% ~ -1.8% -2.5% +7% +3%
RA(Random Access) -0.9% -2.0% +6% +2%
SCC(Screen Content) -2.0% ~ -3.5% -4.0% +10% +4%

优势显著:尤其适合文字、图表、UI 等高相关性内容。


八、与其他技术对比

技术 特点 与 CCCM 关系
CCP (Cross-Component Prediction) VVC 标准工具,使用固定模板线性模型 CCCM 是其增强版本
LM-Chroma HEVC 中已有,基于仿射变换 CCCM 更灵活,自适应学习
DMS+ 使用神经网络预测 CCCM 是轻量替代方案
EIP(如 JVET-AG0058) 外推滤波预测 可结合使用:EIP 用于亮度,CCCM 用于色度

九、总结表

项目 内容
名称 CCCM(Cross-Component Correlation Model)
用途 利用亮度残差预测色度,提升压缩效率
适用范围 色度分量 ≥4×4,Intra slice
两种模式 Derivation(自动学习)、Merge(复用历史)
核心方法 最小二乘拟合 α + β·r_Y
输入特征 邻近亮度残差
输出目标 色度残差修正项
增益 Y: -1~2%, C: -2~4%(尤其 SCC)
复杂度 编码 +7~10%,解码 +2~4%
典型提案 JVET-Z0089, JVET-AC0056, JVET-AD0077
相关推荐
聊天QQ:4877392781 天前
探索 L4 无人车自动驾驶系统方案:无代码的蓝图魅力
视频编解码
简鹿视频1 天前
mp4视频转换成avi格式攻略
ffmpeg·音视频·视频编解码·格式工厂
小咖自动剪辑3 天前
提升电商素材剪辑效率:多场景内容自动生成流程解析
人工智能·实时互动·音视频·语音识别·视频编解码
霜雪i3 天前
PU::getAffineMergeCand
视频编解码·h.266
询问QQ:4877392785 天前
基于Matlab的三坐标雷达目标跟踪数据融合程序:采用概率数据关联算法和EKF的轨迹展示
h.266
霜雪i8 天前
SbTMVP
视频编解码
屿行屿行8 天前
【Linux】音视频处理(gstreamer和ffmpeg的实际应用)
linux·ffmpeg·音视频·视频编解码
watersink8 天前
基于英伟达PyNvVideoCodec视频编解码
视频编解码
泰勒朗斯12 天前
hdr10plus_tool的使用
视频编解码