图像传感器基础与RAW图格式
做ISP Pipeline,第一关就是搞懂传感器。说白了,传感器就是相机的「视网膜」。光信号怎么变成电信号,电信号又怎么变成RAW数据——这些基础不牢,后面调3A算法会处处碰壁。我刚开始接触ISP时,就吃过不懂Bayer Pattern的亏,调出来的颜色怎么都不对,后来才发现是Bayer排布搞反了。
CMOS vs CCD:两种主流传感器
目前市面上99%的消费级相机都用CMOS。CCD基本只活在工业、科研等特殊领域。为什么?
| 特性 | CMOS | CCD |
|---|---|---|
| 读出方式 | 每个像素独立放大、ADC转换 | 整行/整列电荷转移,统一ADC |
| 功耗 | 低(几mW~几十mW) | 高(几百mW~几W) |
| 噪声 | 固定模式噪声(FPN)较明显 | 读出噪声低,均匀性好 |
| 速度 | 快(支持高帧率、全局快门) | 慢(帧率受限) |
| 成本 | 低(标准半导体工艺) | 高(专用工艺) |
| 应用 | 手机、安防、车载、消费电子 | 天文、医疗、高端工业检测 |
CMOS每个像素旁边都集成了放大器和读出电路,所以填充因子(感光面积占比)比CCD低。但好处是——可以做成卷帘快门或全局快门,灵活性高。我个人习惯在安防项目里优先选全局快门CMOS,拍快速运动的物体不会出现「果冻效应」。
Bayer Pattern详解
传感器只能感知光的强度,分不清颜色。那彩色图像怎么来的?答案是——在像素表面覆盖彩色滤光片阵列(CFA)。最经典的就是Bayer Pattern。
Bayer Pattern的基本思想:人眼对绿色最敏感,所以绿色像素占一半,红色和蓝色各占四分之一。常见的排布有四种:
- RGGB:第一行 R G R G...,第二行 G B G B...
- GRBG:第一行 G R G R...,第二行 B G B G...
- GBRG:第一行 G B G B...,第二行 R G R G...
- BGGR:第一行 B G B G...,第二行 G R G R...
你想想看,如果ISP里配置的Bayer顺序和传感器实际输出不一致,那解出来的颜色就会完全错乱。红色变成蓝色,绿色变成紫色。我调试时习惯先拍一张均匀灰卡,然后检查每个通道的均值——如果R和B通道均值差异很大,大概率是Bayer顺序搞反了。
RAW图的数据格式与位深
传感器输出的原始数据就是RAW图。它没经过任何处理——没有去马赛克、没有白平衡、没有Gamma校正。每个像素只记录一个通道的亮度值。
RAW图的位深决定了动态范围。常见的有:
- 8-bit:0~255,早期手机传感器用,动态范围窄
- 10-bit:0~1023,目前主流手机传感器
- 12-bit:0~4095,高端手机、相机、安防
- 14-bit/16-bit:0~16383/0~65535,专业相机、工业相机
位深每增加1-bit,动态范围增加约6dB。12-bit比10-bit多了12dB的动态范围。我建议做HDR场景时,至少用12-bit的RAW,否则高光区域很容易饱和,暗部又全是噪声。
RAW数据在内存中的存储方式也有讲究。最常见的是packed格式和unpacked格式:
| 格式 | 描述 | 举例(10-bit) |
|---|---|---|
| Unpacked | 每个像素占用2字节(16-bit),高位对齐或低位对齐 | 0x03FF 表示最大值1023 |
| Packed | 多个像素紧凑排列,不浪费bit | 4个10-bit像素占5字节 |
| MIPI RAW | MIPI CSI-2接口传输的RAW格式,有特定打包规则 | RAW10、RAW12等 |
我个人习惯在调试阶段用unpacked格式,方便用十六进制编辑器直接查看像素值。量产时再切到packed,节省带宽和存储。
黑电平与饱和电平
这两个概念是RAW数据校正的基础。搞不懂它们,你调出来的图像要么偏暗,要么高光一片死白。
黑电平(Black Level):传感器在完全无光(盖上镜头盖)时,理论上输出应该是0。但实际电路有暗电流和偏置,所以输出不为0。这个非零值就是黑电平。通常是一个固定的数字,比如10-bit RAW的黑电平可能是64。
饱和电平(Saturation Level):像素能容纳的最大电荷量。当入射光强到一定程度,像素饱和,输出达到最大值。10-bit RAW的饱和电平就是1023。
有效信号范围 = 饱和电平 - 黑电平。举个例子:
RAW10 格式:
黑电平 = 64
饱和电平 = 1023
有效范围 = 1023 - 64 = 959
实际信号值 = RAW值 - 64(需要减去黑电平)
黑电平校正(Black Level Correction,BLC)是ISP Pipeline的第一步。不校正的话,暗部会偏色,因为R、G、B三个通道的黑电平可能不一样。我遇到过一台相机,暗部偏绿,查了半天发现是BLC没做,G通道的黑电平比R和B高了4个LSB。
饱和电平决定了传感器的满阱容量(Full Well Capacity)。满阱越大,动态范围越宽。但大像素意味着分辨率做不高,这是个取舍。做安防相机时,我倾向于用大像素、高满阱的传感器,因为监控场景经常需要同时看清亮部和暗部。
嗯,到这里传感器基础和RAW格式的核心概念就讲完了。记住:Bayer Pattern决定了颜色解码的正确性,位深决定了动态范围,黑电平和饱和电平决定了信号的有效区间。这些是ISP Pipeline的基石,后面所有算法都建立在它们之上。