1. ISP Pipeline 全景概览:从 Sensor 到显示器的完整图像信号处理流程

各位同学,咱们今天聊聊 ISP Pipeline 的全貌。说白了,就是一张照片从 Sensor 捕捉到光线,到最后在你屏幕上显示出来,中间到底经历了什么。

我刚开始接触 ISP 时,觉得不就是调调亮度、改改颜色吗?后来踩了不少坑才明白——ISP 是一个环环相扣的精密系统,任何一个模块的参数没调好,后面再怎么补救都白搭。

1.1 为什么需要 ISP?Sensor 的“原片”有多原始?

先问一个问题:Sensor 直接输出的数据,能看吗?

答案是——基本不能。

Sensor 输出的 RAW 数据,本质上就是一个 拜耳阵列(Bayer Pattern) 的电压值。每个像素只记录了红、绿、蓝中的一种颜色,而且数值是线性的,跟人眼感知完全不同。

RAW 数据的“三宗罪”:

  • 缺颜色:每个像素只有一种颜色,需要插值才能变成全彩
  • 太暗/太亮:动态范围有限,高光容易过曝,暗部全是噪点
  • 有噪声:Sensor 本身的热噪声、读出噪声,全在里面

所以,ISP 存在的意义就是——把 RAW 数据“翻译”成人眼看着舒服的图像。

1.2 ISP Pipeline 的完整流程

下面这张图,是我自己画的 ISP 标准流程。每个模块我都标了颜色,方便你对照着看。

ISP Pipeline 标准流程 ISP Pipeline 标准流程 RAW Sensor 输入 黑电平校正 + 镜头阴影校正 去噪 (NR) + 去马赛克 (Demosaic) 白平衡 (AWB) + 颜色校正矩阵 (CCM) Gamma 校正 + 色调映射 (Tone Mapping) 锐化 (Sharpening) + 输出 YUV/RGB 注意:实际 Pipeline 顺序可能因芯片厂商而异,但核心模块基本一致

嗯,这张图看着有点密,我拆开来讲。

1.3 各模块功能详解

1.3.1 黑电平校正 (Black Level Correction)

Sensor 在完全无光时,输出的值不是 0,而是某个固定偏移。这个偏移就是黑电平。校正很简单——减去这个偏移值。

我的经验:不同 Sensor 的黑电平可能随温度漂移。我曾经遇到过一个项目,白天调好的黑电平,到了晚上温度降了 10 度,画面整体偏绿。后来加了温度补偿才搞定。

1.3.2 镜头阴影校正 (Lens Shading Correction)

镜头边缘进光量比中心少,导致四周偏暗。校正方法就是——给边缘像素乘一个增益系数。

这个增益系数通常存在一个 LSC 网格表 里,每个网格点对应一个增益值。

网格位置 R 增益 Gr 增益 Gb 增益 B 增益
中心 (0,0) 1.0 1.0 1.0 1.0
边缘 (3,3) 1.8 1.7 1.7 1.9
角落 (7,7) 2.5 2.3 2.3 2.6

1.3.3 去噪 (Noise Reduction)

Sensor 噪声主要分两种:光子散粒噪声 和 读出噪声。

  • 空域去噪:双边滤波、非局部均值等,平滑噪声但保留边缘
  • 时域去噪:多帧叠加,适合低光照场景

避坑指南:去噪强度不能一刀切。我曾经把去噪开得太猛,结果人脸皮肤是光滑了,但头发细节全没了,看起来像塑料假人。后来改用 边缘感知的自适应去噪,才平衡了平滑度和细节。

1.3.4 去马赛克 (Demosaic)

拜耳阵列每个像素只有一种颜色,需要插值出另外两种颜色。常用的方法有:

  • 双线性插值:简单但容易产生伪彩色
  • 方向自适应插值:沿边缘方向插值,减少锯齿
  • 基于深度学习的插值:效果好,但算力要求高

1.3.5 白平衡 (AWB)

人眼会自动适应不同色温的光源,但 Sensor 不会。AWB 的任务就是——让白色物体在任何光源下都看起来是白的。

我习惯用 灰度世界法 做初调,再用 色温估计法 做精调。但遇到大面积单色场景(比如蓝天、绿草地),灰度世界法会翻车。这时候就得靠 统计学习模型 来兜底。

1.3.6 颜色校正矩阵 (CCM)

Sensor 的光谱响应和人眼不一样,所以需要用一个 3x3 矩阵把 Sensor 的 RGB 转换到标准色彩空间(比如 sRGB)。

// CCM 示例:将 Sensor RGB 转换到 sRGB
[R_sRGB]   [ 1.8  -0.5  -0.3] [R_sensor]
[G_sRGB] = [-0.2   1.4  -0.2] [G_sensor]
[B_sRGB]   [-0.1  -0.3   1.4] [B_sensor]

这个矩阵的系数,通常通过拍摄 24 色卡 来标定。

1.3.7 Gamma 校正

人眼对暗部变化更敏感,对亮部变化不敏感。Gamma 校正就是——把线性信号映射到非线性空间,让暗部细节更丰富。

标准 Gamma 曲线:V_out = V_in ^ (1/2.2)

1.3.8 色调映射 (Tone Mapping)

高动态范围(HDR)场景下,Sensor 记录的亮度范围远超显示器的显示能力。色调映射就是——把宽动态范围压缩到显示器能显示的范围内,同时保留对比度感。

1.3.9 锐化 (Sharpening)

经过前面一堆处理,图像多少会变模糊。锐化就是——增强边缘对比度,让图像看起来更清晰。

我的习惯:锐化一定要在 Gamma 之后做。如果在 Gamma 之前做锐化,暗部的噪声会被放大,亮部的边缘反而锐不起来。这个顺序我踩过坑,记住了。

1.4 模块间的交互关系

ISP 不是流水线那么简单。模块之间是 相互影响 的:

  • 去噪 vs 锐化:去噪太强,锐化也救不回来细节;锐化太强,噪声会被放大
  • AWB vs CCM:白平衡不准,CCM 再怎么调颜色也是偏的
  • Gamma vs Tone Mapping:Gamma 是固定曲线,Tone Mapping 是动态调整,两者配合不好会导致对比度失真

所以,调 ISP 参数时,不能只盯着一个模块。我一般会先固定 AWB 和 CCM,然后调去噪和锐化的平衡,最后再微调 Gamma 和 Tone Mapping。

1.5 不同场景下的 Pipeline 差异

场景 去噪强度 锐化强度 HDR 需求
白天户外 低 中 低
夜景 高 低 高
人像 中 低(皮肤) 中
文档扫描 低 高 低

你看,不同场景下,每个模块的参数配置完全不同。这也是为什么 ISP 调优这么依赖经验——没有一套参数能打天下。

本章核心要点:

  • ISP Pipeline 从 RAW 数据开始,经过 9 个核心模块,最终输出 YUV/RGB
  • 模块之间相互影响,调参不能孤立看待
  • 不同场景需要不同的参数配置,没有万能方案
  • 理解每个模块的物理意义,比死记参数更重要