3、图像处理基础:数字图像表示、颜色空间(RGB、YUV、HSV)、像素操作与图像质量评估指标
在嵌入式GPU图像处理流水线中,一切算法、硬件加速和性能优化都建立在“如何用数字精确描述一幅图像”这一根基之上。本章将系统梳理数字图像的数学表示、三大核心颜色空间的物理意义与转换逻辑、像素级操作的基本范式,以及衡量图像质量的客观与主观指标体系。理解这些基础概念,是后续理解ISP(图像信号处理器)流水线、GPU着色器优化和编解码器设计的必要前提。
3.1 数字图像的数学表示与存储结构
数字图像在数学上可定义为二维离散函数 f(x, y),其中 (x, y) 表示像素的空间坐标,f 值表示该位置的亮度或颜色向量。对于灰度图,f 是标量;对于彩色图,f 是三维向量(如 RGB 三个分量)。在嵌入式系统中,图像通常以连续内存块存储,遵循行优先(Row-Major)或平面(Planar)布局。理解存储布局对 GPU 纹理采样、DMA 传输和缓存优化至关重要。
核心原理:从连续到离散
自然场景是连续的光信号,通过镜头和传感器采样后变为离散像素。采样率决定空间分辨率,量化位数决定灰度/色深分辨率。嵌入式 GPU 流水线中,传感器输出通常为 Bayer 格式(每个像素仅含 R/G/B 之一),需经过去马赛克(Demosaic)算法恢复全彩。这一过程涉及插值运算,直接影响图像锐度和伪彩抑制。
| 存储布局 | 描述 | 适用场景 | GPU 友好度 |
|---|---|---|---|
| Chunky (RGB888) | 像素连续存储,每像素3字节 | 显示缓冲、纹理上传 | 高(纹理单元直接支持) |
| Planar (YUV420p) | Y、U、V 分平面存储 | 视频编码、硬件编解码器 | 中(需多次纹理绑定) |
| Semi-Planar (NV12) | Y 平面 + 交错 UV 平面 | 摄像头采集、ISP 输出 | 高(双通道纹理) |
| Packed (RGB565) | 16bit 打包,R5G6B5 | 低端显示、帧缓冲 | 中(需格式转换) |
实战要点:在嵌入式 GPU 中,纹理采样器对内存对齐有严格要求。例如 Mali GPU 推荐纹理行首地址 64 字节对齐,否则会触发额外的内存读取开销。设计图像缓冲区时,应使用 alignas(64) 或平台特定的分配函数(如 dma_alloc_coherent)。
3.2 颜色空间:RGB、YUV 与 HSV 的工程语义
颜色空间是描述颜色的数学模型。不同颜色空间服务于不同工程目标:RGB 面向显示设备,YUV 面向传输和压缩,HSV 面向人眼感知和图像分割。在嵌入式 GPU 流水线中,颜色空间转换是最高频的像素操作之一,通常由专用硬件单元或 GPU 着色器完成。
RGB:加法混色与显示标准
RGB 基于人眼三种视锥细胞的响应特性,通过红、绿、蓝三原色的加法混合产生各种颜色。在嵌入式系统中,RGB 的位深直接影响显示质量:8bit 每通道可显示 1670 万色,10bit 可显示 10.7 亿色。GPU 着色器通常以浮点(0.0~1.0)或整数(0~255)处理 RGB 值,转换时需注意精度损失。
YUV:亮度与色度分离
YUV 将亮度(Y)与色度(U/V)分离,利用人眼对亮度敏感、对色度不敏感的特性实现高效压缩。在嵌入式视频流水线中,YUV 4:2:0 是最常见的采样格式,即每 2×2 像素块共享一个 U 和 V 值。GPU 处理 YUV 纹理时,需通过着色器手动采样三个平面并合成 RGB,这比直接采样 RGB 纹理多 2~3 次纹理读取。
// YUV 转 RGB 的标准公式(BT.601 有限范围)
R = 1.164 * (Y - 16) + 1.596 * (V - 128);
G = 1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128);
B = 1.164 * (Y - 16) + 2.018 * (U - 128);
HSV:面向感知的颜色描述
HSV 将颜色分解为色调(Hue)、饱和度(Saturation)和明度(Value),更接近人类描述颜色的方式。在图像处理中,HSV 常用于颜色分割、目标检测和图像增强。例如,在肤色检测中,只需判断 H 值是否在特定范围(如 0°~30°)即可,而无需考虑光照变化对 RGB 的影响。但 HSV 转换涉及非线性运算(如 min/max 和条件分支),在 GPU 上需注意着色器分支发散问题。
| 颜色空间 | 分量含义 | 典型位深 | 主要应用 | GPU 转换成本 |
|---|---|---|---|---|
| RGB | 红/绿/蓝强度 | 8/10/16 bit | 显示、纹理、图像处理 | 低(原生支持) |
| YUV | 亮度/蓝色差/红色差 | 8/10 bit | 视频编码、摄像头 ISP | 中(多平面采样) |
| HSV | 色调/饱和度/明度 | 8 bit 浮点 | 颜色分割、目标跟踪 | 高(非线性运算) |
常见误区:YUV 与 YCbCr 经常被混用。严格来说,YUV 是模拟信号概念,YCbCr 是数字信号概念。在嵌入式代码中,应明确标注使用的是 BT.601(标清)还是 BT.709(高清)转换矩阵,两者系数不同,混用会导致颜色偏移。
3.3 像素操作:从点运算到邻域滤波
像素操作是图像处理的基本单元,可分为点操作(每个像素独立处理)和邻域操作(依赖周围像素)。在嵌入式 GPU 中,点操作适合用着色器并行处理,邻域操作则需考虑纹理采样开销和缓存局部性。
点操作:亮度调整与阈值化
点操作包括亮度/对比度调整、伽马校正、阈值分割等。这类操作的计算复杂度为 O(N),GPU 可轻松实现每像素独立并行。例如,伽马校正公式 out = pow(in, 1/gamma) 在 GPU 上可通过内置函数快速计算。但需注意,当处理 8bit 整数图像时,查表法(LUT)比浮点计算更快,且可避免重复计算。
邻域操作:卷积与滤波
邻域操作如高斯模糊、边缘检测(Sobel)、锐化等,需要访问像素周围的邻域。在 GPU 上,这对应纹理采样操作。关键优化点在于:使用 textureOffset 或共享内存(Local Memory)减少重复采样。对于 3×3 卷积核,每个像素需要 9 次纹理采样,若不做优化,内存带宽将成为瓶颈。
// OpenGL ES 3.0 中的 3×3 均值模糊着色器片段
#version 300 es
precision mediump float;
uniform sampler2D u_tex;
in vec2 v_uv;
out vec4 fragColor;
void main() {
vec2 texelSize = 1.0 / vec2(textureSize(u_tex, 0));
vec3 sum = vec3(0.0);
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
sum += texture(u_tex, v_uv + vec2(i, j) * texelSize).rgb;
}
}
fragColor = vec4(sum / 9.0, 1.0);
}
性能经验:在 Mali GPU 上,邻域操作应尽量使用 textureGather 指令(一次采样返回 2×2 像素),可将 3×3 卷积的采样次数从 9 次降至 4 次。对于更大的卷积核(如 5×5),考虑使用分离卷积(先水平后垂直),将复杂度从 O(N²) 降至 O(2N)。
3.4 图像质量评估:从像素误差到感知质量
图像质量评估是衡量处理效果的核心手段,分为客观指标和主观指标。在嵌入式 GPU 开发中,客观指标用于自动化测试和回归验证,主观指标用于最终效果确认。
客观指标:PSNR 与 SSIM
峰值信噪比(PSNR)是最常用的客观指标,基于均方误差(MSE)计算,单位 dB。PSNR 越高,表示失真越小。但 PSNR 对结构信息不敏感,可能出现“高 PSNR 但视觉质量差”的情况。结构相似性指数(SSIM)从亮度、对比度和结构三个维度评估图像质量,更接近人眼感知。
| 指标 | 公式 | 范围 | 适用场景 | 局限性 |
|---|---|---|---|---|
| MSE | Σ(I-K)²/N | 0~∞ | 基础误差度量 | 对像素位置不敏感 |
| PSNR | 10·log₁₀(MAX²/MSE) | 20~50 dB | 压缩质量、去噪评估 | 忽略结构信息 |
| SSIM | 基于均值/方差/协方差 | 0~1 | 感知质量评估 | 计算量大,不适合实时 |
主观评估:MOS 与 A/B 测试
平均意见分(MOS)是标准的主观评估方法,由多名观察者对图像打分(1~5 分)。在嵌入式开发中,由于资源限制,常用简化方案:在目标设备上并排显示处理前后图像,由开发团队进行 A/B 对比。主观评估对 ISP 调参(如降噪强度、锐化程度)尤为重要,因为客观指标无法完全反映视觉感受。
案例拆解:某安防摄像头项目需要评估夜间降噪算法的效果。初始方案仅使用 PSNR 作为指标,PSNR 从 28dB 提升至 31dB,但实际画面出现“涂抹感”,细节丢失严重。引入 SSIM 后发现 SSIM 仅从 0.82 提升至 0.84,提升幅度远小于 PSNR 的暗示。进一步分析发现,降噪算法在平坦区域过度平滑,导致纹理细节被抹除。最终通过调整降噪强度参数(从 0.8 降至 0.5),并增加边缘保护权重,在 PSNR 保持 30dB 的同时,SSIM 提升至 0.88,主观画质明显改善。此案例说明:单一客观指标不可靠,必须结合 SSIM 和主观评估。
3.5 常见误区与工程复盘
在嵌入式 GPU 图像处理开发中,以下误区值得特别注意:
- 颜色空间转换精度不足:使用整数运算代替浮点运算时,未考虑舍入误差累积。建议在 GPU 着色器中使用 mediump 精度(16bit 浮点)时,对关键转换(如 YUV→RGB)使用 highp 精度。
- 忽略内存对齐:图像缓冲区未按 GPU 要求对齐,导致 DMA 传输效率下降 30% 以上。应使用平台提供的对齐分配函数。
- 过度依赖 PSNR:PSNR 对模糊不敏感,对噪声敏感。在评估去噪算法时,应同时关注 SSIM 和主观细节保留度。
- YUV 格式混淆:将 NV12 与 NV21 混淆(U/V 顺序不同),导致颜色通道互换。应在代码中明确标注格式宏,并在初始化时进行自检。
风险提示:在 GPU 上进行颜色空间转换时,注意纹理格式的兼容性。例如,Mali GPU 对 R8G8B8A8_UNORM 纹理的采样速度优于 R8G8B8_UNORM,因为后者需要额外的内存对齐处理。在性能敏感场景,建议将 RGB 图像填充为 RGBA 格式。