2、ISP Pipeline全景:从Sensor到YUV输出的完整数据流
好,咱们直接进入正题。ISP Pipeline,说白了就是一条「光信号变数字图像」的流水线。Sensor 捕捉到光线,经过一堆模块的轮番处理,最后输出一张你能在屏幕上看到的 YUV 图。我刚开始接触 ISP 时,总觉得这玩意儿像个黑盒子——数据进去,图像出来,中间发生了什么?完全没概念。
后来踩的坑多了,才明白:不理解 Pipeline,就没法做调试。你调一个参数,可能影响后面三个模块的效果。所以这一章,咱们把整条链路拆开来看。
2.1 数据流全景:从 RAW 到 YUV
先看一张整体流程图。我习惯把 ISP Pipeline 分成三个阶段:前端预处理、中间色彩重建、后端美化输出。
从 Sensor 出来的数据是 RAW 格式——说白了就是每个像素只记录一种颜色(R、G、B 中的一个)。这时的图像是灰蒙蒙的,颜色也不对。经过 Pipeline 处理后,才变成我们熟悉的彩色图像。
关键认知:ISP 调试的本质,就是让这条流水线上每个模块的参数,适配当前场景的光照、色温和噪声特性。
2.2 前端预处理模块
前端模块处理的是 RAW 域数据。这个阶段的目标很纯粹:把 Sensor 的原始信号修整干净,为后面的色彩重建打好基础。
2.2.1 BLC(黑电平校正)
Sensor 在完全无光时,输出并不是 0,而是有一个基础偏移值——这就是黑电平。BLC 就是把这个偏移减掉。
我记得有一次调试一个低光场景,画面整体偏紫。查了半天,最后发现是 BLC 没校准好,暗区的偏置没减干净。嗯,从那以后我每次拿到新 Sensor,第一件事就是测它的黑电平曲线。
// BLC 校正示例(伪代码)
for each pixel in RAW:
pixel = pixel - black_level
if pixel < 0: pixel = 0
2.2.2 AE(自动曝光)
AE 控制 Sensor 的曝光时间和增益。目标很简单:让画面亮度适中。但实际场景很复杂——逆光、强光、夜景,每种场景的 AE 策略都不一样。
我个人习惯把 AE 分成两步:粗调(曝光时间)和微调(模拟/数字增益)。粗调保证基础亮度,微调补足余量。但增益开太大,噪声就上来了——这是个永恒的 trade-off。
2.2.3 AWB(自动白平衡)
AWB 负责把不同色温下的光源「校正」成白色。说白了,就是让白色物体在任何光线下都看起来是白的。
你想想看,在黄昏的暖色光下,如果 AWB 没调好,整个画面会偏黄。在阴天的冷色光下,画面会偏蓝。AWB 算法会统计画面中的色温分布,然后调整 R/G/B 通道的增益。
实战技巧:安防场景中,AWB 容易受大面积单色物体干扰(比如绿草地、红墙)。我建议在调试时加入「色温锁定」功能,避免画面频繁跳变。
2.2.4 LSC(镜头阴影校正)
镜头边缘的光线会比中心暗,这就是镜头阴影(Lens Shading)。LSC 模块会补偿边缘的亮度,让画面均匀。
我曾经遇到一个案例:画面四周发暗,客户以为是 Sensor 坏了。结果一查,是 LSC 的校正表没烧录进去。所以拿到新镜头模组时,一定要先跑一遍 LSC 标定。
2.3 中间色彩重建模块
数据进入中间阶段时,还是 RAW 格式。这个阶段的任务是:把单通道的 RAW 数据,变成全彩的 RGB 图像。
2.3.1 Demosaic(去马赛克)
每个像素只有一种颜色信息,Demosaic 通过插值算法,把缺失的另外两种颜色「猜」出来。常见的插值算法有双线性插值、边缘导向插值等。
这里有个坑:插值算法选不好,画面边缘会出现伪色(比如彩色条纹)。我一般建议在边缘丰富的场景用边缘导向插值,在平坦区域用双线性插值——效率高,伪色少。
2.3.2 CCM(色彩校正矩阵)
Sensor 的 RGB 响应和人眼不一样。CCM 通过一个 3x3 矩阵,把 Sensor 的色彩空间映射到标准色彩空间(比如 sRGB)。
| 模块 | 输入 | 输出 | 核心作用 |
|---|---|---|---|
| BLC | RAW | RAW(去偏置) | 消除暗电流偏移 |
| AE | RAW | RAW(调亮度) | 控制曝光时间和增益 |
| AWB | RAW | RAW(调色温) | 校正光源色温 |
| Demosaic | RAW | RGB | 插值生成全彩 |
| CCM | RGB | RGB(校正后) | 色彩空间映射 |
| Gamma | RGB | RGB(非线性) | 亮度感知校正 |
| Sharpen | YUV | YUV(锐化后) | 增强边缘细节 |
2.3.3 Gamma 校正
人眼对暗部细节更敏感,对亮部不敏感。Gamma 校正就是做一个非线性映射,让暗部细节更明显。标准 Gamma 值一般是 2.2。
我调试时发现,安防场景的 Gamma 曲线可以适当调「陡」一点——因为监控画面经常有暗区(比如楼道角落),调陡了能看清更多细节。但别太过,否则亮部会过曝。
2.4 后端美化输出模块
数据到后端时已经是 RGB 或 YUV 格式了。这个阶段的目标是:让画面看起来更「舒服」。
2.4.1 Sharpen(锐化)
锐化增强边缘对比度,让画面看起来更清晰。但锐化是一把双刃剑——调太强,边缘会出现白边(overshoot),画面显得很「假」。
我曾经在调试一个高空抛物监控时,锐化开太大,结果把飞鸟的翅膀边缘搞出了伪影。后来我把锐化强度降了 30%,画面自然多了。
2.4.2 NR(降噪)
降噪模块处理的是亮度噪声和颜色噪声。亮度噪声看起来像「颗粒感」,颜色噪声像「彩色斑点」。NR 会做空域滤波和时域滤波。
注意:降噪太强会抹掉细节。安防场景中,人脸和车牌细节不能丢。我建议在降噪时保留边缘保护(edge-preserving)功能。
2.4.3 WDR(宽动态)
WDR 解决的是场景中同时存在极亮和极暗区域的问题(比如逆光下的车牌)。通过多帧合成或非线性映射,让亮部和暗部都能看清。
嗯,这里要注意:WDR 开启后,帧率会下降(因为要多帧合成)。如果场景是快速移动的(比如高速公路),WDR 反而会引入鬼影。所以不是所有场景都适合开 WDR。
2.5 小结
ISP Pipeline 是一条环环相扣的链路。前端修整 RAW 数据,中间重建色彩,后端美化输出。每个模块的参数都不是孤立的——你调了 AWB 的增益,可能会影响 CCM 的校正效果;你调了 NR 的强度,可能会影响 Sharpen 的锐化效果。
所以我的调试习惯是:先调前端,再调中间,最后调后端。从前到后,逐级优化。这样能避免「调了后面又回头改前面」的尴尬。