2. ISP流水线关键模块解析:Bayer域、RGB域与YUV域处理
ISP流水线,说白了就是把CMOS传感器拍下来的原始数据,一步步变成人眼看着舒服的图像。我做了这么多年ISP,最深的体会是——三个域的处理各有各的脾气。Bayer域是底子,RGB域是调色,YUV域是精修。哪个环节出问题,最终图像都救不回来。
这一章,咱们把每个域的关键模块掰开揉碎了讲。我会结合项目里踩过的坑,告诉你哪些参数最敏感,哪些地方最容易翻车。
2.1 Bayer域处理:打好底子
Bayer域是ISP流水线的第一站。传感器输出的RAW数据,每个像素只记录一种颜色——R、G或B。这玩意儿看着就是灰蒙蒙一片,啥都认不出来。但所有后续处理的质量,都取决于这一步处理得好不好。
2.1.1 黑电平校正(BLC)
黑电平校正,名字听着挺唬人,其实道理很简单。传感器在完全无光的情况下,输出并不是0,而是有一个固定的偏置值。这个偏置就是黑电平。如果不把它减掉,暗部就会发灰,整个画面的对比度都会受影响。
校正公式:
// 黑电平校正,逐像素减去OB值
// 注意:不同通道的OB值可能不同
for each pixel (x, y):
corrected_val = raw_val - black_level[channel]
if corrected_val < 0: corrected_val = 0
2.1.2 去噪(Denoise)
去噪是Bayer域最核心、也最耗算力的模块。为什么要在Bayer域做?因为一旦做完去马赛克,噪声和信号就纠缠在一起,很难分开了。
高通ISP里常用的去噪策略分两步:
- 预处理降噪:用双边滤波或非局部均值滤波,去除热噪声和读出噪声。这一步要轻,别把细节磨没了。
- 主降噪:根据噪声模型做自适应滤波。亮区噪声小,暗区噪声大,滤波强度要跟着变。
2.1.3 去马赛克(Demosaic)
去马赛克,就是把Bayer格式的RAW数据,插值成每个像素都有R、G、B三个值的全彩图像。这一步做不好,图像边缘就会出现锯齿和伪色。
高通平台默认用的是自适应方向插值算法。它会先判断边缘方向,然后沿着边缘方向插值,避免跨边缘插值导致的模糊。
| 算法 | 质量 | 算力消耗 | 适用场景 |
|---|---|---|---|
| 双线性插值 | 低(锯齿明显) | 极低 | 预览模式、低功耗场景 |
| 自适应方向插值 | 中(边缘较好) | 中等 | 默认模式,平衡质量和功耗 |
| 基于深度学习的插值 | 高(伪色极少) | 高 | 高画质拍照模式 |
我个人习惯在预览模式下用双线性插值,省电;拍照时切换到自适应方向插值。至于深度学习插值,目前高通旗舰平台才支持,功耗确实高,但效果是真的好。
2.2 RGB域处理:调出好颜色
Bayer域处理完,图像已经是全彩的了,但颜色还不准。RGB域就是干这个的——把颜色校正到人眼看着舒服的状态。
2.2.1 自动白平衡(AWB)
AWB的目标很简单:让白色物体在任何光源下都呈现白色。但实现起来一点都不简单。不同色温的光源,会让同一块白布拍出来偏蓝或偏黄。
高通平台的AWB算法,核心是灰度世界 + 色温估计的混合策略:
- 灰度世界假设:场景中所有颜色的平均值应该是灰色。如果R/G或B/G比值偏离1,就调整增益。
- 色温估计:通过统计R/G和B/G的比值,查表得到当前色温,再查表得到对应的增益。
关键参数:AWB收敛速度不能太快,否则画面会闪烁;也不能太慢,否则用户都换场景了还在偏色。我一般把收敛时间设在0.5~1秒之间,具体看产品定位。
2.2.2 色彩校正矩阵(CCM)
CCM的作用,是把传感器捕捉到的颜色,映射到标准色彩空间(比如sRGB或BT.709)。因为传感器的滤色片和标准色度观察者曲线不可能完全一致,所以必须用矩阵校正。
CCM矩阵形式:
R_out = a11 * R_in + a12 * G_in + a13 * B_in
G_out = a21 * R_in + a22 * G_in + a23 * B_in
B_out = a31 * R_in + a32 * G_in + a33 * B_in
这个矩阵的系数,通常是在实验室里用色卡标定出来的。不同色温下,CCM系数也不一样。高通平台支持多组CCM,根据AWB估计的色温动态切换。
2.2.3 Gamma校正
Gamma校正,说白了就是做亮度映射。人眼对暗部细节更敏感,对亮部细节不敏感。Gamma曲线就是把更多的编码资源分配给暗部,让暗部看起来更细腻。
标准Gamma曲线:
// Gamma校正,标准sRGB曲线
if (linear_val <= 0.0031308):
gamma_val = 12.92 * linear_val
else:
gamma_val = 1.055 * pow(linear_val, 1/2.4) - 0.055
高通平台允许自定义Gamma LUT(查找表)。我建议在调试时,先用标准曲线,然后根据主观效果微调暗部和亮部的斜率。
2.3 YUV域处理:锦上添花
YUV域处理,是在图像已经“正确”的基础上,做“好看”的优化。Y通道管亮度细节,UV通道管色彩。
2.3.1 边缘增强(Edge Enhancement)
边缘增强,就是让图像的轮廓更锐利。高通平台用的是非锐化掩模(Unsharp Mask)算法:先对图像做模糊,然后用原图减去模糊图得到边缘信息,再把边缘信息加回原图。
核心参数就三个:
- 增益:边缘增强的强度。增益太大,边缘会出现白边(overshoot)。
- 阈值:只有边缘强度超过阈值才做增强。阈值太低,噪声会被当成边缘放大。
- 半径:模糊的半径。半径越大,增强的边缘越粗。
2.3.2 色彩增强(Color Enhancement)
色彩增强,是在不改变色相的前提下,让颜色更鲜艳。高通平台通常提供两个控制参数:
- 饱和度(Saturation):整体色彩的浓淡程度。
- 色相偏移(Hue Shift):特定颜色的偏向(比如让红色偏橙一点)。
我个人习惯在调试时,先调好AWB和CCM,让颜色准确,然后再微调饱和度。千万别在颜色不准的情况下直接拉饱和度——那会让偏色变得更难看。
2.3.3 缩放(Scaling)
缩放是ISP流水线的最后一站。传感器拍到的分辨率通常很高(比如4800万像素),但显示或编码需要的分辨率可能只有1080p。缩放模块负责把图像缩小到目标尺寸。
高通平台支持多种缩放算法:
| 算法 | 质量 | 算力消耗 | 适用场景 |
|---|---|---|---|
| 最近邻插值 | 低(锯齿严重) | 极低 | 缩略图、极低功耗 |
| 双线性插值 | 中(轻微模糊) | 低 | 预览模式 |
| 双三次插值 | 高(细节保留好) | 中等 | 拍照模式 |
| Lanczos插值 | 极高(振铃少) | 高 | 高画质需求 |
功耗提示:缩放是YUV域最耗算力的模块之一。如果预览和拍照的分辨率不同,我建议用两个独立的缩放通道,而不是先缩到预览尺寸再放大到拍照尺寸——后者会损失细节,而且更费电。
2.4 本章小结
ISP流水线的三个域,各有各的使命:
- Bayer域:打好底子。黑电平校正、去噪、去马赛克,每一步都影响后续处理的天花板。
- RGB域:调准颜色。AWB、CCM、Gamma,让颜色从“物理准确”走向“视觉舒适”。
- YUV域:锦上添花。边缘增强、色彩增强、缩放,让图像更好看、更实用。
调试ISP,最忌讳的就是跳着调。我见过有人先调色彩增强,再回头调AWB,结果前面调的全白费。记住:从Bayer域到YUV域,一步一步来,每一步都调稳了再往下走。这样出来的效果最扎实,后期返工也最少。