2. 传统ISP Pipeline详解:从RAW图到YUV的经典流程

大家好,我是老高。这一章咱们聊聊传统ISP的经典流程。说白了,就是手机或者相机里的感光元件(Sensor)拍出来的RAW图,怎么一步步变成我们肉眼看着舒服的YUV图像。

很多人觉得这玩意儿过时了,AI ISP才是未来。但我不这么看。你想想看,AI ISP再怎么厉害,它也得知道传统ISP在干什么,才能去替代或者增强某个模块。我当年刚入行的时候,就是靠啃透这条Pipeline,才在后续的AI算法落地中少走了很多弯路。

核心观点: 传统ISP Pipeline是图像质量的“地基”。AI ISP是“上层建筑”。地基不稳,楼盖得再高也得塌。
传统ISP Pipeline 核心流程 RAW图输入 黑电平校正 去噪 去马赛克 白平衡 Gamma校正 YUV输出 说明: 这是一个简化的线性流程。实际工程中,去噪和去马赛克经常有反馈环路,白平衡也会影响前面的增益。

2.1 黑电平校正(Black Level Correction)

先说说黑电平。Sensor在完全无光的情况下,理论上应该输出0。但实际不是,它会有一个底噪偏移,比如64或者128。这个偏移就是黑电平。

为什么要校正?很简单。如果不减掉这个偏移,你拍出来的黑色就不是纯黑,而是发灰的。而且这个偏移会吃掉你暗部的动态范围。

我的习惯: 拿到一颗新Sensor,我第一件事就是看它的黑电平寄存器。有些Sensor的黑电平会随温度漂移,这时候就得做动态黑电平校正。我曾经在一个项目中,因为忽略了温度漂移,导致夜景视频暗部出现明显的“灰雾”,后来加了温度查表才搞定。

校正公式很简单:

// 伪代码示例
pixel_out = pixel_raw - black_level;
if (pixel_out < 0) pixel_out = 0;

嗯,这里要注意。有些Sensor的Bayer通道(R, Gr, Gb, B)的黑电平是不一样的。你不能用一个值去减所有通道,否则会出现色偏。

通道 典型黑电平值(12bit RAW) 说明
R 64 红色通道
Gr 64 绿色通道(与R同行)
Gb 66 绿色通道(与B同行)
B 64 蓝色通道

2.2 去噪(Denoise)

去噪是ISP里最头疼的模块之一。为什么?因为去噪和细节是死对头。去噪狠了,细节没了;去噪轻了,噪点还在。

传统ISP里,去噪主要分两步:

  • 空域去噪: 比如双边滤波、非局部均值。我早期做项目时,特别喜欢用双边滤波,因为它能保边。但问题是,它在高ISO下容易产生“油画感”。
  • 时域去噪: 利用前后帧的信息做融合。这个对静态场景效果极好,但运动场景容易拖影。
避坑指南: 我曾经在一个监控项目中,为了降噪效果,把时域去噪的权重调得特别高。结果画面里有人走过时,身后拖了一条长长的“鬼影”。后来我学乖了,必须加运动检测,运动区域降低时域权重。

去噪的位置也很讲究。有些架构把去噪放在黑电平校正之后、去马赛克之前。因为RAW域的噪声模型相对简单,是高斯+泊松分布。但也有一些架构把去噪放在去马赛克之后,因为RGB域的噪声更容易被人眼感知。

2.3 去马赛克(Demosaic)

Sensor的每个像素只能感知一种颜色(R, G, B之一),这就是Bayer阵列。去马赛克就是通过插值,把每个像素缺失的另外两种颜色算出来。

最简单的办法是双线性插值。但效果嘛……边缘全是锯齿和伪色。我建议至少用基于边缘导向的插值算法。

// 边缘导向插值思路(简化版)
if (水平梯度 < 垂直梯度) {
    // 沿水平方向插值
    G = (G_left + G_right) / 2;
} else {
    // 沿垂直方向插值
    G = (G_top + G_bottom) / 2;
}

去马赛克做得好不好,直接决定了后面白平衡和色彩校正的难度。如果去马赛克产生了大量伪色,白平衡再怎么调也救不回来。

2.4 白平衡(White Balance, AWB)

白平衡的目标很简单:让白色物体在任何光源下都看起来是白的。但实现起来很复杂。

传统AWB算法一般分两步:

  1. 色温估计: 通过统计图像中的“灰点”来估计当前光源色温。
  2. 增益调整: 对R和B通道施加不同的增益,让灰点回归中性。
关键点: 白平衡的增益是在RAW域或者线性RGB域施加的。如果在Gamma校正之后做白平衡,那色彩就全乱套了。因为Gamma是非线性变换,会改变色温的物理意义。

我个人习惯在去马赛克之后、Gamma校正之前做白平衡。这样既能保证色彩准确性,又能利用到完整的RGB信息。

2.5 Gamma校正(Gamma Correction)

Gamma校正有两个目的:

  • 适配显示设备: CRT显示器有天然的Gamma特性,LCD显示器为了兼容也保留了。
  • 量化优化: 人眼对暗部变化更敏感。Gamma校正相当于把更多的码字分配给暗部,减少暗部量化噪声。

标准Gamma曲线是:

V_out = V_in ^ (1/2.2)

但实际工程中,我们很少直接用纯幂函数。因为它在暗部斜率太大,会放大暗部噪声。我常用的做法是加一个线性段:

// 带线性段的Gamma校正
if (V_in < threshold) {
    V_out = V_in * slope;
} else {
    V_out = a * V_in ^ (1/2.2) + b;
}
我的经验: 这个threshold一般取0.05左右。斜率slope要保证曲线在衔接点连续且可导,否则画面会出现肉眼可见的“断层”。我曾经在一个HDR项目中,因为Gamma曲线衔接处导数不连续,导致天空区域出现了一条明显的亮度分界线,排查了好久才发现是这个问题。

2.6 其他关键模块

除了上面这几个核心模块,传统ISP Pipeline里还有几个“配角”,但同样重要:

模块 作用 我的评价
镜头阴影校正(LSC) 补偿镜头边缘亮度衰减 不做的话,四角发暗,很丑
坏点校正(DPC) 修复Sensor上的死点/亮点 必须做,否则画面有固定噪点
色彩校正矩阵(CCM) 将Sensor RGB转换到标准色彩空间 决定了色彩还原的准确性
色调映射(Tone Mapping) 压缩高动态范围到显示范围 HDR场景必备,容易做过头

好了,这一章的内容就到这里。传统ISP Pipeline虽然看起来模块很多,但每个模块都有它存在的物理意义。你只有理解了这些“为什么”,才能在后续的AI ISP混合架构中,知道哪些模块可以用AI替代,哪些模块必须保留传统算法。