1. 高通ISP Pipeline概览:从Sensor到Display的完整数据流
各位工程师朋友,咱们今天聊聊高通ISP的Pipeline。说白了,就是一张照片从Sensor拍下来,到最终显示在屏幕上,中间经历了什么。
我刚开始接触高通平台时,也被这长长的Pipeline搞得头晕。后来调了几年,才慢慢摸清每个模块的脾气。今天我把这些经验整理出来,希望能帮你少走弯路。
1.1 整体数据流:Sensor → ISP → Display
先看一张整体流程图,我习惯把Pipeline分成四个阶段:
核心数据流:
Sensor RAW → Bayer域处理 → Demosaic → RGB域处理 → 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里的模块不是独立的。前面模块的输出,直接影响后面模块的效果。我画了个依赖关系图:
从图里能看出来,Bayer域的处理是串行的,顺序不能乱。RGB域和YUV域内部也有依赖关系。比如AWB不准,CCM的矩阵系数就白标定了。
1.7 调试顺序建议
最后,我分享一下自己的调试顺序。这个顺序是我踩过无数坑后总结出来的:
- 先调Bayer域:BLC、LSC、BPC、去噪。确保原始数据干净。
- 再调Demosaic:确认插值没有伪色和锯齿。
- 然后调AWB:用灰卡标定,确保各种色温下白平衡准确。
- 接着调CCM和Gamma:用24色卡标定色彩矩阵。
- 最后调YUV域:降噪、锐化、色彩增强,根据场景微调。
小技巧:调试时,每调完一个模块,都抓一张中间结果图保存下来。这样出了问题,可以快速定位是哪个模块的锅。我习惯用高通自带的dump工具,在Pipeline的每个关键节点都输出一张图。
好了,这一章的内容就到这里。Pipeline的整体框架你已经清楚了,后面我们会逐个模块深入讲解。记住,ISP调试没有捷径,但有了清晰的思路,至少不会迷路。