第三章 ISP Pipeline深度解析:ISP模块全景图
说实话,ISP Pipeline这个东西,我刚入行时也觉得挺唬人的。一堆模块串在一起,每个都有几十个参数要调。但干久了你会发现,它本质上就是个「图像美容流水线」——从RAW域开始,一步步把传感器采集的原始数据,变成人眼看着舒服的YUV图像。
我个人习惯把ISP分成三个域来理解:RAW域、RGB域、YUV域。每个域干的事完全不同,调参的思路也不一样。今天我就带你把这根Pipeline从头到尾捋一遍。
核心观点:ISP调优不是调单个模块,而是调整个链路的配合。你单独把Denoise调得再好,Sharpen一上来可能全毁了。
3.1 ISP模块全景图
先看一张整体框架图。这是我用SVG画的,把ISP Pipeline的核心模块和它们所在的域都标出来了。你盯着看两分钟,后面讲每个模块时你心里就有谱了。
你看,从左边RAW域开始,经过BLC、LSC、DPC这些「预处理」模块,然后Demosaic把Bayer格式转成RGB,进入RGB域做色彩和亮度的全局调整,最后转到YUV域做细节增强和降噪。嗯,这个顺序基本是所有ISP芯片的通用框架。
3.2 RAW域处理:传感器的「原生语言」
RAW域的数据是什么?说白了就是传感器每个像素点直接输出的电压值,经过ADC转换后的数字信号。它还是Bayer格式的——每个像素只记录了R、G、B中的一种颜色。这个阶段的数据最原始,也最「诚实」。
3.2.1 BLC(黑电平校正)
BLC是Pipeline的第一个模块。为什么要做这个?因为传感器在完全无光的情况下,输出的值并不是0。可能是64,也可能是128,取决于传感器型号。这个偏移量就是黑电平。
我遇到过一台手机,暗光下拍出来的照片偏绿。查了半天,发现是BLC没校准好,导致暗部色偏。你想想看,BLC不准,后面所有模块都在错误的基础上做校正,那能对吗?
调参技巧:BLC的值通常由传感器厂商提供,但实际项目中我建议你拿镜头盖盖住镜头,拍一张全黑图,然后统计一下R、Gr、Gb、B四个通道的平均值。这个值才是你当前模组真正的黑电平。
3.2.2 LSC(镜头阴影校正)
LSC解决的是镜头边缘亮度衰减的问题。说白了,就是镜头中心进光多,边缘进光少,导致四角发暗。LSC通过一个增益矩阵,把边缘的像素值提上来。
我记得有一次调一个广角镜头,边缘亮度比中心低了将近30%。LSC增益设得太高,边缘噪点全出来了。后来我学乖了——LSC的增益上限一定要设个阈值,不能无脑补偿。
3.2.3 DPC(坏点校正)
传感器总有那么几个像素是坏的——要么一直亮(亮点),要么一直暗(暗点)。DPC就是把这些坏点找出来,用周围像素的值插值替换掉。
这里有个坑:坏点检测的阈值设得太低,会把正常像素误判为坏点,图像变模糊;设得太高,坏点又漏检了。我建议你拿一张均匀灰卡图,先跑一遍坏点检测,看看检测结果是否合理。
3.2.4 Demosaic(去马赛克)
Demosaic是把Bayer格式转成RGB的关键一步。每个像素只有一种颜色信息,需要通过周围像素插值出另外两种颜色。
插值算法有很多种:双线性插值、边缘导向插值、自适应插值。我个人习惯在低光场景用边缘导向插值,能减少伪色和拉链效应。但代价是计算量大,帧率会掉。
3.3 RGB域处理:色彩的「调色盘」
进入RGB域后,每个像素都有了完整的R、G、B三个通道的值。这个阶段主要做色彩和亮度的全局调整。
3.3.1 AWB(自动白平衡)
AWB的目标是让白色物体在任何光源下都呈现白色。它通过估计当前光源的色温,然后调整R和B通道的增益。
AWB算法有很多种:灰度世界法、完美反射法、色温估计法。我踩过最大的坑是在混合光源场景下——比如室内既有日光灯又有窗外的自然光。AWB会左右摇摆,导致画面一半偏暖一半偏冷。
注意:AWB的收敛速度不能太快,否则画面会闪烁。也不能太慢,否则用户都换场景了,白平衡还没调过来。一般建议在0.5-1秒内完成收敛。
3.3.2 CCM(色彩校正矩阵)
CCM是一个3x3的矩阵,用来把传感器捕捉到的色彩映射到标准色彩空间(比如sRGB)。说白了,就是让红色更红、蓝色更蓝,但又不至于饱和过头。
CCM的调参是门手艺活。我一般会在D65光源下先调一组基础矩阵,然后在A光源、TL84光源下分别微调。记住一个原则:CCM的增益不能太大,否则会放大噪声。
3.3.3 Gamma校正
Gamma校正解决的是显示设备的非线性响应问题。人眼对暗部细节更敏感,而显示器的亮度响应是幂函数。Gamma校正就是在编码端做一次逆变换,让最终显示效果符合人眼感知。
标准Gamma值是2.2。但我在项目中经常根据场景调整——暗光场景用1.8能提亮暗部,强光场景用2.4能防止过曝。
3.4 YUV域处理:细节的「精修师」
YUV域把RGB拆成了亮度(Y)和色度(UV)两个分量。人眼对亮度变化更敏感,对色度变化相对不敏感。所以YUV域的处理策略是:Y通道做细节增强,UV通道做降噪和色彩平滑。
3.4.1 Denoise(去噪)
降噪是YUV域最核心的模块。噪声主要来自传感器的高ISO和暗光环境。降噪算法分空域降噪和时域降噪两种。
空域降噪:对单帧图像做滤波,比如双边滤波、NLM(非局部均值)。时域降噪:利用前后帧的相关性,把静止区域的噪声平均掉。
我建议你优先调时域降噪,因为它对细节的保留更好。但要注意运动检测的阈值——阈值太低,运动物体会拖尾;阈值太高,静止区域的噪声又降不干净。
3.4.2 Sharpen(锐化)
锐化是降噪的「死对头」。降噪把细节磨平了,锐化又把边缘勾出来。这两个模块的平衡,是ISP调优中最难的部分。
我曾经在一个项目中,Denoise做得太狠,图像像油画一样。然后Sharpen一拉,边缘是锐了,但噪声也一起被放大了。最后我用了边缘保护锐化——只在边缘区域做锐化,平坦区域保持不动。
核心原则:先降噪,后锐化。降噪要保留边缘,锐化要避免放大噪声。这两个模块的调参顺序不能乱。
3.5 三个域的调优策略总结
说了这么多,我总结一下三个域的调优策略:
| 处理域 | 核心目标 | 关键模块 | 调优重点 |
|---|---|---|---|
| RAW域 | 恢复传感器原始数据的准确性 | BLC、LSC、DPC、Demosaic | 黑电平校准、阴影补偿、坏点检测阈值 |
| RGB域 | 色彩还原和亮度映射 | AWB、CCM、Gamma、Tone Mapping | 白平衡收敛速度、CCM矩阵精度、Gamma曲线 |
| YUV域 | 细节增强和噪声抑制 | Denoise、Sharpen、色彩增强 | 降噪强度与锐化强度的平衡 |
你想想看,ISP调优就像做菜。RAW域是洗菜切菜——把原材料处理干净。RGB域是调味——决定菜的颜色和口味基调。YUV域是摆盘——让菜看起来精致诱人。哪个环节出问题,最终端上桌的菜都不好吃。
我的个人习惯:每次拿到一个新模组,我会先把RAW域的BLC和LSC调准,然后固定住不动。接着调RGB域的AWB和CCM,最后才碰YUV域的Denoise和Sharpen。这个顺序能帮你快速定位问题出在哪个环节。
好了,ISP Pipeline的全景图就讲到这里。记住三个域的分工和配合逻辑,后面每个模块的详细调参方法,我们会在后续章节逐一展开。