3、色彩校正基础:色彩空间(RGB、YUV、RAW)、白平衡原理、色彩矩阵校正
在摄像头驱动开发与故障排查中,图像噪声与色彩失真往往是相伴而生的两大难题。要精准定位并解决色彩问题,首先需要理解摄像头传感器输出的原始数据如何被转换为人类视觉可接受的彩色图像。本章将深入剖析色彩空间、白平衡原理以及色彩矩阵校正这三个核心基础,为后续的噪声抑制与色彩修复提供理论支撑。
3.1 色彩空间:从传感器到显示器的数据桥梁
色彩空间定义了颜色的数学模型与表示范围。摄像头链路中主要涉及三种色彩空间:RAW(传感器原始数据)、RGB(红绿蓝三通道)和YUV(亮度与色度分离)。理解它们之间的差异与转换关系,是驱动工程师进行ISP(图像信号处理)调试的第一步。
3.1.1 三种色彩空间对比
| 特性 | RAW (Bayer) | RGB | YUV (YCbCr) |
|---|---|---|---|
| 数据来源 | CMOS/CCD 传感器直接输出 | RAW 经去马赛克后生成 | RGB 经矩阵变换后生成 |
| 通道数 | 1 (单通道,含颜色滤波阵列) | 3 (R, G, B) | 3 (Y, U, V 或 Y, Cb, Cr) |
| 位深 | 10/12/14 bit (常见) | 8/10/12 bit | 8/10 bit |
| 数据量 | 最小 (原始像素) | 较大 (三通道全分辨率) | 中等 (可进行色度子采样) |
| 主要用途 | ISP 前端处理、噪声分析 | 显示、图像编辑、算法处理 | 视频编码、传输、预览 |
| 色彩关联性 | 强 (相邻像素颜色相关) | 强 (三通道高度相关) | 弱 (亮度与色度分离) |
3.1.2 RAW 到 RGB:去马赛克与色彩插值
传感器输出的RAW数据是单通道的拜耳阵列,每个像素只包含一种颜色分量。要得到全彩RGB图像,必须通过去马赛克(Demosaic)算法,利用相邻像素的颜色信息插值出缺失的另外两个通道。常见的插值算法包括双线性插值、边缘导向插值以及自适应插值。
3.1.3 RGB 到 YUV:亮度与色度分离
YUV色彩空间的核心优势在于将亮度(Y)与色度(U、V)分离。人眼对亮度变化比对色度变化更敏感,因此可以对U、V通道进行子采样(如4:2:0),大幅降低数据量而不显著影响视觉质量。标准转换公式如下:
// 标准 BT.601 转换 (8-bit, 范围 0-255)
Y = 0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.169 * R - 0.331 * G + 0.500 * B + 128
Cr = 0.500 * R - 0.419 * G - 0.081 * B + 128
在Linux驱动中,V4L2框架通常通过 VIDIOC_S_FMT 设置像素格式(如 V4L2_PIX_FMT_NV12 对应YUV 4:2:0),硬件ISP或软件库负责完成转换。
3.2 白平衡原理:还原真实世界的色彩
人眼具有色彩恒常性,无论光源色温如何变化(如白炽灯偏黄、日光灯偏蓝),都能将白色物体感知为白色。摄像头传感器则不具备这种能力,它忠实地记录场景中的光谱分布。白平衡(White Balance, WB)的目的就是通过算法消除光源颜色带来的色偏,使白色物体在图像中呈现为中性白。
3.2.1 色温与增益调整
白平衡的核心是估计当前光源的色温,然后对RGB三个通道施加不同的数字增益。例如,在低色温(偏黄)光源下,需要增加蓝色通道的增益,同时减少红色通道的增益。
| 光源类型 | 色温 (K) | 视觉偏色 | 白平衡调整策略 |
|---|---|---|---|
| 烛光/白炽灯 | 2000 - 3000 | 偏黄/橙 | 增加 B 增益,降低 R 增益 |
| 日光/闪光灯 | 5000 - 6500 | 中性白 | R/G/B 增益接近 1.0 |
| 阴天/阴影 | 7000 - 9000 | 偏蓝 | 增加 R 增益,降低 B 增益 |
3.2.2 自动白平衡(AWB)算法
Linux摄像头驱动中,AWB通常由ISP硬件或3A算法库(如libcamera中的AWB模块)实现。常见的AWB算法包括:
- 灰度世界法: 假设场景中所有颜色的平均值为灰色,通过调整增益使R、G、B三通道的平均值相等。
- 完美反射法: 寻找图像中最亮的像素点,假设其为白色,并以此为标准调整其他像素。
- 色温估计法: 通过统计图像在特定色温下的R/G和B/G比值,查找预置的色温查找表(LUT)来确定增益。
3.3 色彩矩阵校正:精确还原色彩饱和度与色调
即使白平衡正确,由于传感器滤色片的光谱响应与人眼视觉函数存在差异,图像色彩仍然可能偏淡或偏色。色彩校正矩阵(Color Correction Matrix, CCM)通过一个3x3的线性变换,将传感器RGB空间映射到标准色彩空间(如sRGB),从而精确还原色彩。
3.3.1 CCM 数学模型
CCM 的数学形式如下:
| R_out | | a11 a12 a13 | | R_in |
| G_out | = | a21 a22 a23 | * | G_in |
| B_out | | a31 a32 a33 | | B_in |
其中,R_in, G_in, B_in 是经过白平衡校正后的传感器RGB值,R_out, G_out, B_out 是校正后的标准RGB值。矩阵系数通常通过拍摄标准色卡(如Macbeth ColorChecker)并最小化色差来标定。
3.3.2 矩阵系数的作用
| 系数 | 作用 | 典型值范围 |
|---|---|---|
| a11, a22, a33 | 主对角线:控制各通道的饱和度 | 1.0 ~ 2.0 |
| a12, a13, a21, a23, a31, a32 | 非对角线:控制通道间的串扰(色调修正) | -0.5 ~ 0.5 |
3.4 色彩校正链路总结
在Linux摄像头驱动中,完整的色彩校正链路通常遵循以下顺序:
- RAW域处理: 坏点校正、黑电平校正、镜头阴影校正。
- 去马赛克: 将RAW Bayer数据转换为RGB。
- 白平衡: 应用R/G/B增益,消除光源色温影响。
- 色彩校正矩阵: 应用3x3 CCM,将传感器RGB映射到标准色彩空间。
- Gamma校正: 对亮度进行非线性映射,适配显示设备。
- RGB到YUV转换: 生成用于编码或预览的YUV数据。
VIDIOC_G_CTRL 和 VIDIOC_S_CTRL 实时读取和修改白平衡增益与CCM参数,快速定位问题环节。