海思ISP Pipeline解析:从Sensor到YUV的完整旅程
做ISP调试这些年,我见过不少新人一上来就盯着某个模块调参数,结果越调越乱。为什么?因为你不了解整个数据流是怎么跑的。今天我们就来拆解海思ISP的Pipeline,看看RAW数据从Sensor出来,一路经过哪些关卡,最后变成YUV图像。
一句话总结:ISP Pipeline就是把Sensor的RAW数据,经过黑电平校正、去噪、去马赛克、白平衡、色彩校正、Gamma、锐化等一系列处理,最终输出标准的YUV图像。
整体数据流概览
先看一张我画的流程图,把整个Pipeline串起来。你跟着箭头走一遍,心里就有谱了。
嗯,这张图我画了好几次才满意。你仔细看,数据是从左到右、从上到下流动的。上半部分是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。这个顺序不能乱。
调试顺序建议
基于上面的依赖关系,我总结了一套调试顺序,供你参考。
- 标定阶段:BLC、LSC、DPC。这三个是基础,必须在产线标定好。
- 粗调阶段:AWB、CCM。用标准光源和色卡,把白平衡和色彩调准。
- 精调阶段:NR、EE。在真实场景下,平衡噪声和细节。
- 收尾阶段:Gamma、CSC。根据显示设备调整最终输出。
避坑提醒:不要跳过标定阶段直接调NR和EE。我曾经在一个项目中,为了赶进度,直接用默认的BLC和LSC参数,结果NR怎么调都有色斑。后来回头重新标定LSC,问题立刻解决。基础不牢,地动山摇。