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 知识结构图:色彩校正基础体系

下面这张图,把本章的核心概念串起来了。你看一遍,心里就有谱了。

色彩校正基础体系 光源(色温/光谱) 物体(反射/透射) 人眼(三色视觉) 三大色彩空间 RGB 设备相关,直观 XYZ 设备无关,坐标 Lab 感知均匀,色差计算 核心流程:光源 → 物体 → 人眼 → RGB采集 → XYZ转换 → Lab校正 色彩校正的本质:在不同色彩空间之间转换,并补偿设备差异和人眼感知偏差

1.6 本章小结

色彩校正不是玄学,它建立在色彩科学、人眼视觉和色彩空间这三个支柱上。你理解了光怎么来、人眼怎么看、颜色怎么量化,后面调起参数来才有底气。

我个人习惯,每次拿到一个新项目,先搞清楚三件事:光源是什么、目标色彩空间是什么、人眼最终在哪里看。这三件事定下来,校正方案就清晰了。

一句话记住:色彩校正,就是让颜色从采集到显示,一路保持“看起来对”。