ISP Pipeline 全景概览:从 Sensor 到显示器的图像信号处理全流程
大家好,我是老周。做图像处理这行十几年了,今天咱们聊聊 ISP Pipeline 的全貌。很多新人一上来就扎进某个算法模块,结果搞了半天都不知道前后模块在干什么。我个人习惯,学 ISP 必须先看全景图——你得知道信号从哪来、到哪去、中间经过了哪些关卡。
说白了,ISP 就是一条流水线。Sensor 拍下来的原始数据,经过一系列处理,最终变成你屏幕上看到的那张照片。嗯,就这么简单。但这条流水线上每个环节都藏着不少坑。
1.1 ISP 的输入与输出
先搞清楚两头。
| 方向 | 信号类型 | 关键特征 |
|---|---|---|
| 输入 | Bayer RAW(通常是 10/12/14 bit) | 每个像素只记录一种颜色(R/G/B),未经过任何处理 |
| 输出 | YUV 或 RGB(8/10 bit) | 每个像素都有完整的颜色信息,经过色彩校正、降噪、锐化等 |
你想想看,Sensor 输出的 RAW 图,每个像素只有一种颜色分量。比如一个 2x2 的 Bayer 阵列,两个绿色、一个红色、一个蓝色。这图直接看的话,又暗又花,根本没法用。ISP 的任务就是把这个「半成品」加工成「成品」。
核心认知:ISP 的本质是一个信号重建与增强的过程。输入是欠采样的、带噪声的 RAW 数据,输出是视觉友好的、完整的彩色图像。
1.2 ISP Pipeline 的核心模块
一条典型的 ISP 流水线,模块顺序大致如下。我在项目中遇到过不少因为模块顺序搞错导致画质崩掉的案例,所以这个顺序很重要。
- 黑电平校正(BLC)——去掉 Sensor 的暗电流偏置
- 镜头阴影校正(LSC)——补偿镜头边缘亮度衰减
- 坏点校正(DPC)——修复 Sensor 上的死点/亮点
- 去马赛克(Demosaic)——从 Bayer 插值出完整 RGB
- 白平衡(AWB)——让白色物体在任何光源下都显白
- 色彩校正矩阵(CCM)——把 Sensor 色彩空间映射到标准色域
- Gamma 校正——适应人眼非线性感知
- 降噪(NR)——去除各种噪声
- 锐化(Sharpening)——增强边缘细节
- 色调映射(Tone Mapping)——压缩动态范围
这十个模块,每个都能单独讲一章。今天咱们先看它们怎么串起来的。
我的经验:调试 ISP 时,永远从前往后调。前面 BLC 没调准,后面白平衡怎么调都偏色。我曾经在一个项目里花了三天调 AWB,最后发现是 BLC 的 offset 设错了——嗯,从那以后我再也不敢跳过前级验证。
1.3 ISP Pipeline 流程图
下面这张图是我手绘风格的 Pipeline 结构,你一看就明白信号怎么流了。
1.4 各模块的输入输出关系
每个模块的输入输出格式都不一样,搞混了会出大问题。我整理了一张表,你调试的时候可以对照着看。
| 模块 | 输入格式 | 输出格式 | 典型位宽 |
|---|---|---|---|
| BLC | Bayer RAW | Bayer RAW | 10/12/14 bit |
| LSC | Bayer RAW | Bayer RAW | 10/12/14 bit |
| DPC | Bayer RAW | Bayer RAW | 10/12/14 bit |
| Demosaic | Bayer RAW | RGB | 12/14 bit → 8/10 bit |
| AWB | RGB | RGB | 8/10/12 bit |
| CCM | RGB | RGB | 8/10/12 bit |
| Gamma | RGB | RGB | 8/10/12 bit |
| NR | RGB 或 YUV | RGB 或 YUV | 8/10 bit |
| Sharpening | YUV | YUV | 8/10 bit |
| Tone Mapping | YUV 或 RGB | YUV 或 RGB | 8/10 bit |
注意:位宽在 Pipeline 中会逐渐降低。早期模块用高精度(12-14 bit)保留细节,后期模块压缩到 8-10 bit 输出。如果你在某个模块发现精度损失异常,先检查前级位宽配置。
1.5 一个实际案例:从 RAW 到 JPEG 的旅程
说个我实际调过的项目。某款手机 Sensor 输出 12bit RAW,分辨率 4000x3000。Pipeline 跑下来,最终输出 8bit YUV,再编码成 JPEG。
你猜中间哪个模块最耗时?不是降噪,也不是锐化,是 Demosaic。4000x3000 的 Bayer 图,插值成 RGB,数据量直接翻三倍。如果芯片带宽不够,这里就是瓶颈。
我当时怎么解决的?把 Demosaic 拆成两阶段:先做简单的双线性插值出预览图,再做自适应插值出最终图。预览图给用户看,最终图后台慢慢算。嗯,用户体验和性能的平衡,就是这么来的。
避坑指南:我曾经在一个项目里把降噪放在 Demosaic 前面,结果噪声和 Bayer 模式混在一起,插值后出现了彩虹条纹。后来才意识到,降噪必须在 Demosaic 之后做,或者至少要在 RAW 域做专门的 Bayer 降噪,不能直接用 RGB 域的降噪算法。
1.6 ISP 设计的几个关键原则
- 数据流优先:先搞清楚每个模块的输入输出格式和位宽,再谈算法优化
- 精度逐级管理:早期模块保留高精度,后期模块按需压缩,避免信息丢失
- 模块解耦:每个模块的调参尽量独立,不要一个参数影响三个模块
- 实时性约束:手机 ISP 通常要求在 30ms 内完成一帧处理,算法复杂度要可控
好了,这一章咱们把 ISP Pipeline 的全貌理清楚了。从 Sensor 的 RAW 数据,经过预处理、处理、后处理三个阶段,最终输出给显示器或编码器。每个模块的职责、输入输出、常见坑点,心里都有数了。