4. 图像信号处理(ISP)流水线:ISP Pipeline整体架构、各模块功能与顺序、RAW域与RGB域处理区别
ISP Pipeline,说白了就是传感器拍完照片后,到我们能看见漂亮图像之间,那一整套“洗照片”的工序。我经常跟新人讲,传感器是眼睛,ISP就是大脑。眼睛看到的是原始数据,大脑才能把它变成有意义的画面。
今天咱们就把这个“大脑”拆开看看。我会结合自己这些年调过的项目,把每个模块的坑和心得都抖出来。
4.1 ISP Pipeline 整体架构
一个典型的ISP流水线,从传感器拿到RAW数据开始,一路处理到YUV或RGB输出。我习惯把它分成三大阶段:
- RAW域处理:坏点校正、黑电平校正、去噪、去马赛克前的预处理
- RGB域处理:白平衡、颜色校正、Gamma、锐化
- YUV域处理:亮度/色度分离后的降噪、边缘增强、色彩调整
你想想看,为什么要有这么多域?因为每个域的数据特性不一样,适合干的事也不一样。RAW域数据最原始,噪声特性最清楚;RGB域人眼看着最直观,适合做颜色相关的调整;YUV域把亮度和颜色分开,处理起来互不干扰。
核心观点:ISP Pipeline的顺序不是随便排的。每个模块的输入输出格式、数据位宽、时序要求,都得前后匹配。我曾经见过一个团队,把去马赛克放在坏点校正前面,结果坏点被插值算法“美化”成了彩色条纹,后面怎么调都去不掉。
下面这张图是我自己画的ISP Pipeline标准流程,你可以把它当作一个“地图”来用:
4.2 各模块功能与顺序
咱们按流程顺序,一个一个来过。每个模块我都会说清楚它干什么、为什么放在这个位置。
4.2.1 坏点校正 (DPC)
传感器上的像素点,总有几个是“坏”的——要么一直亮、要么一直暗。DPC就是把这些点找出来,用周围像素的值替换掉。我建议把它放在最前面,因为后面的处理都会放大坏点的影响。
经验之谈:坏点检测有两种方式——静态标定和动态检测。静态标定在产线做一次,记下坏点坐标;动态检测在运行时实时判断。我一般两种都用:静态的保底,动态的兜住温度变化产生的新坏点。
4.2.2 黑电平校正 (BLC)
传感器在完全无光的情况下,输出并不是0,而是有一个基底值。BLC就是把这个基底减掉。嗯,这里要注意:不同增益下的黑电平不一样,不能只减一个固定值。
4.2.3 RAW去噪
在RAW域做去噪,好处是噪声模型简单——主要是光子散粒噪声和读出噪声。我习惯用双边滤波或者非局部均值,效果比简单的高斯滤波好得多。
4.2.4 镜头阴影校正 (LSC)
镜头中心透光多、边缘透光少,拍出来的照片四角发暗。LSC就是给边缘像素乘一个增益系数,把亮度拉回来。这个系数跟镜头、光圈、焦距都有关系,一般需要标定。
4.2.5 去马赛克 (Demosaic)
这是RAW域到RGB域的分水岭。Bayer格式的每个像素只有一种颜色,去马赛克就是通过插值,让每个像素都有R、G、B三个值。插值算法的好坏,直接决定图像的边缘和细节质量。
注意:去马赛克之后,数据量变成原来的3倍。后面的模块都得处理全彩数据,计算量会大很多。所以有些低功耗芯片会把部分处理放在RAW域做,就是为了省带宽。
4.2.6 白平衡 (AWB)
人眼有“色温恒常性”——不管在日光灯下还是蜡烛下,看白纸都是白的。但传感器没有这个能力。AWB就是估算当前光源色温,然后调整R、G、B的增益,让白色物体真正呈现白色。
4.2.7 颜色校正矩阵 (CCM)
传感器的色彩响应和人眼不一样。CCM用一个3x3的矩阵,把传感器RGB转换到标准色彩空间(比如sRGB)。这个矩阵需要对着色卡标定,我一般用24色卡,最小二乘法拟合。
4.2.8 Gamma校正
人眼对暗部的变化更敏感,对亮部的变化不敏感。Gamma校正就是把暗部细节拉开、亮部压缩,让图像看起来更自然。标准Gamma值是2.2,但不同显示设备可能不一样。
4.2.9 色调映射 (Tone Mapping)
高动态范围(HDR)场景下,传感器记录的亮度范围比显示设备能显示的大得多。色调映射就是把宽动态范围压缩到显示范围内,同时保留细节和对比度。
4.2.10 YUV域处理
转到YUV域后,亮度和色度分开处理。Y通道做锐化和去噪,UV通道做色度降噪和饱和度调整。这样做的好处是:锐化不会产生彩色伪影,降噪也不会模糊边缘。
4.3 RAW域与RGB域处理区别
这个区别,我直接用表格来说清楚:
| 对比维度 | RAW域处理 | RGB域处理 |
|---|---|---|
| 数据格式 | 单通道(Bayer模式),每个像素只有一种颜色 | 三通道,每个像素有完整R、G、B |
| 数据量 | 小(1/3的RGB数据量) | 大(3倍于RAW) |
| 噪声特性 | 噪声模型简单,与信号强度相关 | 噪声经过插值和颜色变换后变得复杂 |
| 处理目标 | 修复传感器物理缺陷、降低原始噪声 | 调整颜色、对比度、亮度等视觉属性 |
| 典型算法 | 坏点校正、黑电平、RAW去噪、LSC | AWB、CCM、Gamma、色调映射 |
| 计算复杂度 | 低到中 | 中到高 |
| 硬件实现 | 适合用简单流水线、行缓冲 | 需要帧缓冲或大块行缓冲 |
说白了,RAW域处理是“修底片”,RGB域处理是“调照片”。底片修不好,后面怎么调都白搭。我见过太多团队在RGB域花大力气调颜色、调锐度,结果RAW域的坏点和噪声没处理好,图像质量天花板就在那里了。
我的建议:调试ISP时,先把RAW域的参数调好——坏点、黑电平、去噪、LSC。这些基础打牢了,再去碰RGB域的白平衡、CCM和Gamma。顺序对了,事半功倍;顺序错了,事倍功半。
举个例子。有一次我调一个安防摄像头项目,客户反映夜间图像偏色严重。我一看,团队把AWB调了无数版,CCM也换了好几套,就是没效果。后来我查了RAW域的数据,发现黑电平校正的参数不对——不同增益下的黑电平没分开标定。导致暗部信号整体偏移,AWB再怎么调也拉不回来。修正了BLC之后,偏色问题直接解决了。
所以,记住这个原则:先RAW后RGB,先修底片再调照片。