1. 高通ISP Pipeline概览:从Sensor到Display的完整数据流

各位工程师朋友,咱们今天聊聊高通ISP的Pipeline。说白了,就是一张照片从Sensor拍下来,到最终显示在屏幕上,中间经历了什么。

我刚开始接触高通平台时,也被这长长的Pipeline搞得头晕。后来调了几年,才慢慢摸清每个模块的脾气。今天我把这些经验整理出来,希望能帮你少走弯路。

1.1 整体数据流:Sensor → ISP → Display

先看一张整体流程图,我习惯把Pipeline分成四个阶段:

核心数据流:

Sensor RAW → Bayer域处理 → Demosaic → RGB域处理 → YUV域处理 → Display

高通ISP Pipeline 数据流概览 Sensor RAW Bayer域处理 Demosaic RGB域处理 YUV域处理 Display 各阶段关键任务: • Sensor RAW:原始拜耳数据,每个像素只有一种颜色分量 • Bayer域:黑电平校正、LSC、BPC、去噪等预处理 • Demosaic:插值恢复每个像素的R/G/B三通道 • RGB域:AWB、CCM、Gamma校正等色彩处理 • YUV域:降噪、锐化、色彩增强,最终输出给Display

你想想看,Sensor拍下来的原始数据,其实是一堆马赛克一样的拜耳阵列。每个像素只记录了红、绿、蓝中的一种颜色。后面的所有模块,都是在想办法把这些残缺信息补全、校正、美化。

1.2 Bayer域:原始数据的预处理

Bayer域是Pipeline的第一站。数据刚从Sensor出来,还带着各种硬件噪声和缺陷。

我记得第一次调高通平台时,发现暗角特别严重。后来查了才知道,是LSC(镜头阴影校正)参数没配好。嗯,这里要注意,Bayer域的几个关键模块:

  • BLC(黑电平校正):去掉Sensor的暗电流偏移。我习惯先抓一张全黑图,算平均值,再反推校正值。
  • LSC(镜头阴影校正):补偿镜头边缘亮度衰减。高通平台有专门的mesh表,需要根据镜头实测数据生成。
  • BPC(坏点校正):修复Sensor上的死点和亮点。我曾经遇到过一批Sensor坏点特别多,最后发现是BPC阈值设得太宽松。
  • 去噪:在Bayer域做简单的空间域降噪,保留边缘细节。

我的经验:Bayer域的处理顺序很重要。比如BLC必须在LSC之前做,否则阴影校正会把黑电平误差放大。高通文档里写得很清楚,但实际项目中经常有人搞反。

1.3 Demosaic:从马赛克到全彩

Demosaic,说白了就是插值。把每个像素缺失的两种颜色,用周围像素猜出来。

高通平台默认用的是自适应插值算法。它会根据图像边缘方向,选择不同的插值权重。这样做的好处是,边缘不容易出现锯齿和伪色。

但这里有个坑——我遇到过几次,在细条纹场景下,Demosaic会产生摩尔纹。后来调整了插值方向检测的阈值,才压下去。

注意:Demosaic的质量直接影响后续所有处理。如果这一步插值出了伪色,后面的AWB和CCM怎么调都救不回来。所以调试时,一定要先确认Demosaic的输出是干净的。

1.4 RGB域:色彩的校正与美化

进入RGB域后,每个像素都有了完整的R/G/B值。这时候主要做三件事:

模块 功能 调试要点
AWB(自动白平衡) 校正色温偏差,让白色看起来是白的 注意混合光源场景,容易偏色
CCM(色彩校正矩阵) 把Sensor的RGB映射到标准色彩空间 需要24色卡标定,矩阵系数要小心
Gamma校正 调整亮度响应曲线,适配显示设备 高通默认Gamma是2.2,但有些客户要求1.8

我个人习惯,调试时先固定AWB,再调CCM。如果AWB不准,CCM怎么调都是错的。你想想看,白平衡偏蓝,你再怎么调矩阵,肤色还是发青。

1.5 YUV域:最后的优化与输出

RGB转YUV,主要是为了压缩和显示方便。Y是亮度,UV是色度。人眼对亮度敏感,对色度不敏感,所以YUV域可以单独处理亮度。

这个阶段的核心模块:

  • 降噪(NR):Y通道和UV通道分开降噪。Y通道保留细节,UV通道可以狠一点。
  • 锐化(Sharpening):增强边缘对比度。高通有专门的Unsharp Mask算法,参数调不好容易出振铃。
  • 色彩增强:调整饱和度、对比度。我一般建议客户别调太猛,否则看起来像塑料花。

避坑指南:我曾经在YUV域把降噪开得太强,结果夜景模式下的星星全被抹掉了。后来改成根据亮度自适应降噪强度,暗区降噪强一点,亮区弱一点,效果就好多了。

1.6 各模块的依赖关系

Pipeline里的模块不是独立的。前面模块的输出,直接影响后面模块的效果。我画了个依赖关系图:

ISP模块依赖关系 BLC LSC BPC 去噪 Demosaic AWB CCM Gamma YUV域处理

从图里能看出来,Bayer域的处理是串行的,顺序不能乱。RGB域和YUV域内部也有依赖关系。比如AWB不准,CCM的矩阵系数就白标定了。

1.7 调试顺序建议

最后,我分享一下自己的调试顺序。这个顺序是我踩过无数坑后总结出来的:

  1. 先调Bayer域:BLC、LSC、BPC、去噪。确保原始数据干净。
  2. 再调Demosaic:确认插值没有伪色和锯齿。
  3. 然后调AWB:用灰卡标定,确保各种色温下白平衡准确。
  4. 接着调CCM和Gamma:用24色卡标定色彩矩阵。
  5. 最后调YUV域:降噪、锐化、色彩增强,根据场景微调。

小技巧:调试时,每调完一个模块,都抓一张中间结果图保存下来。这样出了问题,可以快速定位是哪个模块的锅。我习惯用高通自带的dump工具,在Pipeline的每个关键节点都输出一张图。

好了,这一章的内容就到这里。Pipeline的整体框架你已经清楚了,后面我们会逐个模块深入讲解。记住,ISP调试没有捷径,但有了清晰的思路,至少不会迷路。