4.13. 像素格式¶
ISP 管线的最后一个阶段将每个像素打包成内存中某种特定的字节布局。所选格式在图像质量、内存大小以及下游代码如何读回这些字节之间进行权衡。占主导地位的只有少数几种格式。
4.13.1. RAW(Bayer)¶
默认输出是原始 Bayer——与传感器产生的相同的每像素单通道马赛克。每像素一个字节,按 Bayer 模式排列:偶数行红绿交替,奇数行绿蓝交替。尚未进行去拜耳处理,因此每个单元仍只保存其颜色滤镜所透过的那个值。
原始 Bayer 的内存占用是成品三通道 RGB 图像的三分之一——每像素一个字节而非三个——并且没有花费任何 ISP 周期来去拜耳或转换它。代价是用户代码必须自己完成去拜耳处理,才能运行任何颜色感知处理。
4.13.2. RGB888¶
RGB888 是彩色图像天然的成品格式:每像素三个字节,红、绿、蓝三个通道各占一个,每通道 8 位。每像素 24 位,可表示略少于一千七百万种不同的颜色。
RGB888 是成品彩色图像的概念参考,大多数板外软件都使用它。在嵌入式硬件上,它的主要缺点是 24 位的像素大小——不是处理器字长的整数倍,对内存对齐不友好,并且比下一档格式大 50%。
4.13.3. RGB565¶
RGB565 将每个像素打包成两个字节:5 位红、6 位绿、5 位蓝。多出来的那一位绿色反映了人眼对绿色更高的敏感度,也与 Bayer 模式中绿色通道的双倍权重相吻合。
RGB565 是 OpenMV Cam 上的默认颜色格式。每像素两个字节是 16 位对齐的,符合 MCU 的天然数据宽度——像素的加载、存储和运算全都以全速运行,许多操作还能一次处理一对像素。RGB888 的 24 位像素无法那样对齐,在每次访问时都要付出代价。相比 RGB888 节省 33% 的内存也很可观:QVGA(320 x 240)在 RGB565 下为 150 KB,而在 RGB888 下为 225 KB,并且差距会随分辨率增大而拉大。
代价是只能表示六万五千种不同的颜色,而非一千七百万种。对于大多数机器视觉任务而言,这一差别是看不出来的,因为这些算法会将帧缩减为阈值化或边缘检测的表示,本来就会丢弃大部分颜色细节。对于人眼观看而言,缺失的位会在平滑的色彩渐变中表现为微弱的条带,但不会成为眼睛立刻能察觉的东西。
4.13.4. YUV422¶
YUV422 将每个像素的颜色拆分为一个 亮度 值(Y)和两个 色度 值(U 和 V),然后对色度进行下采样,因为人类视觉对颜色变化的敏感度远低于对亮度变化的敏感度。每个像素都携带自己的 Y,但相邻的像素对共享一个 U 和一个 V。每一对的字节布局为四个字节——Y0、U、Y1、V——平均算下来每像素两个字节,与 RGB565 相同。
不过这两个字节的含义与 RGB565 的不同。单独的 Y 通道就是一幅可直接使用的 8 位灰度图像,而这正是大多数经典机器视觉算法(边缘检测、模板匹配、色块分析)实际所消耗的;U 和 V 通道则为少数需要颜色信息的算法承载这部分信息。
当管线两者都需要时,YUV422 是正确的选择——前期阶段只读取 Y,后续阶段使用色度进行更精细的颜色判断——因为 Y 值就摆在那里,无需颜色空间转换即可直接使用。
4.13.5. 灰度¶
灰度是每像素一个字节:只有亮度值,完全没有颜色。它是最小的成品格式——是 RGB565 和 YUV422 大小的一半,是 RGB888 大小的三分之一。
反正大多数经典机器视觉算法都在灰度上工作,因此直接从传感器丢弃颜色通道往往是最简单、最省内存的选择。边缘检测、寻线、色块分析、QR 码解码、模板匹配和 AprilTag 检测全都在灰度上运行,并能从更小的缓冲区中获益。
4.13.6. 其他格式¶
OpenMV Cam 能够产生的少数几种格式并不是作为常规流程的一部分从 ISP 管线输出的。
BINARY 是每像素一位——可能的最小表示。用于阈值化图像、掩码缓冲区,以及任何在每个像素上只区分匹配与不匹配的操作的输出。
JPEG 是一种压缩的颜色格式。有些传感器内置片上 JPEG 编码器,可直接输出 JPEG 压缩帧;对于没有该编码器的传感器,MCU 会在 ISP 之后对成品的 RGB 或灰度帧运行 JPEG 编码器。无论哪种方式,输出都是 JPEG 比特流,适用于将帧保存到存储介质或通过带宽受限的链路发送它们。
PNG 是一种无损压缩格式。传感器不会直接产生 PNG;MCU 会按需对成品的 RGB 或灰度帧进行压缩。当带宽或存储很重要,但 JPEG 所采用的有损压缩会丢弃应用后续需要的信息时,它很有用。