1. 色彩校正基础:色彩科学概述、人眼视觉特性、色彩空间介绍
各位同学好,我是老张。做图像处理这行十几年了,今天咱们聊聊色彩校正的底子。说实话,很多人一上来就调参数,结果越调越偏——根子就在对色彩的基本认知不够。这一章,我把最核心的概念掰开揉碎讲清楚。
1.1 色彩科学概述:光与色的本质
色彩不是物体的固有属性。说白了,它是光进入人眼后,大脑产生的一种主观感受。没有光,就没有色。
我记得刚入行时,有个项目需要在暗光环境下做色彩还原。当时怎么调都不对,后来才发现——光源的光谱分布变了,相机的传感器响应没跟上。从那以后,我每次做色彩校正,第一件事就是确认光源类型。
核心要点:色彩 = 光源 × 物体反射 × 人眼感知。三者缺一不可。
光源有不同色温,比如白炽灯偏黄(约3200K),日光偏蓝(约5600K)。物体反射特定波长的光,剩下的被吸收。人眼则通过三种视锥细胞来解码这些光信号。
1.2 人眼视觉特性:我们是怎么看到颜色的
人眼不是一台完美的相机。它有明显的生理局限,但恰恰是这些局限,决定了色彩校正的边界。
1.2.1 视锥细胞与三色理论
人眼视网膜上有三种视锥细胞,分别对长波(L,红)、中波(M,绿)、短波(S,蓝)最敏感。这就是三色视觉的基础。
- L锥细胞:峰值约560nm,负责红色和黄色区域
- M锥细胞:峰值约530nm,负责绿色区域
- S锥细胞:峰值约420nm,负责蓝色区域
这三种细胞的响应曲线是重叠的。所以,一个单色光可以同时刺激多种锥细胞,而不同光谱组合也能产生相同的三刺激值——这就是同色异谱现象。
实战经验:我在做显示器校准时,遇到过一种情况:屏幕上的颜色和打印出来的颜色,在标准光源下看起来一样,换个光源就完全不同了。这就是同色异谱在捣鬼。所以,色彩校正必须指定观察条件。
1.2.2 视觉适应与对比度
人眼有很强的自适应能力。你从室外走进暗室,过一会儿就能看清东西——这是暗适应。同样,人眼对色彩也有色适应,比如白平衡校正就是模拟这个机制。
另外,人眼对亮度的感知不是线性的。对暗部变化很敏感,对亮部变化相对迟钝。这就是为什么Gamma校正那么重要。
注意:人眼对蓝色细节的分辨能力最差。所以很多图像压缩算法会降低蓝色通道的分辨率,人眼基本看不出来。但做色彩校正时,蓝色通道的精度不能丢,否则色偏会很明显。
1.3 色彩空间:给颜色一个坐标
色彩空间,说白了就是给颜色定个坐标系。不同的色彩空间,适用于不同的场景。我挑三个最常用的讲。
1.3.1 RGB色彩空间
RGB是最直观的,也是显示设备的基础。它用红、绿、蓝三个通道的强度来表示颜色。每个通道通常用0-255的整数表示,共1677万种颜色。
// RGB颜色示例
R = 255, G = 0, B = 0 → 纯红色
R = 0, G = 255, B = 0 → 纯绿色
R = 0, G = 0, B = 255 → 纯蓝色
R = 255, G = 255, B = 0 → 黄色(红+绿)
R = 128, G = 128, B = 128 → 中性灰
但RGB有个问题:它和设备相关。同一个RGB值,在不同显示器上看起来不一样。所以,跨设备传递颜色时,RGB不够用。
1.3.2 XYZ色彩空间
XYZ是国际照明委员会(CIE)在1931年定义的。它基于人眼的三刺激值,是设备无关的。简单说,XYZ就是颜色的“坐标”。
| 色彩空间 | 特点 | 适用场景 |
|---|---|---|
| RGB | 设备相关,直观 | 显示、采集、存储 |
| XYZ | 设备无关,坐标 | 色彩测量、标准定义 |
| Lab | 感知均匀,分离亮度和色度 | 色彩校正、色差计算 |
XYZ的Y分量代表亮度,X和Z代表色度。但XYZ空间不是感知均匀的——两个颜色在XYZ空间中的欧氏距离,和人眼感觉到的差异不成正比。
1.3.3 Lab色彩空间
Lab就是为了解决感知均匀问题而生的。它把颜色分成三个分量:
- L:亮度,从0(黑)到100(白)
- a:从绿色到红色
- b:从蓝色到黄色
Lab空间的欧氏距离,和人眼感知的色彩差异基本一致。所以,色差公式ΔE就是基于Lab空间计算的。
实用技巧:我在做色彩校正时,习惯先把图像转到Lab空间,然后只调整a和b通道,保持L通道不变。这样能避免亮度失真。你想想看,如果直接调RGB,很容易把亮度也带偏了。
1.4 色彩空间转换:从RGB到XYZ再到Lab
转换公式看起来有点复杂,但实际用起来就是几行代码的事。我直接给个例子。
// RGB到XYZ转换(sRGB标准,D65白点)
function rgbToXyz(r, g, b) {
// 先做Gamma校正
r = srgbGamma(r / 255.0);
g = srgbGamma(g / 255.0);
b = srgbGamma(b / 255.0);
// 线性变换
let x = 0.4124564 * r + 0.3575761 * g + 0.1804375 * b;
let y = 0.2126729 * r + 0.7151522 * g + 0.0721750 * b;
let z = 0.0193339 * r + 0.1191920 * g + 0.9503041 * b;
return {x, y, z};
}
// XYZ到Lab转换
function xyzToLab(x, y, z) {
// 归一化到D65白点
x /= 0.95047;
y /= 1.00000;
z /= 1.08883;
// 非线性变换
let fx = labF(x);
let fy = labF(y);
let fz = labF(z);
let L = 116 * fy - 16;
let a = 500 * (fx - fy);
let b = 200 * (fy - fz);
return {L, a, b};
}
避坑指南:我曾经在转换时忘了做Gamma校正,结果颜色全偏了。查了半天才发现,RGB到XYZ的转换,输入必须是线性RGB,不是sRGB。记住:sRGB要先做逆Gamma,转成线性RGB,再做矩阵乘法。
1.5 知识结构图:色彩校正基础体系
下面这张图,把本章的核心概念串起来了。你看一遍,心里就有谱了。
1.6 本章小结
色彩校正不是玄学,它建立在色彩科学、人眼视觉和色彩空间这三个支柱上。你理解了光怎么来、人眼怎么看、颜色怎么量化,后面调起参数来才有底气。
我个人习惯,每次拿到一个新项目,先搞清楚三件事:光源是什么、目标色彩空间是什么、人眼最终在哪里看。这三件事定下来,校正方案就清晰了。
一句话记住:色彩校正,就是让颜色从采集到显示,一路保持“看起来对”。