2. 像素数据格式详解

像素数据格式,说白了就是数字图像在硬件通路里怎么“说话”的。我做了十几年图像传感器接口设计,见过太多因为格式选错导致整个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图展示了四种格式在像素处理通路中的位置关系:

像素数据格式在ISP通路中的位置 图像传感器 RAW/Bayer ISP处理 RGB YUV 显示/编码 传感器原始输出 去马赛克/白平衡 最终输出格式

选择哪种格式,取决于你的应用场景:

  • 追求画质、需要后期处理:用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数据就行。