第2章:ISP基础架构——经典ISP流水线(Bayer域、RGB域、YUV域)及各模块功能概览

做ISP芯片这些年,我最大的感受是:ISP本质上是一条数据精炼流水线。传感器送来的原始数据,就像刚从矿里挖出来的矿石,经过一道道工序,最终变成我们眼睛能接受的图像。

这条流水线,业内习惯按色彩空间分成三大段:Bayer域、RGB域、YUV域。每个域里干的活不一样,处理的数据格式也不一样。今天我就带你把这三大段捋一遍。

核心认知:ISP流水线的设计哲学是“先修复,后增强”。Bayer域主要做修复(去噪、去坏点),RGB域做色彩重建,YUV域做增强和压缩。顺序搞反了,效果会大打折扣。

2.1 三大色彩域的分工与数据格式

先看一张整体架构图,方便你建立全局印象。

ISP流水线三大域架构图 经典ISP流水线:三大色彩域 RAW Sensor 输入 Bayer 域 黑电平校正 · 坏点校正 · 去噪 镜头阴影校正 · 原始去马赛克 数据格式:Bayer RAW (每像素1通道) RGB 域 白平衡 · 色彩校正矩阵 (CCM) Gamma 校正 · 色调映射 数据格式:RGB (每像素3通道) YUV 域 边缘增强 · 降噪 · 色彩调整 数据格式:YUV 4:2:2 / 4:2:0 编码 / 显示输出 💡 数据量变化 Bayer: 1通道/像素 RGB: 3通道/像素 YUV: 1.5~2通道/像素 ⚠️ 带宽瓶颈 RGB域数据量是Bayer的3倍 AI算子建议在Bayer/YUV域部署

这张图我画了很多遍,每次给新同事讲ISP,都是从这张图开始。你注意看数据量的变化——RGB域是带宽压力最大的地方,这也是为什么很多AI降噪算子选择在Bayer域或YUV域做,而不是RGB域。

2.2 Bayer域:原始数据的“清洗车间”

传感器出来的数据叫Bayer RAW。每个像素只记录一种颜色——红、绿或蓝。绿色像素占一半,红蓝各占四分之一,因为人眼对绿色最敏感。

这个阶段处理的数据,说白了就是一堆有缺陷的原始值。我见过不少刚入行的工程师,拿到RAW图直接做去马赛克,结果图像上全是暗角、坏点,后期怎么调都救不回来。

Bayer域核心模块

模块 功能 我踩过的坑
黑电平校正 (BLC) 减去传感器暗电流偏移量 不同增益下黑电平会漂移,固定值校正不够
坏点校正 (DPC) 检测并替换死点/亮点 动态坏点检测阈值设太严,会把正常点误杀
镜头阴影校正 (LSC) 补偿镜头边缘亮度衰减 网格校正点间距太大,边缘出现色斑
去噪 (NR) 降低传感器读出噪声 双边滤波参数设不好,边缘糊成一片
去马赛克 (Demosaic) 从Bayer插值出完整RGB 简单双线性插值在文字边缘全是锯齿

⚠️ 重要提醒:Bayer域的处理顺序不能乱。黑电平校正必须放在最前面,否则后面的坏点检测和去噪都会基于错误的数据做判断。我曾经在一个项目里把LSC放在了BLC前面,结果校正后的图像出现了奇怪的条纹,排查了两天才找到原因。

去马赛克这个模块,我多说两句。它本质上是个插值问题——用周围像素猜当前像素缺失的颜色。最简单的做法是双线性插值,但效果很差。现在主流方案是方向自适应插值,先判断边缘方向,再沿着边缘方向插值。我在手机项目里用过基于梯度导向的插值,文字边缘的锯齿明显少了很多。

2.3 RGB域:色彩的“调色车间”

进入RGB域后,每个像素都有R、G、B三个值了。这时候的图像看起来还是“不对”的——要么偏蓝,要么偏绿,对比度也怪怪的。为什么?因为传感器的光谱响应和人眼不一样,而且不同光源下物体的颜色会变。

RGB域要解决的核心问题就两个:颜色准不准,亮度对不对。

