像素数据格式详解:RAW、RGB、YUV、Bayer格式的数学表示与存储结构
像素数据格式,说白了就是数字图像在硬件通路里怎么“说话”的。我做了十几年图像传感器接口设计,见过太多因为格式选错导致整个pipeline重做的案例。今天咱们就把RAW、RGB、YUV、Bayer这四种最基础的格式彻底讲透。
一、Bayer格式:传感器最原始的“方言”
大部分CMOS图像传感器输出的原始数据就是Bayer格式。为什么?因为一个像素点只能感光一种颜色——要么红、要么绿、要么蓝。传感器表面覆盖了一层彩色滤光片阵列(CFA),最常见的排列就是RGGB。
关键认知:Bayer格式不是最终显示用的格式,它是“半成品”。每个像素只记录一种颜色分量,另外两种颜色需要通过插值算法算出来。
数学上,一个Bayer图像可以表示为:
// 以RGGB排列为例,每个位置只存一个通道值
Pixel(x, y) =
if (x为偶数, y为偶数) → R(x, y)
if (x为奇数, y为偶数) → G(x, y)
if (x为偶数, y为奇数) → G(x, y)
if (x为奇数, y为奇数) → B(x, y)
存储结构上,Bayer格式就是一张单通道灰度图。每个像素8bit或10bit,按行顺序排列。我遇到过不少新手以为Bayer是彩色图,直接当RGB去显示,结果画面全是马赛克——嗯,这个坑我当年也踩过。
硬件设计提示:Bayer格式的存储带宽需求是RGB格式的1/3。在DDR带宽受限的嵌入式系统里,尽量在Bayer域做完大部分预处理(黑电平校正、去噪、LSC),再转RGB。
二、RAW格式:传感器原始数据的“集装箱”
RAW格式其实不是一种具体的像素排列,而是一个“容器”。它包含了传感器输出的全部原始信息:Bayer数据、增益值、曝光时间、白平衡参数等元数据。
数学表示上,RAW数据就是传感器ADC输出的数字码值:
RAW_value = (V_photo - V_black) × Gain + V_offset
其中:
V_photo = 光电转换后的模拟电压
V_black = 黑电平参考电压
Gain = 模拟/数字增益
V_offset = 偏移量(通常为0)
存储结构上,常见的RAW格式有:
| RAW类型 | 位深 | 每像素存储 | 典型应用 |
|---|---|---|---|
| RAW8 | 8bit | 1字节 | 低端摄像头、预览模式 |
| RAW10 | 10bit | 5字节/4像素(packed) | 手机主摄、安防 |
| RAW12 | 12bit | 3字节/2像素(packed) | 工业相机、医疗影像 |
| RAW16 | 16bit | 2字节 | 专业摄影、科学成像 |
避坑指南:我曾经在一个项目里直接用RAW10的packed格式做DMA传输,结果没注意字节对齐,导致数据错位。建议在硬件设计时,优先使用unpacked格式(每个像素对齐到2字节),虽然浪费一点带宽,但能避免很多调试噩梦。
三、RGB格式:最直观的彩色表示
RGB格式每个像素用三个分量表示颜色。数学上很简单:
Pixel(x, y) = (R(x, y), G(x, y), B(x, y))
每个分量通常为8bit,取值范围[0, 255]
存储结构上,RGB有几种常见排列:
- RGB888:每个像素3字节,按R-G-B顺序连续存储。带宽需求大,但处理最简单。
- RGB565:每个像素2字节,R占5bit,G占6bit,B占5bit。我常用在低成本LCD驱动上,人眼对绿色更敏感,所以绿色多给1bit。
- RGB8888(ARGB):每个像素4字节,多一个Alpha通道用于透明度。GPU和显示接口用得最多。
硬件设计要点:在像素处理通路里,RGB格式的并行度最高。你可以同时处理R、G、B三个通道,用三个相同的处理单元做并行流水线。代价是逻辑资源翻三倍。
四、YUV格式:把亮度和颜色分开
YUV格式的核心思想是人眼对亮度(Y)敏感,对色度(U/V)不敏感。所以可以给Y多分配一些带宽,给U/V少一些。数学转换关系如下:
Y = 0.299 × R + 0.587 × G + 0.114 × B
U = -0.147 × R - 0.289 × G + 0.436 × B + 128
V = 0.615 × R - 0.515 × G - 0.100 × B + 128
存储结构上,YUV有多种采样格式:
| 采样格式 | Y分辨率 | U/V分辨率 | 带宽节省 | 典型场景 |
|---|---|---|---|---|
| YUV444 | 全分辨率 | 全分辨率 | 0% | 专业视频编辑 |
| YUV422 | 全分辨率 | 水平1/2 | 33% | 广播级视频 |
| YUV420 | 全分辨率 | 水平1/2, 垂直1/2 | 50% | 视频压缩、直播 |
个人经验:做视频编码硬件时,YUV420是的主流。我建议在ISP输出端直接做YUV420的下采样,这样后续的H.264/H.265编码器可以直接吃数据,省掉一次格式转换的延迟和带宽。
五、四种格式的对比与选择
下面这张SVG图展示了四种格式在像素处理通路中的位置关系:
选择哪种格式,取决于你的应用场景:
- 追求画质、需要后期处理:用RAW。我做的专业相机项目,全程在RAW域做处理,最后才转RGB输出。
- 显示驱动、GPU渲染:用RGB。LCD和HDMI接口原生支持RGB,省去格式转换。
- 视频编码、网络传输:用YUV。H.264/H.265内部就是YUV420,直接对接效率最高。
- 传感器直接输出:用Bayer。在ISP前端,Bayer格式是默认的“通用语言”。
重要提醒:格式转换不是无损的。从Bayer插值到RGB会损失空间分辨率,从RGB转YUV420会损失色度分辨率。我见过一个项目反复做RGB→YUV→RGB的来回转换,最后图像质量惨不忍睹。设计pipeline时,尽量减少格式转换次数。
六、存储结构对比总结
| 格式 | 每像素位数 | 通道数 | 存储效率 | 硬件处理复杂度 |
|---|---|---|---|---|
| Bayer RAW8 | 8 | 1(单通道) | 高 | 低(需后续插值) |
| RGB888 | 24 | 3 | 低 | 中 |
| RGB565 | 16 | 3 | 中 | 低 |
| YUV420 | 12 | 3(Y+UV) | 高 | 高(需色度重采样) |
嗯,这四种格式是像素处理通路的“地基”。我个人建议,刚开始做硬件设计时,先把Bayer和RGB吃透。YUV的色度采样逻辑稍微绕一点,但理解了之后会发现它其实很优雅。至于RAW,记住它是个“集装箱”,里面装的还是Bayer数据就行。