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。你盯着看两分钟,后面所有章节都会围绕它展开。
你看,从 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 提亮暗部后,锐化产生的光晕会更明显。这就是为什么我总说:调参的顺序,比参数本身更重要。
调参黄金法则:
- 先校准 BLC,确保黑电平准确。
- 再调 AWB,让白平衡收敛。
- 然后调 CCM,确定色彩风格。
- 接着调 Gamma,匹配显示设备。
- 最后调 Sharpen 和 NR,做画质微调。
按这个顺序来,能少走 80% 的弯路。
好了,这一章的内容就到这里。你先把 Pipeline 的整体结构刻在脑子里,后面每一章,我们会逐个模块深入拆解参数和调优技巧。