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
相关推荐
ℳ₯㎕ddzོꦿ࿐2 天前
告别延迟:HLS (m3u8) 实时转 FLV 全栈方案实战
视频编解码
霜雪i3 天前
ISP模式
视频编解码·h.266
CheungChunChiu3 天前
视频编解码与 GOP 结构详解
linux·视频编解码
深圳市友昊天创科技有限公司7 天前
友昊天创推出8K ,4K 120Hz 100米延长器方案
音视频·实时音视频·视频编解码
深圳市友昊天创科技有限公司7 天前
ASM4242 雷电扩展坞 CV4242 PCIE扩展坞
音视频·实时音视频·视频编解码
深圳市友昊天创科技有限公司7 天前
友昊天创推出延长器方案GSV5600+HDBase VS010**/VS100**
音视频·实时音视频·视频编解码
TEL1892462247711 天前
IT6227:USB-C(DP Alt 模式)及电源传输控制器 内置 4 通道 DP 1.4 转 HDMI 2.1 转换器
音视频·实时音视频·视频编解码
小咖自动剪辑14 天前
视频去水印与去字幕教程:免费去水印软件与去字幕工具推荐
人工智能·音视频·实时音视频·视频编解码
TEL1892462247715 天前
IT6225B:USB-C(DP Alt 模式)及电源传输控制器 内置双通道 DP 1.4 转 HDMI 2.0 转换器
音视频·实时音视频·视频编解码
小脑斧要动脑16 天前
视频编解码开发工具合集
视频编解码