OpenISP 模块拆解 · 第10讲:颜色空间转换 (CSC)
模块作用
CSC 是颜色空间转换模块,openISP 用它把 RGB 转为 YUV。转换后,亮度 Y 和色度 U/V 分离,方便后续分别做亮度降噪、锐化、色度抑制、饱和度控制。
openISP 实现
源码类名为 CSC(img, csc)。csc 是 3x4 矩阵:
text
Y = (R*c00 + G*c01 + B*c02 + c03) / 1024
U = (R*c10 + G*c11 + B*c12 + c13) / 1024
V = (R*c20 + G*c21 + B*c22 + c23) / 1024
配置文件中的小数系数在主程序里乘以 1024,形成固定点矩阵。
默认转换
配置类似 limited range RGB to YUV:
text
Y = 0.257R + 0.504G + 0.098B + 16
U = -0.148R - 0.291G + 0.439B + 128
V = 0.439R - 0.368G - 0.071B + 128
其中 Y offset 为 16,U/V 中性点为 128。
为什么转 YUV
图像质量调校常常希望分离亮度和色度:
- Y 通道:降噪、锐化、亮度对比度。
- UV 通道:饱和度、色相、伪彩抑制。
这样可以减少亮度处理对颜色的副作用。
读源码注意点
源码没有显式 clipping,最后直接转 uint8。若矩阵输出超出范围,真实系统应做饱和裁剪。
面试问答
Q1: YUV 中 Y 是不是等于绿色通道?
不是。Y 是由 RGB 加权得到的亮度分量,只是 G 权重通常最大,因为人眼对绿色更敏感。
Q2: U/V 为什么常以 128 为中性点?
在 8-bit 无符号表示中,色度需要表达正负偏移。用 128 作为零色度中心,低于或高于 128 表示不同色度方向。
Q3: 为什么锐化通常只做 Y 通道?
人眼对亮度细节更敏感,对色度分辨率较低。只锐化 Y 能增强清晰度,同时避免放大色噪和彩边。
Q4: CSC 和 CCM 都是矩阵,有什么区别?
CCM 是颜色校正,用于传感器 RGB 到目标 RGB 的颜色还原。CSC 是颜色空间转换,例如 RGB 到 YUV,用于后续编码或调校。
Q5: limited range 和 full range YUV 有什么区别?
limited range 通常 Y 在 16...235,UV 在 16...240;full range 使用 0...255。范围不同会影响黑位、白位和显示兼容性。