一、核心前提:CMOS 感光像素只能感知亮度,无法区分色彩
CMOS 感光二极管(光电二极管)只感知光子数量(亮度),天生不能分辨红 / 绿 / 蓝。感光元件输出信号只有:电压值 = 入射光强弱,没有颜色信息。
想要彩色图像,解决方案:在像素前加装彩色滤光片(Color Filter Array,CFA)。
行业通用方案:拜耳阵列 Bayer Pattern。
二、拜耳阵列排列规则(最主流 RGGB)
标准RGGB拜耳单元(2×2最小重复单元)
plaintext
R G G B放大成片排列:
plaintext
R G R G R G G B G B G B R G R G R G G B G B G B比例特点
- 绿色 G 像素数量是 R、B 的 2 倍人眼对绿光亮度最敏感,增加绿色采样,提升亮度信噪比。
- 四种常用拜耳排布(硬件必须匹配,错了画面严重偏色)
- RGGB:最通用(OV5647、IMX219、IMX335)
- BGGR、GRBG、GBRG
⚠️ 如果你在 ISP 配置写错阵列类型,RAW 解码出来图像颜色完全错乱。
三、相机信号完整链路(从光子到 RAW 帧)
- 光线 → 镜头 →彩色滤光片→CMOS 光电二极管
- 每个像素只透过一种颜色光:只能采集 R / G / B 其中一个分量
- CMOS 电路将光信号转为模拟电压 → ADC 模数转换
- 输出数字信号:RAW 拜耳数据(Bayer RAW)✅ 重点:每个像素仅有单一通道数值,缺少另外两个颜色分量!例:R 像素只有红色亮度,没有绿色、蓝色数据。
这就是为什么 RAW 文件不是彩色图像,不能直接预览,必须插值。
四、Demosaic(去马赛克 / 拜耳插值)原理
单个像素只有一种颜色,要得到完整 RGB 像素,必须利用相邻像素插值估算缺失的另外两个颜色。 举个例子:阵列中某个 R 像素
- 当前已知:R 值
- 通过周边相邻 G、B 像素插值,估算出该位置 G、B 数值 最终生成每个像素都具备 R/G/B 三通道的完整图像。
这项运算由ISP 图像信号处理器完成:RAW(Bayer) → Demosaic → RGB临时图像 →色彩空间转换→ NV12(YUV420)也就是整条链路里:RAW → NV12 的核心步骤。
五、RAW 数据关键特性(结合之前的格式对比)
- 无完整彩色像素,只是离散采样点阵,不能直接送入 CNN/BPU
- 不存在 “YUV” 概念,YUV 是 ISP 插值、色彩空间转换之后才产生
- 位深常见:8bit (RAW8)、10bit (RAW10)、12bit (RAW12)
- IMX219/OV5647 大多 RAW8/Raw10
- 高动态工业 Sensor 常用 RAW12
- 数据结构是二进制裸流,没有文件头;打开必须指定分辨率 + 拜耳排布
六、容易混淆的关键点澄清
1)拜耳 RAW ≠ NV12
plaintext
光子 → CMOS → Bayer RAW(单通道点阵) ↓(ISP Demosaic+3A+色彩转换) NV12(YUV420 完整可视图像)单向流程,NV12 无法还原回拜耳 RAW,ISP 处理丢失了原始采样信息。
2)为什么 AI 推理不用 RAW,必须使用 NV12/RGB?
CNN/FCOS/YOLO神经网络输入要求:每个像素拥有R、G、B 三色信息。 RAW一个像素只有单一颜色,不满足网络输入条件。
3)什么时候需要抓取拜耳 RAW?
- Sensor 寄存器调试、排查 I2C 通信、曝光异常、噪点问题(当前相机调试阶段)
- 镜头标定、ISP 参数调优(白平衡、Gamma、降噪) 正常业务运行:不会输出 RAW,直接使用 ISP 输出NV12。
七、结合 RDK X5 硬件链路对应关系
plaintext
MIPI Sensor硬件输出:Bayer RAW(RGGB) ↓ 通过MIPI总线传给开发板 地平线VIO接收RAW → 送入内置ISP ↓ ISP流水线: Demosaic去马赛克 → 白平衡 → 降噪 → Gamma校正 → RGB→YUV转换 ↓ ISP输出 NV12(mipi_cam节点 /image_combine_raw话题)如果你想抓取 RAW 帧,需要修改 mipi_cam/VIO 配置,让 ISP 旁路、直接输出原始拜耳数据;默认工作模式下,你拿到的只有 NV12。
八、典型故障场景(和你遇到的 I2C 相机问题关联)
- I2C 通信异常 → Sensor 配置失效 → RAW 数据乱码、图像花屏
- ISP 拜耳排布参数配置错误 → RAW 解码后整体偏绿 / 偏红
- 位深配置不匹配(Raw10 当成 Raw8 解析)→ 画面条纹、噪点爆炸