4. RAW图数据格式:Bayer Pattern详解、RAW10/RAW12/RAW14格式差异、数据存储与对齐
4.1 Bayer Pattern 详解
Bayer Pattern 是单传感器彩色成像最核心的底层数据组织方式。由于图像传感器每个像素只能感知光的强度(单色),无法直接区分颜色,因此需要在像素表面覆盖一层彩色滤光阵列(CFA),让每个像素只通过红、绿、蓝中的一种分量。Bayer Pattern 是最经典的 CFA 排列方式,由 Bryce Bayer 于 1976 年提出。
标准 Bayer Pattern 的基本单元为 2×2 像素块,包含 1 个红色(R)、2 个绿色(G)、1 个蓝色(B)像素。人眼对绿色最敏感,因此绿色通道采样率是红蓝的两倍。
关键概念: 原始 RAW 数据中每个像素仅包含一种颜色分量,必须通过 去马赛克(Demosaic) 算法插值出全彩色图像。Bayer Pattern 的排列方式直接影响 ISP 流水线中 Demosaic、去噪、锐化等模块的算法设计。
4.2 RAW10 / RAW12 / RAW14 格式差异
RAW 数据的位深度决定了每个像素的量化精度。海思平台常见的 RAW 格式包括 RAW8、RAW10、RAW12、RAW14,其中 RAW10/RAW12/RAW14 是主流。位深度越高,动态范围越大,但数据量也成倍增加。
| 格式 | 每像素位数 | 每像素存储占用 | 典型动态范围 | 海思平台支持 | 典型应用场景 |
|---|---|---|---|---|---|
| RAW8 | 8 bit | 1 字节 | ~48 dB | 是 | 低端摄像头、预览模式 |
| RAW10 | 10 bit | 1.25 字节(packed) | ~60 dB | 是 | 主流安防、车载摄像头 |
| RAW12 | 12 bit | 1.5 字节(packed) | ~72 dB | 是 | 高动态场景、专业监控 |
| RAW14 | 14 bit | 1.75 字节(packed) | ~84 dB | 是(部分型号) | 超高动态、工业/医疗成像 |
实战提示: 海思平台 ISP 内部处理精度通常为 14 bit 或更高。即使 sensor 输出 RAW10,ISP 也会在内部扩展为更高位宽处理,避免精度损失。调试时建议优先使用 sensor 原生最高位宽输出,以获得最佳画质。
4.3 数据存储与对齐
RAW 数据在内存中的存储方式直接影响带宽利用率和 ISP 读取效率。海思平台支持两种主流存储模式:Packed(打包) 和 Unpacked(解包/对齐)。
4.3.1 Packed 模式
Packed 模式将多个像素的位数据连续排列,不留空位,以最小化存储空间。例如 RAW10 的 Packed 格式:每 4 个像素(共 40 bit)打包为 5 字节。
// RAW10 Packed 存储示例(4 像素打包为 5 字节)
// 像素0 [9:0] + 像素1 [9:0] + 像素2 [9:0] + 像素3 [9:0]
// 内存布局:
// Byte0: Pixel0[7:0]
// Byte1: Pixel1[7:0]
// Byte2: Pixel2[7:0]
// Byte3: Pixel3[7:0]
// Byte4: Pixel3[9:8] | Pixel2[9:8] | Pixel1[9:8] | Pixel0[9:8]
// [7:6] [5:4] [3:2] [1:0]
4.3.2 Unpacked 模式
Unpacked 模式每个像素占用固定字节数(如 RAW10 占用 2 字节,高 6 位填充 0),以对齐到字节边界。虽然浪费存储空间,但便于 CPU/DSP 直接访问和 SIMD 优化。
// RAW10 Unpacked 存储示例(每像素 2 字节,高 6 位填充 0)
// 内存布局:
// Byte0: Pixel0[7:0]
// Byte1: 0 | 0 | 0 | 0 | 0 | 0 | Pixel0[9:8]
// [7:6] [5:4] [3:2] [1:0]
4.4 海思平台 RAW 数据对齐要求
海思 ISP 模块对 RAW 数据有严格的对齐约束,不满足对齐条件会导致 ISP 处理异常或性能下降。
- 行对齐(Line Alignment): 每行数据的起始地址必须 16 字节对齐(部分型号要求 32 字节对齐)。
- 宽度对齐(Width Alignment): 图像宽度(像素数)必须为 2 的整数倍(Bayer Pattern 2×2 块要求),部分 ISP 通道要求 4 或 8 对齐。
- Buffer 对齐: 帧 Buffer 的起始物理地址必须 256 字节对齐,以满足 DMA 传输要求。
- Stride(跨度): 每行实际占用的字节数必须向上对齐到 16 字节。例如 RAW10 Packed 模式下,宽度 1920 像素的行实际占用字节数计算如下:
// RAW10 Packed 行跨度计算示例
// 宽度 = 1920 像素
// 每行原始字节数 = 1920 * 10 / 8 = 2400 字节
// 对齐到 16 字节:stride = ((2400 + 15) / 16) * 16 = 2400 → 已对齐
// 若宽度 = 1922 像素
// 每行原始字节数 = 1922 * 10 / 8 = 2402.5 → 向上取整 2403 字节
// 对齐到 16 字节:stride = ((2403 + 15) / 16) * 16 = 2416 字节
常见踩坑点: 调试时如果图像出现条纹、错位或颜色异常,首先检查 RAW 数据的对齐参数是否与 ISP 配置一致。特别是从第三方 sensor 接入时,务必确认 sensor 输出的行跨度(stride)与海思 ISP 期望的 stride 匹配。
4.5 不同 RAW 格式的带宽与存储对比
下表以 1920×1080@60fps 为例,对比不同 RAW 格式的带宽和存储需求,帮助调试时评估系统瓶颈。
| 格式 | 每像素位数 | 每帧大小(Packed) | 带宽需求(60fps) | 相对 RAW8 倍数 |
|---|---|---|---|---|
| RAW8 | 8 bit | ~2.07 MB | ~124 MB/s | 1.0x |
| RAW10 | 10 bit | ~2.59 MB | ~155 MB/s | 1.25x |
| RAW12 | 12 bit | ~3.11 MB | ~186 MB/s | 1.5x |
| RAW14 | 14 bit | ~3.62 MB | ~217 MB/s | 1.75x |
优化建议: 在带宽受限的系统中(如多路拼接或多 sensor 输入),可考虑使用 RAW10 替代 RAW12,配合海思 ISP 的 14 bit 内部处理精度,在画质损失极小的情况下节省 25% 的带宽。对于静态场景,还可启用海思的 RAW 压缩功能(如 Lossless RAW Compression),进一步降低存储和带宽需求。
4.6 本章小结
- Bayer Pattern 是 RAW 数据的基础组织方式,海思平台默认 BGGR,支持通过寄存器切换。
- RAW10/RAW12/RAW14 的位深度决定了动态范围和带宽需求,选择时需平衡画质与系统资源。
- Packed 模式节省空间但访问复杂,Unpacked 模式便于处理但浪费带宽,需根据场景选择。
- 海思平台对 RAW 数据有严格的对齐约束(行对齐、宽度对齐、Buffer 对齐),调试时必须确认。
- 带宽计算是 ISP 系统设计的基础,建议在项目初期就根据 sensor 输出格式评估 DDR 带宽余量。