3、ISP流水线总览:ISP全流程框图(从RAW到YUV)
各位同学,今天咱们来聊聊ISP的全局架构。说实话,我见过不少工程师,一上来就扎进某个模块的细节里,结果调了几个月,发现整体效果还是不对。为什么?因为ISP是个系统工程,你得先看懂这张“地图”。
我个人习惯,拿到一颗新的sensor,第一件事不是调参数,而是把整个ISP流水线在脑子里过一遍。从RAW数据进来,到YUV输出,中间经历了什么?每个模块在干什么?带宽够不够?这些搞不清楚,后面全是坑。
3.1 ISP全流程框图:从RAW到YUV
先看这张图,这是我画的一个典型ISP流水线。别被吓到,其实核心链路就那么几条。
这张图我画了好几个版本,最终选了这种分层展示。你看,从上到下分成了四个阶段:RAW域预处理、RGB域重建、3A统计与控制、YUV域后处理。每个阶段都有它的使命。
3.2 各模块功能简介
咱们按流水线的顺序,一个一个过。每个模块我只说最核心的,细节后面章节会展开。
3.2.1 RAW域预处理模块
这部分处理的是最原始的Bayer数据。说白了,就是先把传感器带来的“脏东西”清理掉。
- 黑电平校正(BLC):每个像素都有个暗电流底噪,得先减掉。我记得有一次,某个sensor的BLC没调好,暗部全是偏绿的,查了两天才发现是黑电平没对准。
- 去噪(NR):RAW域的去噪很讲究。我建议先做空域降噪,再做时域降噪。顺序反了,运动拖影会让你头疼。
- 坏点校正(DPC):传感器总有那么几个“死像素”。静态坏点好办,动态坏点才麻烦。我曾经遇到过一个项目,坏点表没更新,结果用户拍星空全是亮点,被投诉惨了。
- 镜头阴影校正(LSC):镜头边缘亮度会衰减,得补偿回来。这个模块的增益系数不能太大,否则噪声会被放大。
3.2.2 RGB域重建模块
RAW数据是Bayer格式,每个像素只有一种颜色。得通过插值变成全彩的RGB图像。
- 白平衡(AWB):让白色物体在不同色温下都呈现白色。说白了就是调R/G/B三个通道的增益。我见过有人直接用灰卡校准,但实际场景哪有那么多灰卡?还是得靠统计。
- Demosaic(去马赛克):Bayer插值。这个模块很吃算力,也直接影响分辨率。简单的双线性插值速度快,但边缘会有锯齿。我建议用自适应插值,效果会好很多。
- 色彩校正矩阵(CCM):把sensor的RGB转换到标准色彩空间。这个矩阵是3x3的,调起来很微妙。调大了颜色过饱和,调小了又发灰。
- Gamma校正:人眼对暗部更敏感,所以要做非线性映射。标准Gamma是2.2,但不同显示设备可能不一样。
3.2.3 3A统计与控制模块
AE、AWB、AF这三个是ISP的“大脑”。它们不直接处理图像,而是通过统计信息来控制其他模块。
| 模块 | 全称 | 核心功能 | 输出 |
|---|---|---|---|
| AE | 自动曝光 | 统计亮度直方图,调整曝光时间/增益 | 曝光时间、模拟增益、数字增益 |
| AWB | 自动白平衡 | 统计R/G/B比例,估计色温 | R/G/B增益系数 |
| AF | 自动对焦 | 计算对比度或相位差,驱动镜头 | 镜头位置 |
3.2.4 YUV域后处理模块
到了YUV域,图像已经基本可看了。这部分主要是“锦上添花”。
- 色彩增强:调整饱和度和色调。调得太艳会显得假,太素又不好看。这个度很难把握。
- 锐化(Sharp):增强边缘。锐化过度会有光晕,锐化不足又模糊。我建议用非锐化掩模(USM),效果比较可控。
- 色彩空间转换(CSC):从RGB转到YUV。YUV的好处是亮度和色度分离,方便后续压缩和显示。
3.3 数据流与带宽分析
这部分容易被忽略,但恰恰是项目落地的关键。你想想看,一个4K@60fps的sensor,数据量有多大?
咱们算一笔账:
// 以4K@60fps、10bit RAW为例
分辨率:3840 × 2160 = 8,294,400 像素
帧率:60 fps
位深:10 bit = 1.25 byte
Bayer格式:每个像素1个颜色通道
RAW数据带宽 = 8,294,400 × 60 × 1.25 = 622 MB/s
// 经过Demosaic后变成RGB888
RGB数据带宽 = 8,294,400 × 60 × 3 = 1,493 MB/s
// 最终YUV420输出
YUV数据带宽 = 8,294,400 × 60 × 1.5 = 746 MB/s
看到了吗?从RAW到RGB,带宽翻了一倍多。这就是为什么很多ISP会在RAW域做压缩,或者在RGB域做下采样。
带宽瓶颈在哪里?
- RAW域:622 MB/s,DDR带宽还能扛住
- RGB域:1.5 GB/s,很多嵌入式平台已经吃力了
- YUV域:746 MB/s,相对友好
我建议:如果平台带宽有限,可以在Demosaic之前做一次下采样。虽然会损失一点分辨率,但带宽能降一半。
还有一个容易被忽视的点:行缓冲(Line Buffer)。很多模块需要邻域像素,比如3x3的滤波,就得缓存两行数据。对于4K分辨率,一行就有3840个像素,10bit的话就是3840字节。两行就是7.68KB。如果模块多了,Line Buffer加起来也很可观。
我记得有一次做低功耗项目,为了省带宽,把NR和DPC合并到一个模块里做。结果省了30%的带宽,但效果只差了5%。有时候,工程就是做取舍。
3.4 小结
这一章咱们把ISP的全貌看了一遍。从RAW到YUV,每个模块都有自己的角色。你不需要一下子记住所有细节,但脑子里要有这张“地图”。
后面我们会逐个模块深入。到时候你会发现,很多问题其实在总览阶段就能预判到。这就是为什么我总说:先看全局,再抠细节。