1. RAW数据基础:从传感器到数字图像的起点

做嵌入式图像这些年,我接触最多的就是RAW数据。说白了,RAW就是图像传感器最原始的“底片”。它没经过任何加工,每个像素点只记录一个颜色通道的亮度值。你想想看,这就像画家刚铺完底色的画布——信息最全,但还不是成品。

1.1 什么是RAW数据

图像传感器(比如RK平台常用的索尼IMX系列、OV系列)的每个像素点,本质上就是一个光电转换器。光子打进来,转换成电荷,再通过ADC(模数转换器)变成数字量。这个数字量,就是RAW数据。

核心特征:

  • 每个像素只记录一种颜色(R/G/B之一)
  • 位深通常为10bit、12bit或14bit
  • 数据未经任何ISP处理
  • 存储的是线性光强信息

我记得刚入行时,有个同事把RAW直接当RGB显示,结果图像全是马赛克。嗯,这就是没搞懂RAW的本质——它根本不是完整的彩色图像。

1.2 RAW与RGB/YUV的区别

这三者的关系,我习惯用一个比喻来解释:

类型 数据量 颜色信息 处理阶段 典型用途
RAW 最小(1像素1通道) 不完整(Bayer模式) 传感器输出 ISP输入、后期调色
RGB 中等(1像素3通道) 完整 Demosaic之后 显示、编辑
YUV 中等(亮度+色度) 压缩色度 编码之前 视频压缩、传输

为什么会有这种差异?说白了,传感器物理结构决定了它只能每个像素感光一种颜色。要得到RGB,必须通过插值算法“猜”出缺失的颜色。而YUV则是为了压缩视频而生的色彩空间,把亮度信息单独拎出来。

避坑指南:我曾经在调试RK3588的ISP时,发现预览画面偏绿。查了半天,原来是上层把RAW数据当RGB直接送显了。记住:RAW必须经过Demosaic才能变成RGB,否则就是一片Bayer马赛克。

1.3 Bayer阵列详解

Bayer阵列是RAW数据最核心的格式。它由Bryce Bayer在1976年发明,至今仍是主流。为什么绿色像素占一半?因为人眼对绿色最敏感,这样设计能获得更好的视觉分辨率。

标准Bayer模式

最常见的Bayer排列是RGGB:

R G R G R G
G B G B G B
R G R G R G
G B G B G B

也有BGGR、GBRG、GRBG等变体。RK平台的Sensor配置里,一般会通过sensor_mode或hflip/vflip来调整Bayer顺序。

Bayer格式的变种

格式名称 排列模式 常见应用
RGGB 第一行RGRG,第二行GBGB 索尼IMX系列
BGGR 第一行BGBG,第二行GRGR OV系列
GBRG 第一行GBGB,第二行RGRG 部分安森美传感器
GRBG 第一行GRGR,第二行BGBG 三星部分型号

注意:Bayer顺序搞错,图像会整体偏色。我在RK3399项目上就踩过这个坑——Sensor手册写的是RGGB,实际输出是BGGR。最后用示波器抓MIPI数据才确认。所以,拿到新Sensor一定要先验证Bayer顺序。

1.4 RAW数据的存储与位深

RAW数据在内存中的存储方式,直接影响ISP的处理效率。RK平台的ISP通常支持以下格式:

  • RAW8:每个像素8bit,常用于低端Sensor或预览模式
  • RAW10:每个像素10bit,10位ADC的Sensor标准输出
  • RAW12:每个像素12bit,中高端Sensor常用
  • RAW14:每个像素14bit,专业级Sensor
  • RAW16:每个像素16bit,一般由FPGA或CPU扩展位深

存储方式上,常见的有两种:

  1. Packed模式:像素连续排列,没有空隙。比如RAW10的4个像素占5个字节。
  2. Unpacked模式:每个像素对齐到字节边界。比如RAW10每个像素占2字节(高6位无效)。

经验之谈:RK平台的ISP硬件通常要求输入数据是Packed格式,但DMA传输时可能自动转换。我建议你在驱动层就确认好格式,否则ISP的BLC(黑电平校正)和LSC(镜头阴影校正)都会算错。

1.5 知识体系总览

下面这张图,是我梳理的RAW数据知识结构。你可以把它当作本章的“地图”:

RAW数据知识体系 RAW数据 定义与特征 传感器原始输出 与RGB/YUV对比 1像素1通道 vs 3通道 Bayer阵列 RGGB/BGGR等模式 存储格式 RAW8/10/12/14/16 位深与动态范围 10bit≈60dB动态 关键理解: • RAW是ISP Pipeline的起点,所有图像质量优化都基于RAW数据 • Bayer阵列决定了Demosaic算法的复杂度,也影响最终分辨率 • 位深越高,动态范围越大,但数据量和处理开销也越大

1.6 实战:如何验证RAW数据是否正确

拿到一块新Sensor模组,我通常会做这几步验证:

  1. 抓一帧RAW数据:通过RK的RKCIF驱动,把Sensor输出直接dump到内存
  2. 检查Bayer顺序:用Python或MATLAB把RAW数据按不同Bayer模式显示,看哪个颜色正常
  3. 确认位深:统计像素值的最大值,看是否接近2^N-1(N为位深)
  4. 检查坏点:在全黑和全白场景下,找出异常像素

小技巧:我习惯在RK平台上用echo 1 > /sys/class/video4linux/videoX/raw_dump来触发RAW dump。然后通过adb pull到PC端分析。这样比用示波器抓MIPI信号快多了。