光照与颜色
图像的本质
从光到像素
在计算机视觉中,我们处理的基本对象是图像。但一张图像是如何产生的?
成像过程可以用一条链路概括:光源发出光线照射到场景中的物体,物体表面反射(或吸收、透射)光线,其中一部分进入成像系统(如相机镜头),最终被记录在像平面上。在数码相机中,传统的胶片被传感器阵列(Sensor Array)替代——阵列中的每个单元都是一个光敏二极管,负责将入射的光子转化为电子信号。常见的传感器类型包括 CCD(Charge-Coupled Device)和 CMOS(Complementary Metal-Oxide-Semiconductor),其中 CMOS 传感器因制造成本低、功耗小而成为当今主流。
每个传感器单元记录的是来自一小范围入射角的光的总量。连续的光学图像投射到离散的传感器阵列上,经过采样(Sampling)和量化(Quantization),就变成了我们熟悉的数字图像——一个像素矩阵。对灰度图像而言,每个像素存储一个亮度值(通常在 0-255 之间或归一化到 0-1);对彩色图像,每个像素存储三个通道(R、G、B)的值。
图像作为矩阵
从数学角度看,一张灰度图像就是一个二维矩阵 ,其中 和 分别是图像的高度和宽度(以像素为单位)。彩色图像则是三个这样的矩阵叠加:。
动态范围与相机响应
真实场景中的光强跨越极大范围——从暗适应后的阈值(约 lamberts,lambert 是一种亮度单位)到雪地上的耀眼阳光(约 lamberts),跨越了约 10 个数量级。这就是动态范围(Dynamic Range)的概念。
相机的传感器无法完美捕获如此大的动态范围。一台典型数码相机的响应曲线在中间段(像素值约 15-240)近似线性,但在两端出现非线性:
- 低端出现欠饱和(Undersaturation):太暗的区域无法分辨
- 高端出现饱和(Saturation):太亮的区域被截断为最大值
Bayer 滤色阵列
每个传感器单元本身只能感知光强,无法区分颜色。为了获取彩色图像,大多数数码相机在传感器阵列前放置一层 Bayer 滤色阵列(Bayer Filter Array)——由红、绿、蓝三种颜色滤光片按特定模式排列(RGGB 模式,绿色滤光片数量是红色或蓝色的两倍,因为人眼对绿色最敏感)。
这意味着每个像素位置实际上只记录了 R、G、B 中某一个通道的值。缺失通道的值需要通过去马赛克(Demosaicing)算法从相邻像素插值得到,最终生成完整的三通道彩色图像。
flowchart LR
A["入射光"] --> B["Bayer 滤色阵列"]
B --> C["传感器阵列"]
C --> D["原始数据<br/>(马赛克图案)"]
D --> E["去马赛克算法"]
E --> F["三通道<br/>RGB 图像"]
classDef light fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
classDef process fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef data fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
class A light
class B,C,E process
class D,F data
表面反射特性
像素亮度的决定因素
一个像素的亮度值是多种因素共同作用的结果:
- 光源的强度、方向和颜色
- 被拍摄表面的朝向(几何形状)
- 表面的材质和反照率
- 周围表面的反射光和阴影
- 相机的增益和曝光参数
单个像素的亮度本身不携带任何明确信息——同样的亮度值可能来自暗光下的白色物体,也可能来自强光下的深色物体。那我们是如何理解图像的?关键在于:对于空间上相邻的场景点,上述大多数因素变化不大,因此信息主要蕴含在亮度的局部差异中。计算相邻像素的亮度差(梯度),可以勾勒出物体的轮廓——这就是边缘检测的直觉基础。
反射的基本模型
当光线照射到物体表面时,根据表面材质的不同,反射行为大致分为两种基本类型:
镜面反射(Specular Reflection)遵循反射定律——入射角等于反射角。镜面反射只在一个方向上集中反射光线,就像镜子一样。在光滑的物体(如金属球、抛光地板)表面可以观察到明显的高光(Specularity),即镜面反射分量占主导的区域,通常呈现光源的形状。
漫反射(Diffuse Reflection)将入射光均匀地散射到各个方向。无论从哪个角度观察,表面亮度看起来都一样。粗糙的表面(如布料、混凝土、哑光涂料)以漫反射为主。
真实世界中,大多数表面同时具有镜面反射和漫反射分量——只是比例不同。对于大部分日常物体,镜面分量通常很小。
其他光学效应
除了反射,光与物质的交互还包括多种其他效应:
| 效应 | 描述 | 示例 |
|---|---|---|
| 透射(Transparency) | 光穿过透明材质 | 玻璃、水 |
| 折射(Refraction) | 光在介质界面改变方向 | 水中物体「弯折」 |
| 次表面散射(Subsurface Scattering) | 光穿入表面内部散射后再射出 | 皮肤、蜡、大理石 |
| 荧光(Fluorescence) | 吸收波长 的光,立即发射更长波长 的光 | 荧光笔、荧光蘑菇 |
| 磷光(Phosphorescence) | 吸收光后延迟发射 | 夜光材料、萤火虫 |
Lambert 反射模型
Lambert 反射模型(Lambertian Reflectance Model)是描述理想漫反射的数学模型。在这个模型中:
- 表面吸收一部分入射光,比例为 ,其中 是表面的反照率(Albedo),取值在 0 到 1 之间。
- 表示全吸收(完全黑), 表示全反射(完全白)
- 剩余的 比例的光被均匀散射到半球空间的各个方向
在 Lambert 模型下,像素 处的反射亮度为
其中 是该点的反照率, 是指向光源的方向向量(大小编码光源强度), 是该点的表面法向量。, 是入射角。
这个公式的直觉很清晰:当光线垂直照射表面()时,同样面积接收的光通量最大,亮度最高;光线越倾斜( 越大),单位面积接收的光越少,亮度越低。
想象一栋建筑的两个立面——正对阳光的那一面明显比侧面亮。两个面的材质相同( 相同),差别完全来自法向量 与光源方向 的夹角不同。
BRDF
Lambert 模型只描述了理想漫反射的情况。对于更一般的表面,我们需要一个完整的反射模型——双向反射分布函数(Bidirectional Reflectance Distribution Function, BRDF)。
BRDF 的定义涉及两个辐射度量学概念:
- 辐亮度(Radiance) 衡量的是单位投影面积、单位立体角内的辐射功率。直觉上对应「从某个方向看,表面有多亮」
- 辐照度(Irradiance) 衡量的是单位面积接收的辐射功率。直觉上对应「有多少光照到了这个面上」。
BRDF 定义为出射辐亮度 与入射辐照度 之比:
其中 和 分别是入射和出射方向的天顶角与方位角, 是波长。BRDF 完整描述了表面如何将来自任意方向的光重新分配到各个出射方向——镜面反射、漫反射乃至更复杂的光泽反射都可以用 BRDF 统一表示。
真实材料的 BRDF 可以非常复杂。理想漫反射表面(如粉笔)的 BRDF 是一个常数——从哪个方向看都一样亮;理想镜面的 BRDF 是一个 delta 函数——所有光集中在反射方向。真实表面往往在两者之间:金属表面偏镜面(有明显的高光方向),橡胶偏漫反射。更复杂的情况如丝绸的各向异性光泽、水果表面的蜡质层、头发的多重散射等,都需要精细的 BRDF 来建模。
颜色的物理本质
什么是颜色
颜色的本质
颜色(Color)是物理环境中的光与我们的视觉系统交互作用的结果。颜色是视觉体验的一种心理属性,而非物体或光本身的物理属性。同一个物理光谱在不同的观察条件下可以产生不同的颜色感知。
光谱
光是电磁波。电磁波谱覆盖了从伽马射线到无线电波的巨大范围,而人眼能感知的可见光(Visible Light)只占其中极小的一段——波长约 (紫色)到 (红色)。
一束光通常不是单一波长,而是由多种波长成分按不同强度混合而成。这种波长-强度的分布称为光谱(Spectrum)。我们可以用一个函数 来描述一束光的光谱分布,其中 是波长。
人眼对不同波长的敏感度不同——人类亮度灵敏度函数(Human Luminance Sensitivity Function)在约 (黄绿色区域)处达到峰值,在红色和紫色端迅速下降。这就是为什么同样物理功率的绿色光看起来比红色或蓝色光更亮。
光源光谱
不同光源的光谱差异很大:
| 光源 | 光谱特征 |
|---|---|
| 太阳光 | 近似连续的宽带光谱,覆盖整个可见光范围 |
| 白炽灯 | 连续光谱,偏暖(红色端较强) |
| LED | 窄带峰值,部分通过荧光粉展宽为白光 |
| 紧凑型荧光灯(CFL) | 多个尖锐峰值的线状光谱,看起来不太连续 |
光与表面的交互
我们看到的颜色并非光源本身的颜色,而是光源光谱与表面反射率共同作用的结果。每种材料的表面在不同波长上有不同的反射率,形成该材料特有的反射光谱(Reflectance Spectrum)。
到达我们眼睛的颜色信号是光源光谱 与表面反射光谱 的逐波长乘积:
不同物体表现出不同颜色,正是因为它们的反射光谱不同:红色的番茄主要反射长波(红色)光,蓝色的蓝莓主要反射短波(蓝色)光。
颜色的生理基础
视杆细胞与视锥细胞
如果光是一个连续的光谱,为什么我们的图像只需要三个通道(RGB)就能表示颜色?答案在于人类视觉系统的生理结构。
人类视网膜上有两种感光细胞:
- 视杆细胞(Rods)负责感知亮度,在低光照条件下工作(暗视觉,Scotopic Vision),对颜色不敏感但灵敏度极高,能检测到极微弱的光。视杆细胞在视网膜上密度很高(约 1.2 亿个),但在中央凹(Fovea)处缺席。
- 视锥细胞(Cones)负责颜色感知,在明亮环境下工作(明视觉,Photopic Vision)。视锥细胞有三种,对应不同波长范围的峰值响应:
| 类型 | 峰值波长 | 对应颜色 |
|---|---|---|
| S 型(Short) | 蓝 | |
| M 型(Medium) | 绿 | |
| L 型(Long) | 红 |
中央凹是视网膜中心一个仅 1-2° 视角的小区域,拥有最高密度的视锥细胞而没有视杆细胞,是视觉分辨率最高的部位。
关于色觉的趣味知识
- 编码 M 和 L 型视锥细胞的基因位于 X 染色体上,因此男性(只有一条 X 染色体)更容易出现色觉缺陷——约 8% 的男性有某种程度的色盲
- L 型视锥细胞基因具有高度变异性,少数拥有两条 X 染色体的女性可能携带四种不同的视锥细胞,从而具有四色视觉(Tetrachromacy)
- 人眼中 L:M:S 视锥细胞的比例约为 10:5:1
- 不同动物的视锥细胞数目差异巨大:夜行动物通常只有 1 种,狗有 2 种,鸟和鱼有 4 种,鸽子有 5 种,螳螂虾(mantis shrimp)有多达 12 种
颜色感知模型
三种视锥细胞各自充当光谱上的一个滤波器。每种视锥细胞对入射光谱的响应是其灵敏度曲线与光谱的逐波长乘积的积分:
每种视锥细胞最终只输出一个数值。因此,整个连续光谱被压缩为三个数字(S、M、L 三个响应值),绝大部分光谱信息在此过程中丢失了。
同色光
由于光谱到三个数值的映射是多对一的,两个物理上完全不同的光谱可能产生完全相同的 S、M、L 响应,因此在人眼看来颜色完全一样——这种现象称为同色光(Metamers)。
同色光现象是显示器能够工作的基础:屏幕只需要 R、G、B 三种原色光,通过调节它们的亮度比例,就可以「欺骗」人眼产生各种颜色的感知——尽管屏幕发出的光谱与真实物体的反射光谱完全不同。
人眼与相机的类比
人眼视网膜上的视锥细胞马赛克(S、M、L 不均匀分布)与数码相机的 Bayer 滤色阵列在原理上非常相似——两者都是通过在每个空间位置只采样一种颜色通道,然后通过后处理恢复完整的颜色信息。
颜色空间
前面知道了三种视锥细胞将连续光谱压缩为三个数值——那么如何用一套坐标系来量化描述颜色?这就是颜色空间所解决的问题。不同颜色空间的演进逻辑是:每一步解决上一步的缺陷。
flowchart LR
subgraph 线性
RGB["RGB"]
XYZ["CIE XYZ"]
end
subgraph 均匀
UV["CIE u'v'"]
end
subgraph 感知
HSV["HSV"]
end
RGB -- "匹配函数有负值<br/>→ 线性变换" --> XYZ
XYZ -- "感知不均匀<br/>→ 射影变换" --> UV
RGB -- "不直观<br/>→ 非线性变换" --> HSV
classDef linear fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef uniform fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
classDef perceptual fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
class RGB,XYZ linear
class UV uniform
class HSV perceptual
颜色匹配实验
如何定量描述人类的颜色感知?由于颜色是主观体验,唯一的方法是通过颜色匹配实验(Color Matching Experiment)。
实验装置是一个二分屏:屏幕一半由待测光照亮,另一半由三种可调原色光混合照亮。实验者调节三种原色的亮度,直到两半看起来颜色一致。此时三种原色的亮度值 就是该颜色在这组原色下的「坐标」。
大多数颜色可以通过正的原色混合来匹配,但有些颜色无论怎么调节都无法匹配。解决方法是将某种原色移到待测光一侧——相当于从待测光中「减去」该原色。在记录中,移到另一侧的原色量记为负值。
颜色匹配的两种情况
实验 1:待测光是某种青绿色。调节原色后发现需要少量 (红)、中量 (绿)、较多 (蓝)即可匹配。三个值都是正的。
实验 2:待测光是一种饱和的深红色。调节原色后发现,无论如何增加 和 ,混合光总是偏粉、不够「纯」。解决方法:将部分 (绿光)加到待测光一侧,匹配成功。此时记 为负值。
线性颜色空间
固定三种原色后,任何颜色都可以用一组三维坐标 来表示——这就定义了一个线性颜色空间。
对于任意光谱 ,如何找到它在线性颜色空间中的坐标?我们需要匹配函数(Matching Functions),它们描述了匹配各个单色光所需的三种原色的量。对于任意光谱,其坐标为:
匹配函数本质上就是对目标光谱的滤波——与视锥细胞的响应曲线扮演着完全相同的角色。
RGB 颜色空间
在 RGB 颜色空间中,三种原色取单色光源,波长分别为:
- (红)
- (绿)
- (蓝)
由于使用了真实的单色光源作为原色,RGB 的匹配函数在某些波长范围内取负值——对应前面提到的需要将原色移到待测光一侧的情况。这意味着 RGB 颜色空间无法用全正坐标表示所有可感知颜色。
CIE XYZ 颜色空间
RGB 的匹配函数出现负值,意味着无法用全正坐标表示所有可感知颜色——这在工程和标准化上很不方便。为了解决这个问题,国际照明委员会(Commission Internationale de l'Éclairage, CIE)在 1931 年定义了 CIE XYZ 颜色空间。它选用三种「虚构」的原色(不对应任何真实光源),使得匹配函数 在所有可见光波长上都是非负的。其中 参数被特意设计为对应人眼的亮度(Luminance)感知。
XYZ 与 RGB 之间通过线性变换相互转换:
为了可视化,通常将三维 XYZ 投影到二维色度图(Chromaticity Diagram)上:
色度图中,所有可感知颜色构成一个马蹄形区域。光谱色(单一波长的纯色)位于边界上,内部是各种混合色。任意两种颜色的混合落在它们连线上——这是颜色混合的几何直觉。
均匀颜色空间
CIE XYZ 解决了负值问题,但带来了新的缺陷: 色度图中坐标差异不能反映感知差异。在 图上等距的两对颜色,一对可能看起来几乎一样,另一对却明显不同。换句话说,如果在 图上均匀采样颜色,在绿色区域你会觉得很多颜色看起来一样,而在蓝色区域变化则非常剧烈。
McAdam 椭圆实验(一组经典的颜色辨别实验)量化了这种不均匀性——在 色度图的各个位置放置椭圆,椭圆大小表示「刚好能分辨的颜色差异」(Just Noticeable Difference, JND),结果发现绿色区域的椭圆远大于蓝色区域。
为了缓解这个问题,CIE 引入了 色度图——通过 坐标的射影变换(Projective Transformation),使得 McAdam 椭圆在新坐标下更加均匀(接近圆形)。
HSV 颜色空间
前面的颜色空间都是「线性」或「均匀」导向的,但 RGB 值本身对人来说并不直观——给你一组 ,很难一眼想象出是什么颜色。HSV(Hue-Saturation-Value)用三个更符合直觉的维度来描述颜色:
- 色相(Hue):颜色的「种类」,如红、橙、黄、绿、蓝、紫,对应色环上的角度(红 = 0°,绿 = 120°,蓝 = 240°)
- 饱和度(Saturation):颜色的「纯度」,从灰色(S = 0)到完全饱和的纯色(S = 1)
- 明度(Value):颜色的「明暗」,从黑色(V = 0)到最亮(V = 1)
几何上,HSV 可以看作把 RGB 立方体竖起来(白色在上、黑色在下),从上方观察就是一个六角形的色环。HSV 在图像处理中非常有用——例如可以单独调整色相而不影响亮度,或者在特定色相范围内进行颜色分割(如提取画面中所有「绿色」区域)。
颜色恒常性
感知亮度 ≠ 光子数
一个常见的直觉是「感知到的亮度 ≈ 到达眼睛的光子数」,但这是错误的。人类视觉系统并不像光度计那样忠实地测量绝对光强——它所做的远比这复杂得多。
人眼对亮度的感知近似是对数关系而非线性关系:从 10 勒克斯增加到 20 勒克斯的感知变化,和从 100 勒克斯增加到 200 勒克斯的感知变化差不多。这就是 Weber-Fechner 定律的直觉——人眼感知的是相对变化(比例),而非绝对变化。此外,视觉系统还会主动进行复杂的「推断」:根据周围环境、阴影线索、材质先验来估计物体的本来颜色,而不是被动地报告光子数。这种推断机制引出了下面的核心话题。
颜色恒常性
颜色恒常性(Color Constancy)是人类视觉系统的一种关键能力:即使光照条件发生显著变化,我们仍然能感知到物体「本来」的颜色。一张白纸在日光下、在白炽灯下、在荧光灯下看起来反射的光谱完全不同,但我们始终把它感知为白色——视觉系统自动「补偿」了光照变化,提取出表面固有的反射特性。
蓝黑还是白金?
2015 年风靡网络的「The Dress」事件生动地展示了颜色恒常性的力量:同一张裙子照片,有人看到蓝黑色,有人看到白金色。这是因为大脑对照片中光照条件做出了不同的假设——如果假设光源偏蓝,就会「减去」蓝色分量,看到白金色;如果假设光源偏黄,就会「减去」黄色分量,看到蓝黑色。
另一个令人惊叹的例子是一张草莓蛋糕的照片——整张图片不包含任何红色像素(所有像素的 R 通道值都不是最大的),但大多数人仍然会把草莓看成红色。这是大脑基于周围色调(整体偏青色)自动进行颜色校正的结果。
视觉错觉与局部比较
颜色恒常性在很大程度上依赖于局部比较——我们感知一个区域的颜色时,不是孤立地看该区域的绝对色值,而是与周围区域进行对比。
同时对比(Simultaneous Contrast)是一个经典例子:两个物理上相同颜色的圆形色块,分别放在红色和暗黄色背景上,看起来颜色截然不同——红色背景上的显得暗淡,暗黄色背景上的显得鲜亮。这是因为视觉系统总是在做减法——它关注的是目标与背景之间的差异,而非绝对值。
棋盘阴影错觉(Checker Shadow Illusion)是另一个经典案例。在 Adelson 的棋盘图中,阴影中的浅色格子 B 与阴影外的深色格子 A 实际上具有完全相同的像素亮度值,但 B 看起来远比 A 亮得多。这是因为视觉系统能够区分两类亮度边界——「反射率边界」(不同材质之间的锐利边界)和「光照边界」(阴影造成的渐变边界),并在判断物体本身颜色时自动「忽略」光照变化。
白平衡
白平衡(White Balance)是数码相机中模拟人类颜色恒常性的机制。其目标是:无论实际光源的色温如何,让中性色(白色或灰色)的物体在照片中看起来也是中性色。
白平衡的基本思路是估计场景中光源的色温,然后对 RGB 三通道分别进行缩放,抵消光源的色偏。错误的白平衡会导致照片整体偏色——例如在白炽灯下如果相机仍按日光设置,照片就会偏橙。
白平衡的局限
当场景中存在多种色温不同的光源时(如室内灯光与窗外日光混合),白平衡变得困难——基于不同参考点(如室内的石墙 vs 窗外的月光)会产生不同的校正结果,不可能同时让所有区域颜色都「正确」。