第二章 图像传感器与RAW图:传感器工作原理、Bayer阵列格式、RAW图数据格式解析

做ISP调优,第一件事不是调参数,而是搞懂你手里那张RAW图到底是怎么来的。我见过太多工程师拿着RAW图就开始调颜色,结果发现偏色是因为传感器Bayer排布搞反了——这种坑,踩一次就够了。

这一章,咱们把图像传感器的底裤扒干净。从光子怎么变成电子,再到RAW图里每个像素存的是什么,一步步拆开看。

2.1 图像传感器工作原理

说白了,传感器就是个光子计数器。每个像素点就是一个微型光电二极管,光子打上去产生电子,电子数量转换成电压,再经过ADC变成数字值。这个过程叫光电转换。

目前主流传感器就两种:CCD和CMOS。我个人的经验是,工业机器视觉领域现在基本是CMOS的天下,原因很简单——速度快、功耗低、成本也下来了。

特性 CCD CMOS
读出方式 逐行转移,统一输出 每个像素独立寻址
速度 较慢(<30fps常见) 快(>100fps轻松)
噪声 低,一致性高 较高,有固定模式噪声
功耗 高(需要多路电压) 低(单电压供电)
机器视觉适用性 高精度静态场景 高速、动态场景
我的经验:选传感器时别只看分辨率。帧率、动态范围、量子效率这三个参数,比像素数重要得多。我曾经在一个产线检测项目里,客户非要2000万像素,结果帧率只有15fps,产品一跑快就糊——最后换了500万像素、60fps的CMOS,问题全解决。

2.2 Bayer阵列格式

单颗像素只能感知亮度,分不清颜色。那彩色图像怎么来的?答案是:在像素表面镀一层彩色滤光片(CFA),让每个像素只响应特定波长的光。

最经典的排列就是Bayer阵列。它用2x2的单元重复排列:一个红色(R)、两个绿色(G)、一个蓝色(B)。为什么绿色多一个?因为人眼对绿色最敏感,这么做能模拟人眼的亮度感知。

Bayer阵列 2x2 单元结构 R G G B … … … … 每个2x2单元包含:1个R + 2个G + 1个B,绿色通道采样率是红蓝的两倍

常见的Bayer排列有四种变体:RGGB、BGGR、GRBG、GBRG。区别只是R和B的位置不同。你想想看,如果ISP代码里默认是RGGB,但传感器输出的是BGGR,那解出来的颜色就全乱了。

注意:拿到新传感器时,第一件事就是确认Bayer排布。我曾经接手一个项目,前任调了两个月颜色都不对,最后发现是Bayer排布配置错了——改一行代码,颜色立马正常。这种低级错误,千万别犯。

2.3 RAW图数据格式解析

RAW图就是传感器直接输出的原始数据,没经过任何处理。每个像素存的就是那个像素的电压值经过ADC量化后的数字。注意,它还不是彩色图像——每个像素只有一种颜色分量。

RAW图的位深常见的有8bit、10bit、12bit、14bit。机器视觉领域,10bit和12bit最常用。位深决定了动态范围:每多1bit,动态范围多6dB。

位深 灰度级数 动态范围 常见场景
8bit 256 48dB 消费级摄像头
10bit 1024 60dB 工业相机、手机
12bit 4096 72dB 高端工业、医疗
14bit 16384 84dB 科学级、天文

RAW图在内存里的存储格式,我习惯用下面这个结构来理解:

// 假设一张 4x4 的 RAW 图,Bayer 排布为 RGGB
// 每个像素 12bit,用 2 字节存储(低 12 位有效)

内存布局(按行连续存储):
Row 0: [R0] [G0] [R1] [G1]
Row 1: [G2] [B0] [G3] [B1]
Row 2: [R2] [G4] [R3] [G5]
Row 3: [G6] [B2] [G7] [B3]

// 每个 [ ] 代表 2 字节(16bit),实际有效数据只有低 12bit
// 高 4bit 通常补 0,或者用于存储元数据
核心要点:RAW图不是图像,是数据。它需要经过ISP管线中的去马赛克(Demosaic)才能变成RGB彩色图像。调优时,我习惯先看RAW图的直方图——如果直方图贴边或者中间有空隙,说明曝光或者增益有问题,这时候调后面的颜色和锐化都是白费功夫。

2.4 RAW图的关键元数据

一张RAW图光有像素数据是不够的,还得带上元数据,ISP才能正确解析。我列一下必须有的几个字段:

  • 图像尺寸:宽 x 高,单位像素
  • 位深:每个像素多少bit
  • Bayer排布:RGGB/BGGR/GRBG/GBRG
  • 黑电平:传感器在无光时的输出值,通常不为0
  • 增益值:模拟增益和数字增益的倍数
  • 曝光时间:积分时间,单位微秒或行数

这些元数据通常存在RAW文件的头部,或者通过传感器驱动接口单独传递。我遇到过最坑的一次,是某个传感器厂商把黑电平值写在了数据手册里,但实际芯片批次不同黑电平差了20个DN——从那以后,我每次换批次都会重新标定黑电平。

2.5 从RAW到ISP管线的第一步

拿到RAW图后,ISP管线做的第一件事不是去马赛克,而是预处理:

  1. 黑电平校正:减去黑电平值,让暗部归零
  2. 坏点校正:检测并替换死点/亮点
  3. 增益归一化:把不同增益下的数据统一到同一尺度

这三步做完,RAW图才算是“干净”的数据,可以进入后面的去马赛克、白平衡、颜色校正等模块。我个人习惯在预处理阶段就把直方图拉平,这样后面调参时能少很多麻烦。

小技巧:调试时可以用Python + numpy直接读取RAW图,画个伪彩色图看看有没有坏点或者条纹。我常用的命令是 np.fromfile('raw.raw', dtype=np.uint16).reshape(height, width),几秒钟就能定位问题。

嗯,这一章的内容就到这里。传感器怎么工作、Bayer阵列怎么排、RAW图里存的是什么——这些是ISP调优的地基。地基没打牢,上面盖的房子再漂亮也得塌。