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扩展位深
存储方式上,常见的有两种:
- Packed模式:像素连续排列,没有空隙。比如RAW10的4个像素占5个字节。
- Unpacked模式:每个像素对齐到字节边界。比如RAW10每个像素占2字节(高6位无效)。
经验之谈:RK平台的ISP硬件通常要求输入数据是Packed格式,但DMA传输时可能自动转换。我建议你在驱动层就确认好格式,否则ISP的BLC(黑电平校正)和LSC(镜头阴影校正)都会算错。
1.5 知识体系总览
下面这张图,是我梳理的RAW数据知识结构。你可以把它当作本章的“地图”:
1.6 实战:如何验证RAW数据是否正确
拿到一块新Sensor模组,我通常会做这几步验证:
- 抓一帧RAW数据:通过RK的RKCIF驱动,把Sensor输出直接dump到内存
- 检查Bayer顺序:用Python或MATLAB把RAW数据按不同Bayer模式显示,看哪个颜色正常
- 确认位深:统计像素值的最大值,看是否接近2^N-1(N为位深)
- 检查坏点:在全黑和全白场景下,找出异常像素
小技巧:我习惯在RK平台上用echo 1 > /sys/class/video4linux/videoX/raw_dump来触发RAW dump。然后通过adb pull到PC端分析。这样比用示波器抓MIPI信号快多了。