1. ISP Pipeline 概述:从 RAW 到 YUV 的旅程

各位好,我是老周。做 ISP 算法调优这些年,我最大的感触是:不懂 Pipeline,就没法调参数。你想想看,连信号从哪来、到哪去、中间经过哪些模块都不清楚,怎么敢动那些增益和阈值?

这一章,我们就先把 ISP 的全局地图铺开。我不会一上来就堆公式,而是带你走一遍从 Sensor RAW 数据到最终 YUV 图像的完整流程。嗯,这里要记住一个核心观点:ISP 不是魔法,它是一套有严格顺序的信号处理链。

1.1 ISP 在相机系统中的位置

先看一张简化的系统框图,你就明白 ISP 处在什么位置了。

相机成像系统简图:

镜头 → 传感器 (CMOS/CCD) → ISP (Image Signal Processor) → 编码器/显示/存储

说白了,传感器干的是光电转换的粗活——把光子变成模拟电压,再量化成 RAW 数据。但 RAW 数据又暗又偏色,人眼根本没法看。ISP 就是那个「妙手回春」的中间人。

我个人习惯把 ISP 比作一个数字暗房。传统胶片时代,摄影师在暗房里调整曝光、显影、定影;数字时代,ISP 在芯片里完成白平衡、去噪、锐化。本质是一样的——把不完美的原始信号,加工成人眼看着舒服的图像。

1.2 ISP 处理流程总览

下面这张 SVG 图,是我自己画的 ISP 标准 Pipeline。你盯着看两分钟,后面所有章节都会围绕它展开。

ISP Pipeline 总览流程图 ISP Pipeline 总览:从 RAW 到 YUV RAW 输入 (Bayer) BLC (黑电平校正) AWB (自动白平衡) Demosaic (去马赛克) CCM (色彩校正矩阵) Gamma (伽马校正) YUV 输出 关键说明 每个模块都有可调参数 调参顺序:前级影响后级 先调 BLC → AWB → 再调后面 调参避坑提示 BLC 不准 → 整个画面偏色 AWB 不准 → 肤色像鬼片 Gamma 乱调 → 暗部细节全丢 NR 过猛 → 画面像塑料

你看,从 RAW 到 YUV,中间要经过 6 个核心模块。每个模块都有自己的一堆参数。我曾经在项目里见过有人一上来就调 Sharpen,结果 BLC 还没校准,画面全是偏色的,锐化完更难看——顺序错了,全白干。

1.3 关键模块简介

下面我把每个模块的核心作用、我踩过的坑、以及调参要点,用表格和短段落给你讲清楚。

模块 英文全称 一句话作用 调参要点
BLC Black Level Correction 消除传感器暗电流导致的偏色 先校准,否则后面全偏
AWB Auto White Balance 让白色物体在任何光源下都是白的 色温估计要准,否则肤色翻车
Demosaic 去马赛克 从 Bayer 模式插值出全彩图像 边缘伪彩是常见问题
CCM Color Correction Matrix 校正传感器光谱响应偏差 矩阵系数影响整体色调
Gamma 伽马校正 调整亮度响应曲线,适配显示设备 暗部提亮 vs 噪点放大要平衡
Sharpen 锐化 增强图像边缘对比度 过锐会产生光晕和振铃
NR Noise Reduction 降低图像噪声 去噪太强会丢失纹理细节

1.4 各模块深度解析

1.4.1 BLC(黑电平校正)

BLC 是 Pipeline 的第一道关卡。传感器在没有光照时,像素也会输出一个基础电压,这叫黑电平。如果不减掉它,整个画面会偏色,尤其是暗部会发紫或发绿。

我的经验:BLC 的校准值通常写在传感器寄存器里,但不同温度下会漂移。我曾经在户外项目里吃过亏——白天调好的 BLC,晚上温度降了 10 度,画面直接偏蓝。后来我加了温度补偿查表,才稳住。

1.4.2 AWB(自动白平衡)

AWB 的目标很简单:让白色在任何光源下都是白色。它通过估计当前场景的色温,然后对 R、G、B 通道施加不同的增益。

但这里有个坑:如果场景里全是单一颜色(比如一片绿草地),AWB 会误判色温。我记得有一次在植物园拍花,AWB 把整个画面调成了偏紫色——因为算法以为绿色太多是偏色,拼命加红蓝。

