2、ISP Pipeline全景:从Sensor到YUV输出的完整数据流

好,咱们直接进入正题。ISP Pipeline,说白了就是一条「光信号变数字图像」的流水线。Sensor 捕捉到光线,经过一堆模块的轮番处理,最后输出一张你能在屏幕上看到的 YUV 图。我刚开始接触 ISP 时,总觉得这玩意儿像个黑盒子——数据进去,图像出来,中间发生了什么?完全没概念。

后来踩的坑多了,才明白:不理解 Pipeline,就没法做调试。你调一个参数,可能影响后面三个模块的效果。所以这一章,咱们把整条链路拆开来看。

2.1 数据流全景:从 RAW 到 YUV

先看一张整体流程图。我习惯把 ISP Pipeline 分成三个阶段:前端预处理、中间色彩重建、后端美化输出。

ISP Pipeline 全景流程图 ISP Pipeline 全景流程图 前端预处理 中间色彩重建 后端美化输出 Sensor RAW 数据输入 BLC(黑电平校正) AE(自动曝光) AWB(自动白平衡) LSC(镜头阴影校正) Demosaic(去马赛克) CCM(色彩校正矩阵) Gamma 校正 RGB 转 YUV Sharpen(锐化) NR(降噪) WDR(宽动态) YUV 输出 说明:RAW 数据从前端流入,经过色彩重建,最后在后端完成美化输出 YUV

从 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 的锐化效果。

所以我的调试习惯是:先调前端,再调中间,最后调后端。从前到后,逐级优化。这样能避免「调了后面又回头改前面」的尴尬。