2. ISP Pipeline概览:从RAW图到YUV
各位好,欢迎来到第二章。上一章我们聊了图像传感器怎么把光信号变成RAW数据,那RAW数据进到ISP之后,到底经历了什么?这一章,我带大家把ISP的整个Pipeline走一遍。
说白了,ISP就是个“图像厨师”。RAW图就像刚摘下来的蔬菜,带着泥土、还有虫眼。经过ISP一道道工序的清洗、切配、调味,最后端上桌的,才是我们肉眼看着舒服的YUV图像。
2.1 为什么需要ISP?RAW图到底“Raw”在哪?
我刚开始接触ISP时,总觉得RAW图不就是黑白灰吗?后来才发现,RAW图的问题远不止“没颜色”这么简单。
RAW图的问题清单:
- 暗电平偏移: 即使完全遮光,像素也有一个基础输出值,不是0。
- 固定模式噪声(FPN): 每个像素的暗电流不一致,导致画面有固定的竖条纹或网格。
- 镜头阴影: 镜头中心进光多,边缘进光少,画面四角发暗。
- 坏点: 传感器上总有那么几个“死像素”,要么全亮要么全暗。
- 拜耳阵列: 每个像素只采集一种颜色(R/G/B),需要猜出另外两种。
- 白平衡偏差: 不同光源下,白色物体拍出来不白。
- 人眼非线性响应: 传感器是线性的,但人眼对暗部更敏感。
你看,这么多问题,不经过ISP处理,RAW图根本没法看。ISP Pipeline就是逐一解决这些问题的流水线。
2.2 ISP Pipeline的宏观流程
先给大家一张总图,把整个流程串起来。我个人习惯把ISP分成三大阶段:前端校正、中间处理、后端输出。
嗯,这张图基本把Pipeline的骨架画出来了。下面我们逐个模块拆开讲。
2.3 前端校正:把RAW图“洗干净”
前端校正处理的是RAW域数据,也就是在拜耳阵列格式下直接操作。这个阶段的目标只有一个:消除传感器和镜头引入的固定瑕疵。
2.3.1 暗电平校正
传感器有“暗电流”,即使没光也有输出。校正方法很简单:减去一个参考值。这个参考值通常来自传感器周边的“光学黑区”(OB, Optical Black)。
2.3.2 固定模式噪声(FPN)消除
FPN是传感器自身的“指纹”,每颗芯片都不一样。校正方法:在完全遮光条件下,采集一帧“暗场”,然后从后续每一帧中减去这个暗场。
2.3.3 镜头阴影校正(LSC, Lens Shading Correction)
镜头中心到边缘的光衰减,导致四角发暗。校正方法:预先标定一个增益矩阵,对边缘像素乘以更大的增益。
| 区域 | 相对亮度 | 需要增益 |
|---|---|---|
| 中心 | 100% | 1.0x |
| 中间 | 70% | 1.43x |
| 边缘 | 50% | 2.0x |
2.3.4 坏点校正(DPC, Defective Pixel Correction)
传感器总有坏点。校正方法:检测到坏点后,用周围像素的平均值或中值替换。
2.4 中间处理:从RAW到RGB的“魔法”
前端校正完,RAW图干净了,但还是一片灰蒙蒙的拜耳阵列。中间处理阶段,我们要把它变成人眼能看的彩色图像。
2.4.1 去马赛克(Demosaic)
这是ISP里最核心的算法之一。每个像素只有一种颜色,需要根据周围像素猜出另外两种。说白了,就是“插值”。
常见的插值算法:
- 双线性插值: 简单,但边缘有锯齿。
- 边缘导向插值: 先判断边缘方向,再沿边缘插值,效果更好。
- 自适应插值: 结合多种策略,是目前的主流。
2.4.2 白平衡(AWB, Auto White Balance)
不同光源下,白色物体拍出来不白。校正方法:找到场景中的“白色参考点”,然后调整R/G/B三个通道的增益,让白色点恢复为纯白。
2.4.3 去噪(NR, Noise Reduction)
去噪是ISP里最“艺术”的环节。去多了,画面糊;去少了,画面脏。
我个人的经验:去噪要分区域、分亮度。暗部噪声多,去狠一点;亮部细节多,去轻一点。安防监控尤其要注意运动区域的去噪,否则运动物体会出现“拖影”。
2.4.4 色彩校正矩阵(CCM, Color Correction Matrix)
传感器的色彩响应和人眼不一样。CCM是一个3x3的矩阵,把传感器RGB转换到标准RGB空间。
// 典型的CCM示例
R_out = 1.8 * R_in - 0.5 * G_in - 0.3 * B_in
G_out = -0.2 * R_in + 1.6 * G_in - 0.4 * B_in
B_out = -0.1 * R_in - 0.3 * G_in + 1.4 * B_in
2.4.5 Gamma校正
传感器是线性的,但人眼对暗部更敏感。Gamma校正就是把线性数据映射到人眼感知的非线性空间。标准Gamma值通常是2.2。
2.4.6 锐化(Sharpening)
经过前面几步,图像细节可能被模糊了。锐化就是增强边缘对比度,让画面更清晰。
2.5 后端输出:从RGB到YUV
最后一步,把RGB转换成YUV。为什么是YUV?因为YUV把亮度和色度分开,方便压缩和传输。安防监控中,YUV 4:2:0是最常见的格式。
转换公式很简单:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B
2.6 数据流与带宽
讲完流程,我们聊聊数据流。ISP内部的数据量非常大,尤其是高分辨率、高帧率的安防摄像头。
| 分辨率 | 帧率 | RAW带宽(10bit) | YUV带宽(8bit 4:2:0) |
|---|---|---|---|
| 1920x1080 | 30fps | ~622 Mbps | ~249 Mbps |
| 3840x2160 | 30fps | ~2.49 Gbps | ~996 Mbps |
| 3840x2160 | 60fps | ~4.98 Gbps | ~1.99 Gbps |
你看,4K@60fps的RAW带宽接近5Gbps。ISP内部必须用流水线架构,逐行处理,不能等整帧数据都到了再处理。这也是为什么ISP设计这么有挑战性。
2.7 小结
这一章,我们把ISP Pipeline从头到尾捋了一遍。从RAW图到YUV,中间经历了前端校正、中间处理、后端输出三大阶段。每个阶段都有它的使命,每个模块都有它的坑。