警告:AWB 的增益不要超过 2.0,否则单通道噪声会被放大到肉眼可见。我曾经见过有人为了校正偏色,把 B 通道增益拉到 3.5,结果暗部全是蓝色噪点。

1.4.3 Demosaic(去马赛克)

传感器每个像素只能感光一种颜色(R、G 或 B),形成 Bayer 模式。Demosaic 就是通过插值算法,给每个像素补全另外两种颜色。

说白了,这就是个猜颜色的过程。猜得好,图像细腻;猜不好,边缘出现彩色锯齿(伪彩)。

我建议你在调 Demosaic 时,重点关注边缘方向判断。方向判断错了,插值出来的颜色就会像水彩洇开一样。

1.4.4 CCM(色彩校正矩阵)

传感器的光谱响应和人眼不一样。CCM 用一个 3x3 矩阵,把传感器 RGB 转换到标准色彩空间(比如 sRGB)。

这个矩阵的系数,直接影响画面的饱和度和色调。调大了,色彩艳丽但可能失真;调小了,画面发灰。

关键公式(简化版):

R_out = a11 * R_in + a12 * G_in + a13 * B_in
G_out = a21 * R_in + a22 * G_in + a23 * B_in
B_out = a31 * R_in + a32 * G_in + a33 * B_in

每一行系数之和通常为 1.0,否则亮度会变。

1.4.5 Gamma(伽马校正)

人眼对暗部亮度变化更敏感,对亮部不敏感。Gamma 校正就是把线性光强映射到非线性的人眼感知曲线。标准 Gamma 值通常是 2.2。

但这里有个 trade-off:Gamma 提亮暗部的同时,也会把暗部噪声放大。我习惯在调 Gamma 时,同时观察暗部 SNR(信噪比)。如果噪声明显,就考虑在 Gamma 之前加一级 NR。

1.4.6 Sharpen(锐化)

锐化通过增强边缘对比度,让图像看起来更清晰。常用的方法是 Unsharp Mask(USM)。

调锐化时,我最怕看到两种效果:光晕(边缘出现白边)和振铃(边缘出现黑白交替的条纹)。这都是锐化强度过大或阈值设得太低导致的。

避坑指南:我曾经在一个监控项目里,为了追求清晰度,把锐化强度拉到 80%。结果画面里每根电线杆都带着一圈白边,客户直接退货。后来我学乖了——锐化强度控制在 30%~50%,配合边缘阈值,效果自然多了。

1.4.7 NR(降噪)

NR 是 Pipeline 的最后一道防线。它负责干掉前面所有模块累积的噪声。常见的 NR 方法有空间域滤波(如双边滤波)和变换域滤波(如小波去噪)。

但 NR 是一把双刃剑。去噪太强,纹理细节会丢失,画面像磨皮过度的美颜照片。我一般用亮度噪声和色度噪声分开处理的策略:亮度噪声保留更多细节,色度噪声可以狠一点。

1.5 模块间的依赖关系

最后,我想强调一个非常重要的概念:ISP 模块不是独立的,它们有严格的依赖关系。

  • BLC 必须在 AWB 之前——黑电平不准,白平衡增益会算错。
  • AWB 必须在 CCM 之前——白平衡增益会影响色彩矩阵的输入。
  • Demosaic 必须在 CCM 之前——CCM 需要全彩数据。
  • Gamma 通常在 Sharpen 和 NR 之前——Gamma 会改变噪声特性,影响后续处理。

你想想看,如果调参顺序乱了,比如先调 Sharpen 再调 Gamma,那 Gamma 提亮暗部后,锐化产生的光晕会更明显。这就是为什么我总说:调参的顺序,比参数本身更重要。

调参黄金法则:

  1. 先校准 BLC,确保黑电平准确。
  2. 再调 AWB,让白平衡收敛。
  3. 然后调 CCM,确定色彩风格。
  4. 接着调 Gamma,匹配显示设备。
  5. 最后调 Sharpen 和 NR,做画质微调。

按这个顺序来,能少走 80% 的弯路。

好了,这一章的内容就到这里。你先把 Pipeline 的整体结构刻在脑子里,后面每一章,我们会逐个模块深入拆解参数和调优技巧。