图像传感器基础与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,拍快速运动的物体不会出现「果冻效应」。

避坑指南: 我曾经在一个车载项目里用了卷帘快门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顺序搞反了。

关键点: Bayer Pattern的起始像素(第0行第0列)决定了整个Pipeline的解码方式。Sensor datasheet里一定会标明,千万别想当然。
Bayer Pattern 四种常见排布 RGGB R G G B GRBG G R B G GBRG G B R G BGGR B G G R Bayer Pattern 关键特征 • 绿色像素占50%,红色和蓝色各占25% • 起始像素(0,0)决定了整个Pattern类型 • 不同传感器厂商默认Pattern不同:Sony常用RGGB,OmniVision常用BGGR • 调试时用均匀灰卡验证:R=G=B说明Pattern正确 • 错误Pattern会导致颜色完全错乱,且无法通过白平衡校正

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图不是BMP、JPEG那种可以直接显示的格式。你用图片查看器打开RAW文件,看到的只是传感器数据的一种「可视化映射」,不代表真实数据。调试时一定要用工具(如dcraw、libraw)读取原始数据。

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(需要减去黑电平)
调试技巧: 我每次拿到新传感器,第一件事就是测黑电平。方法很简单:盖上镜头盖,拍一张全黑图,然后统计所有像素的均值。如果均值是64,那黑电平就是64。注意——不同增益下黑电平可能会漂移,高增益时尤其明显。

黑电平校正(Black Level Correction,BLC)是ISP Pipeline的第一步。不校正的话,暗部会偏色,因为R、G、B三个通道的黑电平可能不一样。我遇到过一台相机,暗部偏绿,查了半天发现是BLC没做,G通道的黑电平比R和B高了4个LSB。

饱和电平决定了传感器的满阱容量(Full Well Capacity)。满阱越大,动态范围越宽。但大像素意味着分辨率做不高,这是个取舍。做安防相机时,我倾向于用大像素、高满阱的传感器,因为监控场景经常需要同时看清亮部和暗部。

RAW数据有效范围示意(10-bit) 0 ~ 1023(总范围) 黑电平 0~64 有效信号范围 64~1023(共959级) 黑电平以下无有效信息,饱和电平以上信息丢失(过曝)

嗯,到这里传感器基础和RAW格式的核心概念就讲完了。记住:Bayer Pattern决定了颜色解码的正确性,位深决定了动态范围,黑电平和饱和电平决定了信号的有效区间。这些是ISP Pipeline的基石,后面所有算法都建立在它们之上。