在图像处理中,平面(Plane) 是指 颜色分量的独立存储区域。不同颜色格式(如 YUV、RGB)的平面数量差异主要由 颜色空间的存储方式 决定。以下是详细解释:
1. 平面的定义
-
平面:图像数据中 颜色分量的独立内存块。
每个平面存储一种或一组颜色分量,不同平面在内存中物理分离。-
示例:
-
YUV420:
Y
(亮度)、U
(色度)、V
(色度)分别存储在 3 个独立平面。 -
RGBA8888:
R
(红)、G
(绿)、B
(蓝)、A
(透明度)交织存储在一个平面中。
-
-
2. YUV420 为什么有 3 个平面?
(1) 颜色空间特性
-
YUV 格式:将亮度(Y)和色度(UV)分离,以优化压缩和传输效率。
-
Y(亮度):完整分辨率,决定图像细节。
-
U/V(色度):分辨率降低(通常为 Y 的 1/4),因为人眼对色度变化不敏感。
-
(2) 存储方式
-
YUV420 的平面划分:
-
平面 1:完整分辨率的 Y 分量(尺寸 W×H)。
-
平面 2:降采样的 U 分量(尺寸 W/2 × H/2)。
-
平面 3:降采样的 V 分量(尺寸 W/2 × H/2)。
-
YYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYY
UUVV
(3) 优势
-
节省带宽:色度降采样后,总数据量减少(相比 RGB 格式节省约 50%)。
-
硬件友好:ISP 可独立处理亮度/色度平面,提升处理效率。
3. RGBA 为什么只有 1 个平面?
(1) 颜色空间特性
-
RGBA 格式:每个像素的
R
、G
、B
、A
通道值连续存储,形成一个完整的像素单元。-
每个像素:
[R, G, B, A]
4 个字节(以 RGBA8888 为例)。
-
(2) 存储方式
-
单平面交织存储:所有像素的 RGBA 通道值按顺序排列在一个连续内存块中。
R0 G0 B0 A0 | R1 G1 B1 A1 | R2 G2 B2 A2 | ...
(3) 优势
-
访问高效:单个平面内可直接通过偏移量定位任意像素的所有通道。
-
兼容性强:GPU 和显示硬件通常直接支持交织格式(如 OpenGL/Vulkan)。
4. 为什么平面数量 ≠ 通道数量?
-
平面是存储概念,通道是逻辑概念:
-
YUV420 有 3 个平面,但逻辑上有 Y、U、V 3 个通道。
-
RGBA 有 1 个平面,但逻辑上有 R、G、B、A 4 个通道。
-
-
关键区别:
-
平面分离(YUV):不同通道存储在不同内存区域。
-
平面交织(RGBA):所有通道存储在同一内存区域。
-
5. 常见格式的平面与通道
格式 | 平面数量 | 通道数量 | 存储方式 |
---|---|---|---|
YUV420 | 3 | 3 | Y、U、V 分三个平面存储 |
YUV444 | 3 | 3 | Y、U、V 分三个平面(无降采样) |
NV12 | 2 | 3 | Y 一个平面,UV 交织在第二个平面 |
RGBA8888 | 1 | 4 | R、G、B、A 交织在一个平面 |
RGB565 | 1 | 3 | R、G、B 交织在一个平面(无 Alpha) |
6. 实际应用中的差异
(1) 内存访问
-
YUV420:需分别读取 3 个平面,例如:
// 伪代码:访问 YUV420 数据 uint8_t* yPlane = image.planes[0]; // Y 分量 uint8_t* uPlane = image.planes[1]; // U 分量 uint8_t* vPlane = image.planes[2]; // V 分量
-
RGBA:直接通过像素索引访问:
// 伪代码:访问 RGBA 数据 uint8_t* pixel = image.data + (y * width + x) * 4; uint8_t r = pixel[0]; uint8_t g = pixel[1]; uint8_t b = pixel[2]; uint8_t a = pixel[3];
(2) 性能优化
-
YUV420:平面分离适合硬件加速(如 ISP 并行处理 Y 和 UV 平面)。
-
RGBA:交织格式适合 GPU 渲染(减少纹理切换开销)。
总结
-
YUV420 有 3 个平面:因亮度与色度分离存储,且色度降采样。
-
RGBA 只有 1 个平面:因所有通道交织存储在连续内存中。
-
平面是物理存储方式,通道是逻辑分量,两者共同定义了图像数据的组织规则。