3、ISP Pipeline概览:ISP处理流程、CCM在ISP中的位置、RAW域与RGB域的区别
好,咱们进入第三讲。这一节我打算把ISP的整体流程给你捋一遍。你可能会问:“老师,我们不是讲CCM吗?为什么要先看整个Pipeline?”
嗯,这个问题问得好。我个人的习惯是,调试任何一个模块之前,必须先搞清楚它在整个链路中的位置。就像修车,你不能上来就拆发动机,得先看看这车是哪年款、什么毛病。CCM也是一样,它夹在RAW域和RGB域之间,位置非常特殊。搞不懂这个,你调出来的参数大概率是错的。
3.1 ISP处理流程:从光子到像素
ISP的全称是Image Signal Processor,图像信号处理器。它的任务就是把传感器送过来的原始数据,变成人眼看着舒服、或者机器能识别的图像。
一个典型的ISP Pipeline,大致长这样:
Sensor RAW → 黑电平校正(BLC) → 镜头阴影校正(LSC) → 坏点校正(DPC) →
去马赛克(Demosaic) → 白平衡(AWB) → 色彩校正矩阵(CCM) →
Gamma校正 → 色调映射(Tone Mapping) → 锐化(Sharpness) →
降噪(NR) → YUV输出
你看,这个链条挺长的。但咱们可以把它分成两大阶段:
- RAW域处理:从Sensor RAW到Demosaic之前。这个阶段的数据是单通道的,每个像素只记录一种颜色(R、G或B)。
- RGB域处理:从Demosaic之后开始。这时候每个像素都有了R、G、B三个通道的值,变成了彩色图像。
我刚开始做ISP的时候,犯过一个低级错误。我在RAW域里直接做了色彩调整,结果图像出现了严重的伪色。后来才明白,RAW域的数据是线性且未插值的,你动它的颜色通道,等于在破坏传感器的原始物理信息。说白了,RAW域只能做校正,不能做色彩变换。
3.2 CCM在ISP中的位置:承上启下的关键节点
CCM放在哪里?看上面的流程:
白平衡(AWB) → 色彩校正矩阵(CCM) → Gamma校正
这个位置非常讲究。为什么放在AWB之后?因为AWB已经把R、G、B通道的增益调平了,消除了光源色温的影响。这时候再做CCM,才能保证色彩转换的一致性。你想想看,如果先做CCM再做AWB,那AWB的增益会再次改变颜色比例,CCM就白调了。
为什么放在Gamma之前?因为CCM是线性运算,而Gamma是非线性变换。如果先做Gamma,图像数据变成了非线性,你再做矩阵乘法,结果会完全偏离物理模型。我在项目中遇到过有人把CCM放在Gamma后面,结果红色和蓝色通道的响应曲线完全乱套了,怎么调都调不回来。
核心要点:CCM必须工作在线性RGB空间。任何非线性处理(Gamma、色调映射)都必须放在CCM之后。
3.3 RAW域与RGB域的区别:两个世界的不同规则
这个区别,我建议你从三个维度去理解:
| 维度 | RAW域 | RGB域 |
|---|---|---|
| 数据格式 | 单通道,Bayer模式(RGGB/GRBG等) | 三通道,每个像素有完整的R、G、B值 |
| 线性度 | 严格线性(与光强成正比) | 经过Demosaic后,线性度被破坏 |
| 色彩关系 | 每个像素只记录一种颜色,相邻像素插值得到其他颜色 | 每个像素都有三种颜色,可以直接做色彩运算 |
| 典型操作 | 黑电平校正、镜头阴影校正、坏点校正 | 白平衡、色彩校正、Gamma、色调映射 |
说白了,RAW域是传感器的“母语”,它记录的是最原始的物理信号。而RGB域是经过翻译后的“普通话”,方便我们做各种图像处理。
这里有一个避坑指南:千万不要在RAW域里做色彩相关的调整。我曾经见过有人为了省事,直接在RAW域里乘了一个系数来改变颜色,结果图像边缘出现了彩虹条纹。为什么?因为Bayer模式下的颜色信息是稀疏的,你乘系数相当于改变了插值权重,伪色就出来了。
调试小技巧:当你拿到一个ISP调试工具时,先确认当前操作是在哪个域。很多工具会默认显示RGB域的图像,但实际处理可能还在RAW域。我习惯在工具里加一个“RAW域预览”功能,看一眼Bayer模式下的原始数据,心里就有底了。
3.4 为什么CCM必须放在RGB域?
这个问题其实已经回答了。我再补充一点:CCM是一个3x3的矩阵,它需要每个像素都有完整的R、G、B值才能做乘法。在RAW域里,每个像素只有一个颜色值,你拿什么乘?
举个例子:
// 正确的CCM运算(RGB域)
R_out = CCM[0][0]*R_in + CCM[0][1]*G_in + CCM[0][2]*B_in
G_out = CCM[1][0]*R_in + CCM[1][1]*G_in + CCM[1][2]*B_in
B_out = CCM[2][0]*R_in + CCM[2][1]*G_in + CCM[2][2]*B_in
你看,每个输出通道都需要三个输入通道的值。在RAW域里,一个像素只有R值,没有G和B,这矩阵就没法算。
嗯,这里要注意:有些低端ISP为了省内存,会在Demosaic之前做一个简化的色彩校正。但那不是真正的CCM,而是对Bayer通道的增益调整。效果嘛,只能说勉强能用,但精度差远了。
警告:如果你在调试中看到“RAW域CCM”这个说法,大概率是厂商在偷换概念。真正的CCM必须工作在RGB域。遇到这种情况,一定要确认清楚:到底是CCM还是Bayer增益?两者差别很大。
3.5 小结:这一节你该记住什么
好了,这一节的内容就这些。我帮你总结三个关键点:
- ISP流程分两段:RAW域做校正,RGB域做色彩和美化。CCM是连接两段的桥梁。
- CCM的位置固定:在AWB之后、Gamma之前。别乱动,动了就出问题。
- RAW域和RGB域是两套规则:别在RAW域里做色彩运算,也别在RGB域里做像素级校正。
下一节,咱们就正式进入CCM的数学原理。我会从3x3矩阵的物理意义讲起,告诉你每个系数到底在控制什么。到时候你再看那些调试工具里的滑块,就不会觉得是玄学了。
公众号:蓝海资料掘金营,微信deep3321