RGB域核心模块

  • 白平衡 (AWB):让白色物体在任何光源下都呈现白色。常见算法有灰度世界法、完美反射法。我个人习惯用色温估计+增益映射的方案,鲁棒性更好。
  • 色彩校正矩阵 (CCM):把传感器RGB转换到标准色彩空间(如sRGB)。这是一个3x3矩阵,系数需要标定。不同色温下CCM不一样,我一般会准备3~5组CCM做插值。
  • Gamma校正:对亮度做非线性映射,适配显示设备的响应曲线。标准Gamma值是2.2。注意:Gamma校正会放大暗部噪声,所以去噪一定要放在Gamma之前。
  • 色调映射 (Tone Mapping):把高动态范围压缩到低动态范围。HDR传感器出来的数据,不做色调映射直接显示,暗部一片黑,亮部一片白。

💡 实战技巧:CCM的系数调试是个细活。我建议先用D65光源(6500K)标定一组基础矩阵,再在A光源(白炽灯)和TL84(荧光灯)下标定偏移量。调试时盯着24色卡看,重点关注肤色和绿色植物的还原度。

2.4 YUV域:图像的“精修车间”

RGB转YUV,本质上是把色彩和亮度分开。Y通道管亮度,U和V管色度。人眼对亮度变化敏感,对色度变化不敏感——这就是YUV域能做很多“手脚”的基础。

YUV域的数据量比RGB小。如果用YUV 4:2:0,色度通道只有亮度的四分之一,数据量直接砍半。这对带宽和存储都是好消息。

YUV域核心模块

模块 功能 注意事项
边缘增强 (Sharpening) 提升图像锐度,让边缘更清晰 过度增强会产生振铃效应,图像看起来“假”
色度降噪 (CNR) 去除色度通道的彩色噪声 只在低频区域做,高频区域保留细节
色彩调整 调节饱和度、色相、对比度 饱和度拉太高,肤色会变成“蜡像”
动态范围压缩 进一步压缩动态范围,适配显示 局部对比度调整容易产生光晕

边缘增强这块,我踩过一个大坑。有一次为了追求锐度,把增强强度调得很高,结果图像边缘出现了明显的白边——这就是振铃效应。后来我改用非锐化掩模 (USM),配合边缘检测做自适应增强,效果好了很多。

关键认知:YUV域的降噪和增强是一对矛盾。降噪会损失细节,增强会放大噪声。好的ISP设计,会在两者之间做动态平衡——平坦区域多降噪,纹理区域多增强。这个平衡点,通常需要根据场景动态调整。

2.5 三大域的协同与AI算子的切入点

讲完三大域,我想聊聊AI算子在ISP流水线里的部署位置。这是这门课的核心话题。

为什么AI算子不能随便放?因为不同域的数据分布差异很大。Bayer域的数据是单通道的,噪声模型相对简单,适合做去噪和超分。RGB域的数据是三通道的,色彩信息完整,适合做色彩增强和HDR重建。YUV域的数据是亮色分离的,适合做边缘增强和画质修复。

我个人的经验是:

  • 去噪类AI算子:优先放在Bayer域。噪声在RAW图上最干净,没有插值和Gamma的干扰,模型更容易学。
  • 超分/去马赛克类:放在Bayer域和RGB域之间。有些方案直接在Bayer上做超分,再去做马赛克,效果比先做马赛克再超分好。
  • 色彩增强/风格迁移类:放在RGB域。色彩信息完整,模型不需要自己“脑补”颜色。
  • 边缘增强/画质修复类:放在YUV域。Y通道做增强,UV通道保持不变,计算量小,效果也够用。

⚠️ 性能考量:AI算子的计算量通常比传统ISP模块大一个数量级。部署时一定要考虑带宽和延迟。我建议在Bayer域和YUV域优先部署AI算子,因为这两个域的数据量小,对硬件更友好。RGB域的数据量是Bayer的3倍,AI算子的计算压力会大很多。

好了,这一章的内容就到这里。三大域的划分和每个模块的功能,是ISP设计的基石。你把这些搞清楚了,后面讲AI算子部署的时候,就能理解为什么有些模块适合用AI替代,有些模块用传统算法反而更好。