3. RAW图数据格式:Bayer阵列模式、位深、黑电平与暗电流、坏点校正基础

各位同学,今天我们来聊聊RAW图数据格式。这是ISP流水线的第一道关卡,也是决定图像质量上限的关键。我个人习惯把RAW图比作相机的「原始底片」——它记录的是传感器最真实的感光数据,还没经过任何美化处理。你想想看,如果底片本身就有问题,后面再怎么调也是白搭。

3.1 Bayer阵列模式:传感器的「马赛克」世界

先说Bayer阵列。为什么传感器要用这种模式?说白了,单个像素只能感知光的强度,分不清颜色。那怎么办?工程师们想了个办法:在每个像素上覆盖一层滤光片,只让特定颜色的光通过。最常见的Bayer阵列是RGGB,也就是一个像素滤红光,一个滤蓝光,两个滤绿光。

为什么绿色要占两个?因为人眼对绿色最敏感。这个设计很巧妙,我在项目中遇到过有人想改成RCCC(全红+全清),结果拍出来的画面偏色严重,后来才发现是没理解人眼视觉特性。

常见Bayer阵列模式对比:

模式 排列方式 典型应用 特点
RGGB 红绿绿蓝 车载主摄、手机 色彩还原好,绿色细节丰富
RCCC 红清清清 ADAS前视摄像头 亮度高,适合低光环境
RCCB 红清清蓝 环视摄像头 兼顾亮度和色彩

嗯,这里要注意:RCCC和RCCB在车载领域越来越常见。为什么?因为自动驾驶需要更亮的图像来检测障碍物。我曾经调试过一个RCCC的摄像头,晚上在高速上跑,效果确实比RGGB好很多,但代价是色彩精度下降。所以选哪种模式,得看具体场景。

3.2 RAW10/RAW12/RAW16:位深决定动态范围

位深这个概念,说白了就是每个像素用多少比特来表示。RAW10就是10比特,RAW12是12比特,以此类推。位深越大,能表示的灰度等级就越多,动态范围也就越大。

举个例子:RAW10能表示0-1023的灰度值,RAW12能表示0-4095,RAW16能表示0-65535。你想想看,如果场景里有很亮和很暗的部分,RAW10可能就丢失细节了,而RAW16还能保留。

我个人建议:车载摄像头至少用RAW12。为什么?因为车载场景的动态范围太大了——隧道入口、逆光、夜间车灯,这些场景RAW10根本扛不住。我见过一个项目,用了RAW10的传感器,结果在隧道口死活调不好,后来换成RAW12才解决。

但位深也不是越大越好。RAW16的数据量是RAW10的1.6倍,对带宽和存储都是压力。所以实际项目中,RAW12是主流,RAW10用于低成本方案,RAW16用于高端ADAS。

3.3 黑电平与暗电流:传感器的「底噪」

黑电平是什么?简单说,就是传感器在完全无光的情况下,输出的像素值。理论上应该是0,但实际上不是。因为传感器有暗电流——即使没有光,电子也会热激发产生电荷。这个底噪如果不处理,图像就会发灰、发雾。

我记得有一次调试一个车载摄像头,晚上拍出来的画面总是灰蒙蒙的。一开始以为是镜头脏了,后来一查,是黑电平没校准好。暗电流随温度变化,夏天和冬天差很多。所以车载摄像头必须做黑电平校正,而且得实时做。

避坑指南:我曾经遇到过一个项目,黑电平校正只做了静态校准,结果夏天高温时图像全偏了。后来改成动态黑电平校正——每帧图像都从光学黑区(OB区)读取参考值,实时减去。这才彻底解决问题。

黑电平校正的公式很简单:校正后像素值 = 原始像素值 - 黑电平值。但要注意,黑电平值不是固定的,它和温度、增益都有关系。所以实际代码里,你得查表或者用多项式拟合。

// 伪代码示例:动态黑电平校正
uint16_t black_level = read_ob_region();  // 从OB区读取黑电平
for (int i = 0; i < frame_size; i++) {
    pixel[i] = (pixel[i] > black_level) ? (pixel[i] - black_level) : 0;
}

3.4 坏点校正(DPC):修复传感器的「死像素」

坏点,就是传感器上那些永远亮或永远暗的像素。原因很多:制造缺陷、灰尘、老化。坏点如果不处理,图像上就会出现固定的亮点或暗点,非常影响视觉。

坏点校正分两步:检测和替换。检测方法有很多,我常用的方法是「邻域比较法」——如果一个像素的值和周围8个像素的平均值差太多,就判定为坏点。替换方法更简单,直接用周围像素的中值或平均值代替。

坏点校正流程:

输入RAW图 坏点检测 坏点替换 输出校正图 是坏点? 保留原值

实际项目中,坏点校正不能只做一次。因为坏点会随着时间和温度变化。我建议在ISP流水线里,把DPC放在黑电平校正之后、去噪之前。为什么?因为黑电平校正后,数据才真正反映光照强度,这时候检测坏点最准确。

经验之谈:车载摄像头的坏点校正,一定要做「动态DPC」。什么意思?就是每帧都检测坏点,而不是用出厂时烧录的坏点表。因为车载环境温度变化大,振动也大,坏点会动态出现。我曾经在路测时发现,一个摄像头在冷启动时有3个坏点,跑热了变成5个,后来又变成2个。如果不做动态检测,这些坏点就会一直留在图像里。

好了,关于RAW图数据格式的基础知识就讲到这里。记住:Bayer阵列决定了色彩采样方式,位深决定了动态范围,黑电平校正去除了底噪,坏点校正修复了传感器缺陷。这四个环节环环相扣,任何一个出问题,后面的ISP处理都会受影响。

专注资料整理