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 流水线,模块顺序大致如下。我在项目中遇到过不少因为模块顺序搞错导致画质崩掉的案例,所以这个顺序很重要。

  1. 黑电平校正(BLC)——去掉 Sensor 的暗电流偏置
  2. 镜头阴影校正(LSC)——补偿镜头边缘亮度衰减
  3. 坏点校正(DPC)——修复 Sensor 上的死点/亮点
  4. 去马赛克(Demosaic)——从 Bayer 插值出完整 RGB
  5. 白平衡(AWB)——让白色物体在任何光源下都显白
  6. 色彩校正矩阵(CCM)——把 Sensor 色彩空间映射到标准色域
  7. Gamma 校正——适应人眼非线性感知
  8. 降噪(NR)——去除各种噪声
  9. 锐化(Sharpening)——增强边缘细节
  10. 色调映射(Tone Mapping)——压缩动态范围

这十个模块,每个都能单独讲一章。今天咱们先看它们怎么串起来的。

我的经验:调试 ISP 时,永远从前往后调。前面 BLC 没调准,后面白平衡怎么调都偏色。我曾经在一个项目里花了三天调 AWB,最后发现是 BLC 的 offset 设错了——嗯,从那以后我再也不敢跳过前级验证。

1.3 ISP Pipeline 流程图

下面这张图是我手绘风格的 Pipeline 结构,你一看就明白信号怎么流了。

ISP Pipeline 核心流程 ISP Pipeline 核心流程 Sensor RAW 输入 预处理阶段(RAW Domain) BLC LSC DPC Demosaic AWB 处理阶段(RGB Domain) CCM Gamma NR Sharpening 后处理阶段(YUV/RGB Domain) Tone Mapping 色彩增强 格式转换 YUV/RGB 输出 注:实际芯片级 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 数据,经过预处理、处理、后处理三个阶段,最终输出给显示器或编码器。每个模块的职责、输入输出、常见坑点,心里都有数了。