海思ISP Pipeline解析:从Sensor到YUV的完整旅程

做ISP调试这些年,我见过不少新人一上来就盯着某个模块调参数,结果越调越乱。为什么?因为你不了解整个数据流是怎么跑的。今天我们就来拆解海思ISP的Pipeline,看看RAW数据从Sensor出来,一路经过哪些关卡,最后变成YUV图像。

一句话总结:ISP Pipeline就是把Sensor的RAW数据,经过黑电平校正、去噪、去马赛克、白平衡、色彩校正、Gamma、锐化等一系列处理,最终输出标准的YUV图像。

整体数据流概览

先看一张我画的流程图,把整个Pipeline串起来。你跟着箭头走一遍,心里就有谱了。

海思ISP Pipeline 数据流 Sensor RAW数据 BLC LSC DPC NR Demosaic AWB CCM Gamma EE CSC YUV输出 说明: BLC - 黑电平校正 | LSC - 镜头阴影校正 | DPC - 坏点校正 NR - 去噪 | Demosaic - 去马赛克 | AWB - 自动白平衡 CCM - 色彩校正矩阵 | Gamma - 伽马校正 | EE - 边缘增强 | CSC - 色彩空间转换

嗯,这张图我画了好几次才满意。你仔细看,数据是从左到右、从上到下流动的。上半部分是RAW域处理,下半部分是RGB/YUV域处理。分清楚这个,后面调参才不会乱。

各模块功能详解

1. BLC - 黑电平校正

Sensor在没有光照时,理论上输出应该是0。但实际不是,因为电路噪声,它会有一个固定的偏移量。这个偏移就是黑电平。

BLC模块就是把这个偏移减掉。说白了,就是把暗场拉回真正的黑色。

我的经验:BLC参数一般由Sensor厂商提供,但不同增益下黑电平会漂。我曾经在一个低光照项目中,发现暗部偏紫,查了半天,最后发现是BLC没跟上增益变化。后来我习惯在多个增益点下重新标定BLC。

2. LSC - 镜头阴影校正

镜头中心透光多,边缘透光少,拍出来四角发暗。LSC就是补偿这个亮度衰减。

海思平台用网格校正表,每个网格点存一个增益值。网格越密,校正越精细,但标定工作量也越大。

网格密度 校正精度 标定时间 适用场景
5x5 一般 约5分钟 低端镜头、快速量产
9x9 良好 约15分钟 主流手机、安防
17x17 优秀 约40分钟 高端相机、车载

注意:LSC校正过度会在边缘产生亮斑或色偏。我见过有人把增益调得太大,结果画面边缘发绿。校正量要控制在合理范围内,一般不超过原始亮度的1.5倍。

3. DPC - 坏点校正

Sensor生产过程中难免有坏点,表现为固定位置的亮点或暗点。DPC模块检测并替换这些坏点。

海思支持静态坏点表和动态检测两种方式。静态表在产线标定,动态检测在运行时实时判断。

我个人建议两种都用。静态表处理已知坏点,动态检测兜底。曾经有个项目,Sensor在高温下出现新的坏点,幸亏开了动态检测,不然返厂就麻烦了。

4. NR - 去噪

噪声是图像质量的死敌。海思的NR模块分两步:空域去噪和时域去噪。

  • 空域去噪:在单帧内做滤波,去掉随机噪声。缺点是容易抹掉细节。
  • 时域去噪:利用前后帧的相关性,运动区域少去噪,静止区域多去噪。效果好,但运动拖影是个坑。

调NR时,我习惯先调空域,把明显噪点压住,再开时域做精细处理。别一上来就把时域强度拉满,否则运动物体会糊成一片。

5. Demosaic - 去马赛克

Sensor的每个像素只采集一种颜色(R/G/B),通过Bayer阵列排列。Demosaic就是根据相邻像素插值出每个像素的完整RGB值。

插值算法有很多种,海思默认用自适应插值,边缘方向优先。效果不错,但在高频纹理区域还是会有伪色。

关键点:Demosaic的质量直接影响后续所有模块。如果这一步插值出错,后面的白平衡、色彩校正再怎么调也救不回来。所以,前期标定一定要把Bayer阵列对齐。

6. AWB - 自动白平衡

不同光源下,白色物体拍出来会偏色。AWB就是估计光源色温,然后调整RGB增益,让白色还原为白色。

