✅ 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获得最大收益
- 调整阈值适应不同内容类型
- 监控色度增益,避免在自然视频中误用
📚 参考资料
- VVC Standard (ITU-T H.266 | ISO/IEC 23090-3): Sections on chroma from luma prediction
- JVET-S0065: "CE2.2.2: Cross-component linear model for chroma prediction"
- ECM Software Documentation v19.0: CrossComponentPrediction.cpp module
- JVET-W2002: "Screen content coding using cross-component prediction"
- 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):
- 获取其重建色度值: c_{\\text{rec}}
- 获取其原始值: c_{\\text{org}}
- 计算初始预测误差(如 DC/Planar): e_c = c_{\\text{org}} - c_{\\text{pred0}}
- 映射到亮度坐标系,取多个亮度残差样本 r_y\^{(i)} = \\text{rec}_Y(x_i,y_i) - \\text{pred}_Y(x_i,y_i)
- 构造样本对:
(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):
-
映射到亮度域,获取对应位置的亮度残差 r_y(x',y')
-
应用训练好的模型:
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β)
-
最终预测值:
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 |