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的非线性响应校正成线性,然后减去黑电平,让数据回到「真实」的起点。

标准流程如下:

  1. 读取黑电平值:从sensor的寄存器或OTP中获取。通常是每个通道(R、Gr、Gb、B)独立的值。
  2. 减去黑电平:每个像素值减去对应通道的黑电平。
  3. 钳位到0:如果减完出现负数,直接钳位到0。
  4. 线性化:如果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 RAW知识体系 Bayer RAW格式与预处理知识体系 Bayer模式 RGGB GRBG BGGR GBRG 位深度 RAW10 (10bit) RAW12 (12bit) RAW14 (14bit) 预处理 黑电平校正 线性化处理 注意 顺序:先校正,后插值

从图中可以看出,Bayer模式、位深度和预处理是三个独立但又相互关联的维度。你选定了sensor,就得同时搞定这三件事,才能进入后续的去马赛克和色彩校正。

总结一下本章的核心要点:

  • Bayer模式有四种,高通平台默认GRBG,但务必以sensor datasheet为准。
  • RAW10/12/14的选择取决于动态范围需求和带宽限制,RAW12是主流。
  • 黑电平校正是预处理的第一步,必须在去马赛克之前完成。
  • 线性化处理针对非线性sensor,通常用查表法实现。