2. Bayer RAW格式详解
各位做ISP的同行,今天我们来聊聊Bayer RAW。这是图像处理流水线的第一道关卡,也是很多问题的根源。我个人习惯把Bayer RAW比作相机的「原始语言」——它记录了传感器最真实的感光数据,但格式本身并不「好看」,需要后续一系列解码才能变成我们看到的彩色图像。
我在项目中遇到过不少工程师,一上来就调色彩校正,结果发现效果总是不对。查到最后,往往是Bayer RAW的格式理解有偏差,或者黑电平没处理好。所以这一章,我们把基础打扎实。
Bayer模式:四种排列的玄机
Bayer模式的核心思想很简单:每个像素只感测一种颜色(R、G或B),然后通过插值恢复全彩。但具体怎么排列,就有讲究了。
常见的四种模式是:
- RGGB:第一行R、G、R、G...,第二行G、B、G、B...
- GRBG:第一行G、R、G、R...,第二行B、G、B、G...
- BGGR:第一行B、G、B、G...,第二行G、R、G、R...
- GBRG:第一行G、B、G、B...,第二行R、G、R、G...
你可能会问:为什么绿色通道占一半?因为人眼对绿色最敏感,所以传感器给绿色分配了更多的像素。这四种模式本质上只是起始位置不同,但如果你搞错了,去马赛克出来的图像就会偏色或者出现网格伪影。
关键点:高通平台默认使用GRBG模式。但很多第三方sensor模组可能是RGGB。我建议你在初始化时,务必从sensor的datasheet确认Bayer模式,不要想当然。
我曾经接手过一个项目,图像总是偏绿。排查了两天,最后发现是Bayer模式配置反了——sensor输出的是BGGR,但ISP按RGGB处理。嗯,这种低级错误,犯过一次就再也不会忘了。
RAW10 / RAW12 / RAW14:位深度的选择
Bayer RAW的位深度决定了每个像素的量化精度。常见的有:
| 格式 | 位深 | 动态范围 | 数据量(每像素) | 典型场景 |
|---|---|---|---|---|
| RAW10 | 10 bit | 1024级 | 10 bit | 低端手机、摄像头 |
| RAW12 | 12 bit | 4096级 | 12 bit | 主流手机、安防 |
| RAW14 | 14 bit | 16384级 | 14 bit | 高端旗舰、车载 |
说白了,位深越高,暗部细节保留得越好。但代价是数据量增大,处理带宽要求更高。在高通平台上,我一般建议:
- 如果sensor输出RAW10,ISP内部会先扩展到16bit再处理,避免精度丢失。
- RAW12是性价比最高的选择,大多数项目我都用这个。
- RAW14适合HDR场景,但要注意MIPI带宽是否够用。
小技巧:高通平台支持packed和unpacked两种存储格式。packed模式下,RAW10每4个像素占5字节;unpacked则每个像素占2字节(高6位补0)。我个人习惯用unpacked,虽然浪费一点空间,但处理起来简单,不容易出错。
黑电平与线性化预处理
黑电平(Black Level)是传感器在无光照情况下的输出值。理论上应该是0,但实际上由于暗电流、电路噪声等因素,会有个偏移。这个偏移如果不校正,图像会发灰,暗部细节被压缩。
线性化预处理的目标就是:把sensor的非线性响应校正成线性,然后减去黑电平,让数据回到「真实」的起点。
标准流程如下:
- 读取黑电平值:从sensor的寄存器或OTP中获取。通常是每个通道(R、Gr、Gb、B)独立的值。
- 减去黑电平:每个像素值减去对应通道的黑电平。
- 钳位到0:如果减完出现负数,直接钳位到0。
- 线性化:如果sensor有非线性响应(比如某些HDR sensor),需要查表或多项式校正。
注意:黑电平校正必须在去马赛克之前做!否则插值会引入错误。我曾经见过有人先做去马赛克再减黑电平,结果图像边缘出现奇怪的色偏。顺序很重要。
在高通平台上,黑电平校正通常由ISP硬件模块完成。你需要配置的是:
black_level_r、black_level_gr、black_level_gb、black_level_b四个值。- 如果sensor支持动态黑电平(比如随增益变化),需要实时更新。
// 伪代码示例:黑电平校正
uint16_t raw_pixel = get_raw_pixel(x, y);
uint16_t black_level = get_black_level(channel);
int16_t corrected = (int16_t)raw_pixel - (int16_t)black_level;
if (corrected < 0) corrected = 0;
// 输出校正后的像素值
output_pixel = (uint16_t)corrected;
嗯,这里要注意:黑电平值通常不是整数,可能是带小数的。比如某个sensor的黑电平是64.5,那你就得用定点数或者浮点数处理。我习惯用Q8.8格式,精度够用,计算也快。
知识体系总览
下面这张图总结了本章的核心逻辑:
从图中可以看出,Bayer模式、位深度和预处理是三个独立但又相互关联的维度。你选定了sensor,就得同时搞定这三件事,才能进入后续的去马赛克和色彩校正。
总结一下本章的核心要点:
- Bayer模式有四种,高通平台默认GRBG,但务必以sensor datasheet为准。
- RAW10/12/14的选择取决于动态范围需求和带宽限制,RAW12是主流。
- 黑电平校正是预处理的第一步,必须在去马赛克之前完成。
- 线性化处理针对非线性sensor,通常用查表法实现。