OpenISP 模块拆解 · 第8讲:颜色校正矩阵 (CCM)
模块作用
CCM 是颜色校正矩阵,位于 CFA 后的 RGB 域。它把传感器 RGB 映射到目标 RGB 色彩空间,用于修正传感器光谱响应与标准颜色之间的差异。
openISP 实现
源码类名为 CCM(img, ccm)。ccm 是 3x4 矩阵,前三列做 RGB 混合,第四列是 offset。
对每个像素:
text
R' = (m00*R + m01*G + m02*B + m03) / 1024
G' = (m10*R + m11*G + m12*B + m13) / 1024
B' = (m20*R + m21*G + m22*B + m23) / 1024
1024 表示固定点缩放基准。配置文件默认是单位矩阵,所以默认不改变颜色。
为什么需要 CCM
传感器的 R/G/B 滤色片响应和标准 RGB 不一致,存在通道串扰。即使白平衡正确,颜色也可能不准确。CCM 通过线性组合修正颜色。
参数说明
| 参数 | 含义 |
|---|---|
ccm_00..ccm_22 |
3x3 颜色混合系数 |
ccm_03/13/23 |
每个输出通道 offset |
/1024 |
固定点缩放,方便整数硬件实现 |
标定思路
真实 CCM 常通过拍摄标准色卡获得。流程通常是:
- 拍摄 RAW 并完成 BLC、AWB、CFA。
- 读取色卡每个色块的传感器 RGB。
- 与目标标准色值做最小二乘拟合。
- 加约束,避免负值过大或过饱和。
- 结合主观色彩风格微调。
读源码注意点
openISP 的 CCM 输出最后直接 astype(np.uint8),没有显式 clipping。如果矩阵输出超出 0..255,真实使用中应做饱和裁剪。
面试问答
Q1: AWB 和 CCM 的区别是什么?
AWB 是按通道增益校正光源色温,主要解决白点问题。CCM 是通道线性混合,主要解决传感器颜色空间到目标颜色空间的映射问题。
Q2: 为什么 CCM 通常在 demosaic 后?
CCM 需要完整 RGB 三通道输入。demosaic 前每个像素只有一个颜色采样,无法直接做完整 3x3 矩阵变换。
Q3: CCM 系数为什么可能有负数?
为了抵消通道串扰,某个输出通道可能需要减去其他输入通道的一部分。负系数可以提高色彩分离度,但过大会导致噪声和 clipping 风险。
Q4: CCM 会影响亮度吗?
会。虽然目标是颜色校正,但矩阵行和、offset 都会影响通道值,从而影响亮度和饱和度。所以 CCM 需要和 tone/gamma 协同调校。
Q5: 怎么判断 CCM 调得不好?
常见现象是肤色不自然、植物绿偏黄或偏荧光、天空蓝异常、某些色块饱和度过高或过低,以及不同光源下颜色不稳定。