海思的AWB算法基于色温统计,把画面分成多个区域,统计每个区域的R/G和B/G比值,然后查表得到色温估计值。

调AWB时,我最怕遇到混合光源场景。比如室内既有日光灯又有窗外的自然光,AWB容易左右摇摆。我的做法是手动锁定一个色温,或者用自定义色温区域限制。

7. CCM - 色彩校正矩阵

Sensor的RGB响应和人眼不一样,拍出来的颜色偏淡或偏怪。CCM通过一个3x3矩阵,把Sensor RGB映射到标准色彩空间。

矩阵系数怎么定?用24色卡标定。拍一张色卡图,提取每个色块的RGB值,和目标值做最小二乘拟合。

// CCM矩阵示例(3x3)
// 目标:将Sensor RGB转换为sRGB
[ 1.82  -0.53  -0.29 ]
[ -0.35  1.68   0.07 ]
[ 0.04  -0.22   1.18 ]

注意,CCM系数不能太大,否则会放大噪声。我一般控制对角线系数在1.5~2.0之间,非对角线系数值不超过0.5。

8. Gamma - 伽马校正

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

标准Gamma曲线是2.2。但海思平台允许自定义Gamma曲线,你可以根据场景调整。

  • 暗光场景:提高暗部斜率,提亮阴影。
  • 强光场景:降低亮部斜率,防止过曝。

我曾经在一个监控项目中,把Gamma曲线调成S形,暗部提亮、亮部压缩,结果画面动态范围明显提升。不过要注意,过度提亮暗部会放大噪声。

9. EE - 边缘增强

去噪会损失细节,EE模块负责把边缘找回来。它通过高通滤波提取边缘信息,再叠加回原图。

EE参数有三个核心:增益、阈值、半径。

参数 作用 调大后果 调小后果
增益 边缘增强强度 边缘过冲、白边 图像模糊
阈值 只增强超过阈值的边缘 噪声被增强 弱边缘丢失
半径 边缘影响的像素范围 边缘变粗、光晕 增强不明显

调EE时,我习惯先调阈值,把噪声过滤掉,再慢慢加增益。半径一般保持默认,除非画面有明显的锯齿。

10. CSC - 色彩空间转换

最后一步,把RGB转换为YUV。Y是亮度,UV是色度。YUV格式方便后续编码和显示。

海思支持多种YUV格式:YUV420、YUV422、YUV444。安防场景常用YUV420,节省带宽。

小技巧:如果你发现输出图像偏绿或偏紫,先别急着调CCM。检查一下CSC的转换矩阵是否正确。我遇到过几次,是CSC系数配错了,不是色彩校正的问题。

模块间的依赖关系

这些模块不是独立的,它们之间有很强的依赖。我列个表,你调试时心里有数。

前置模块 影响 后置模块
BLC BLC不准,AWB统计会偏移 AWB、CCM
LSC LSC不准,四角色偏,AWB误判 AWB、CCM
DPC 坏点不除,Demosaic插值出错 Demosaic、NR
NR 去噪过度,EE增强无效 EE
Demosaic 插值错误,CCM无法纠正 AWB、CCM
AWB 白平衡不准,CCM色彩偏移 CCM
CCM 矩阵系数影响Gamma后的色彩 Gamma
Gamma Gamma曲线影响EE的响应 EE

你看,AWB和CCM是连在一起的。AWB调不好,CCM怎么调都没用。我调试时,永远先保证BLC和LSC准确,再调AWB,最后调CCM和Gamma。这个顺序不能乱。

调试顺序建议

基于上面的依赖关系,我总结了一套调试顺序,供你参考。

  1. 标定阶段:BLC、LSC、DPC。这三个是基础,必须在产线标定好。
  2. 粗调阶段:AWB、CCM。用标准光源和色卡,把白平衡和色彩调准。
  3. 精调阶段:NR、EE。在真实场景下,平衡噪声和细节。
  4. 收尾阶段:Gamma、CSC。根据显示设备调整最终输出。

避坑提醒:不要跳过标定阶段直接调NR和EE。我曾经在一个项目中,为了赶进度,直接用默认的BLC和LSC参数,结果NR怎么调都有色斑。后来回头重新标定LSC,问题立刻解决。基础不牢,地动山摇。