2. ISP流水线关键模块解析:Bayer域、RGB域与YUV域处理

ISP流水线,说白了就是把CMOS传感器拍下来的原始数据,一步步变成人眼看着舒服的图像。我做了这么多年ISP,最深的体会是——三个域的处理各有各的脾气。Bayer域是底子,RGB域是调色,YUV域是精修。哪个环节出问题,最终图像都救不回来。

这一章,咱们把每个域的关键模块掰开揉碎了讲。我会结合项目里踩过的坑,告诉你哪些参数最敏感,哪些地方最容易翻车。

ISP流水线三域处理流程 Bayer域 黑电平校正 去噪 去马赛克 原始RAW数据 RGB域 AWB CCM Gamma 色彩校正 YUV域 边缘增强 色彩增强 缩放 最终输出 数据从左到右流动:传感器RAW → 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
我的经验:高通平台的黑电平值通常存储在传感器驱动里,但不同模组、不同增益下的OB值会有漂移。我建议在产线标定时,至少采集3个不同增益点的OB值,做线性插值。别偷懒只用一个固定值,否则暗光下偏色会让你怀疑人生。

2.1.2 去噪(Denoise)

去噪是Bayer域最核心、也最耗算力的模块。为什么要在Bayer域做?因为一旦做完去马赛克,噪声和信号就纠缠在一起,很难分开了。

高通ISP里常用的去噪策略分两步:

  1. 预处理降噪:用双边滤波或非局部均值滤波,去除热噪声和读出噪声。这一步要轻,别把细节磨没了。
  2. 主降噪:根据噪声模型做自适应滤波。亮区噪声小,暗区噪声大,滤波强度要跟着变。
避坑指南:我曾经在一个项目中,为了追求降噪效果,把双边滤波的sigma值调得太大。结果夜景照片噪点没了,但人脸变成了“蜡像”——纹理细节全糊了。后来我学乖了:降噪强度宁可保守一点,也别过度。细节丢了就再也回不来了。

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估计的色温动态切换。

我的经验:CCM的系数不要直接抄参考设计。每个模组的光学特性都有差异,我建议至少做3个色温点(D65、D50、A光源)的标定。另外,CCM的增益不要超过2.0,否则噪声会被放大到不可接受的程度。

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)。
  • 阈值:只有边缘强度超过阈值才做增强。阈值太低,噪声会被当成边缘放大。
  • 半径:模糊的半径。半径越大,增强的边缘越粗。
避坑指南:我曾经在一个项目中,为了追求“清晰度”,把边缘增强增益调到了3.0。结果在屏幕上看着确实锐利,但一放大,每个边缘都有一圈白边,像描了边一样。后来我学到的教训是:边缘增强的增益不要超过1.5,阈值要设到噪声水平以上。

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域,一步一步来,每一步都调稳了再往下走。这样出来的效果最扎实,后期返工也最少。