全光函数

普通照片只记录一个视点、一个时间段内落到传感器上的二维光分布。若要完整描述空间中的可见光,还需知道观察位置、观察方向、波长与时间。全光函数 Plenoptic Function 可写成

P(θ,ϕ,λ,t,Vx,Vy,Vz),P(\theta,\phi,\lambda,t,V_x,V_y,V_z),

共有七个维度:

  • (Vx,Vy,Vz)(V_x,V_y,V_z) 表示观察位置;
  • (θ,ϕ)(\theta,\phi) 表示光线方向;
  • λ\lambda 表示波长;
  • tt 表示时间。

固定观察位置和时间,再把光谱通过传感器响应压缩成 RGB,就得到普通彩色照片。保留时间可得到视频;保留位置和方向则能支持视点变化与重新聚焦。全光函数是描述框架,实际设备只能在有限维度、有限范围和有限分辨率上采样。

Plenoptic Function 同时记录位置、方向、波长与时间

图中每条光线除了落点,还带有观察位置、方向、波长和时间标签;普通照片只取其中一个视点和一段曝光的投影。保留的维度越多,可重建的视点、焦平面和时间变化越丰富,但采样量也会快速增加。

光场降维

在折射率均匀、没有界面,并且无吸收、无散射、无额外发光的自由空间中,辐亮度沿直线保持不变。同一条光线上的不同位置携带相同 LL,所以描述光线不需要再单独记录沿线位置。若途中存在折射界面,即使介质透明,光线方向也会改变,必须分段处理。忽略时间和波长后,得到四维 光场 Light Field

常用 Two-Plane Parameterization 取两张平行的平面。一条不与平面平行的光线分别交于

(s,t,0),(u,v,1),(s,t,0), \qquad (u,v,1),

于是可用四维函数

L(s,t,u,v)L(s,t,u,v)

记录这条光线的辐亮度。(s,t)(s,t)(u,v)(u,v) 都是交点坐标;在两平面间距固定为 1 时,方向与差分 (us,vt,1)(u-s,v-t,1) 平行,因此常把第一组理解为空间位置、把第二组连同第一组的差分理解为方向。也可以把一张平面看作相机阵列,另一张看作各相机的像平面。

两平面参数化用四个坐标唯一表示一条光线

两平面表示无法覆盖与参数平面平行的光线,实际系统只记录有限视场内的一束光线,因此这一限制通常可以接受。

重聚焦

光场保留了普通图像在孔径积分时丢掉的方向信息。为看清 数字重聚焦 Digital Refocusing 的几何原理,先考虑一维截面:一条光线在 z=0z=0z=1z=1 两平面的坐标分别为 s,us,u。直线在深度 z=dz=d 的坐标是

x(d)=(1d)s+du.x(d)=(1-d)s+du.

若希望聚焦在平面 z=dz=d 的位置 xx,就应收集所有满足

(1d)s+du=x(1-d)s+du=x

的光线并求平均。四维情况下,对 s,ts,tu,vu,v 分别应用同样关系。改变 dd 相当于在光场数据中改变积分切片的斜率,因此无需重新拍摄就能选择新的焦平面。

同一深度的场景点在不同子孔径视图中具有一致的视差关系,按正确斜率平移后会重合;其他深度无法重合,积分后变模糊。这给出了数字重聚焦的直观解释。

实际重聚焦就是按选定深度重新组合不同角度样本:把各子孔径图像按该深度对应的视差平移后求和或平均。改变组合斜率即可切换焦平面,不必重新采集光线。

光场相机

相机阵列从不同位置拍摄同一场景,可直接采样位置和方向。Integral Imaging光场相机 Light Field Camera 可在主镜头和传感器之间放置微透镜阵列:每个微透镜覆盖一小块传感器,并把主镜头孔径的不同区域成像到不同像素。

相机阵列从不同位置采样同一场景

图中阵列的相机间距提供了位置基线,同一物点在各视图中的位移就是可利用的视差。基线太小,深度变化不明显;基线太大则会带来遮挡和视图间空洞,因此相机阵列只能在采样范围内可靠合成视点。

传感器总像素数固定时,记录更多角度样本会减少可用于空间细节的样本。例如一个微透镜下使用 m×mm\times m 个像素记录方向,最终空间分辨率大约会在两个方向各降低 mm 倍。重聚焦、小范围视点变化与深度恢复依赖角度分辨率,清晰纹理依赖空间分辨率,两者需要直接权衡。

微透镜阵列把孔径角度映射到传感器像素

图中每个微透镜下的一组像素对应主镜头孔径的不同方向,横向位置记录空间样本,组内位置记录角度样本。增加组内像素会提高角度分辨率,却减少整幅图能容纳的空间采样,这正是光场相机的分辨率权衡。

光场不能随意合成远离原相机范围的新视点。遮挡后从未被任何采样光线看到的区域没有信息,过大的视点移动也会暴露采样稀疏和标定误差。

光谱

光的物理组成由 光谱功率分布 Spectral Power Distribution 表示。S(λ)S(\lambda) 描述不同波长上的功率,单一“白色”可以由许多不同光谱产生。物理光源的非负叠加满足线性关系:

S(λ)=aS1(λ)+bS2(λ).S(\lambda) = aS_1(\lambda)+bS_2(\lambda).

其中 a,b0a,b\ge0,并且可实现的 SPD 还应满足 S(λ)0S(\lambda)\ge0。颜色匹配方程中可以出现负系数,但它表示把某个原色移到等式另一侧,并不对应负的光谱功率。

材料反射会对入射光谱逐波长调制。若光源光谱为 E(λ)E(\lambda),光谱反射率为 ρ(λ)\rho(\lambda),在简化条件下离开表面的光谱与

L(λ)E(λ)ρ(λ)L(\lambda)\propto E(\lambda)\rho(\lambda)

成正比。因此,同一物体在日光、白炽灯和窄带 LED 下可能呈现不同颜色。

光谱功率分布 SPD 描述光源在各波长上的能量

图中不同光源的 SPD 形状可以完全不同,即使积分后的总能量相近;材料反射率会逐波长调制它们,最终颜色由两者的乘积共同决定。只保存一个 RGB 颜色无法恢复被丢掉的光谱结构。

三色视觉

视网膜中的杆状细胞对弱光敏感,主要参与暗视觉;锥状细胞负责明视觉和颜色。人眼有三类锥状细胞,其光谱敏感度通常记为 sL(λ)s_L(\lambda)sM(λ)s_M(\lambda)sS(λ)s_S(\lambda)

三色视觉 Tristimulus Theory 认为颜色感知主要由三类锥体响应决定。给定进入眼睛的光谱 S(λ)S(\lambda),响应近似为

ck=S(λ)sk(λ)dλ,k{L,M,S}.c_k= \int S(\lambda)s_k(\lambda)\,\mathrm d\lambda, \qquad k\in\{L,M,S\}.

无限维光谱经过三个线性积分后,只保留三个数。若两个不同光谱 S1,S2S_1,S_2 满足

[S1(λ)S2(λ)]sk(λ)dλ=0\int [S_1(\lambda)-S_2(\lambda)] s_k(\lambda)\,\mathrm d\lambda =0

对三类锥体都成立,人眼就无法仅凭颜色区分它们,这种现象称为 同色异谱 Metamerism。显示器用三种窄谱原色近似许多自然颜色,正是利用了这一性质。

不同光谱产生相同三刺激响应的同色异谱

图中两条 SPD 形状不同,却在 L、M、S 三条响应曲线下给出相同积分,因此标准观察者会把它们看成同一种颜色。它们的物理光谱并没有变成相同,换光源、换观察者或做光谱测量仍可能区分。

不同人的锥体比例和敏感度并不完全相同,观察条件也会改变视觉状态,所以颜色匹配建立在标准观察者和规定环境上。

L、M、S 三类锥体的重叠响应曲线

图中三条响应曲线覆盖范围相互重叠,同一波长通常会同时激发不同比例的 L、M、S 锥体。视觉系统感知的是三种积分响应,而不是把光谱中的每个波长分别保留下来。

颜色匹配

加色匹配 Additive Color Matching 用三种原色的线性组合匹配目标颜色。实验中,观察者调节三盏原色灯的强度,使混合光与某个单色测试光看起来一致:

C(λ)=r(λ)R+g(λ)G+b(λ)B.C(\lambda) = r(\lambda)R +g(\lambda)G +b(\lambda)B.

CIE RGB Color Matching Functions 记录标准观察者对各测试波长所需的三原色系数。某些波长无法由选定三原色的非负组合直接匹配,实验必须把一盏原色移到测试光一侧,相当于该系数为负。颜色匹配函数是心理物理匹配结果,不是三类锥体的生理响应曲线。

只要两组颜色在标准观察者下匹配,对它们做相同线性混合后仍会匹配。这种线性使颜色空间可以通过 3×33\times3 矩阵互相转换。

CIE RGB 中的负原色系数

图中某些单色测试光落在三原色非负组合的三角形之外,匹配实验只能把一盏原色移到测试光一侧,于是记录为负系数。负 primary 是颜色匹配方程中对实验摆放方式的代数记号,不对应物理上的负光强。

XYZ 空间

CIE XYZ 色彩空间 是对 CIE RGB 的线性变换,选择了便于计算的虚拟原色。三刺激值由颜色匹配函数积分得到:

X=S(λ)xˉ(λ)dλ,X=\int S(\lambda)\bar x(\lambda)\,\mathrm d\lambda,

Y=S(λ)yˉ(λ)dλ,Z=S(λ)zˉ(λ)dλ.Y=\int S(\lambda)\bar y(\lambda)\,\mathrm d\lambda, \qquad Z=\int S(\lambda)\bar z(\lambda)\,\mathrm d\lambda.

yˉ(λ)\bar y(\lambda) 被设计为与明视觉光效率函数一致,因此 YY 对应光度学中的 亮度 Luminance;它是按标准观察者加权的物理量,不等同于受适应、背景和观看条件影响的主观明度 Brightness。X,ZX,ZYY 共同决定色度。XYZ 的原色不是可实际发出的三束光,坐标的主要作用是建立设备无关的标准参照。

把整体强度归一化,得到 色度坐标 Chromaticity Coordinates

x=XX+Y+Z,y=YX+Y+Z,z=1xy.x=\frac{X}{X+Y+Z}, \qquad y=\frac{Y}{X+Y+Z}, \qquad z=1-x-y.

只需画出 (x,y)(x,y) 就能表示色度,YY 另行保存亮度。已知 (x,y,Y)(x,y,Y)y0y\ne0 时,

X=xYy,Z=(1xy)Yy.X=\frac{xY}{y}, \qquad Z=\frac{(1-x-y)Y}{y}.

CIE 色度图将亮度归一化,并用二维坐标表示可见色度

色度图外沿对应单色光,底部直线连接光谱两端的紫色。两种光按非负权重相加时,结果位于两点连线上;三原色可表示的 色域 Gamut 因此是三个原色色度点的凸包。真实设备还受最大亮度、黑位和通道非线性限制,二维三角形只描述色度范围。

色度图去掉了整体亮度;设备色域来自原色的非负线性组合,所以三原色设备只能覆盖图中的一个三角形区域。

sRGB

sRGB 规定了三个原色色度、D65 参考白点和传递函数,是网页与普通显示内容的常用空间。把 D65 白点归一化为 Y=1Y=1 时,其 XYZ 约为 (0.95047,1,1.08883)(0.95047,1,1.08883)。线性 sRGB 到 CIE XYZ 的常用矩阵为

(XYZ)=(0.41245640.35757610.18043750.21267290.71515220.07217500.01933390.11919200.9503041)(RlinGlinBlin).\begin{pmatrix}X\\Y\\Z\end{pmatrix} = \begin{pmatrix} 0.4124564&0.3575761&0.1804375\\ 0.2126729&0.7151522&0.0721750\\ 0.0193339&0.1191920&0.9503041 \end{pmatrix} \begin{pmatrix}R_{\mathrm{lin}}\\G_{\mathrm{lin}}\\B_{\mathrm{lin}}\end{pmatrix}.

反向变换为

(RlinGlinBlin)=(3.24045421.53713850.49853140.96926601.87601080.04155600.05564340.20402591.0572252)(XYZ).\begin{pmatrix}R_{\mathrm{lin}}\\G_{\mathrm{lin}}\\B_{\mathrm{lin}}\end{pmatrix} = \begin{pmatrix} 3.2404542&-1.5371385&-0.4985314\\ -0.9692660&1.8760108&0.0415560\\ 0.0556434&-0.2040259&1.0572252 \end{pmatrix} \begin{pmatrix}X\\Y\\Z\end{pmatrix}.

这些矩阵假设颜色与 XYZ 使用同一 D65 白点;白点不同时,应先做色适应变换。文件中存储的 sRGB 值还经过非线性编码。

对归一化线性通道 ClinC_{\mathrm{lin}},编码近似为

CsRGB={12.92Clin,Clin0.0031308,1.055Clin1/2.40.055,Clin>0.0031308.C_{\mathrm{sRGB}} = \begin{cases} 12.92C_{\mathrm{lin}}, &C_{\mathrm{lin}}\le0.0031308,\\ 1.055C_{\mathrm{lin}}^{1/2.4}-0.055, &C_{\mathrm{lin}}>0.0031308. \end{cases}

从文件读回时使用逆传递函数:

Clin={CsRGB12.92,CsRGB0.04045,(CsRGB+0.0551.055)2.4,CsRGB>0.04045.C_{\mathrm{lin}} = \begin{cases} \dfrac{C_{\mathrm{sRGB}}}{12.92}, &C_{\mathrm{sRGB}}\le0.04045,\\ \left(\dfrac{C_{\mathrm{sRGB}}+0.055}{1.055}\right)^{2.4}, &C_{\mathrm{sRGB}}>0.04045. \end{cases}

着色、滤波和光照叠加应在线性空间执行,再编码到 sRGB。若直接平均两个编码值,得到的物理亮度通常不等于两束光的平均。

完整的数据流应保持顺序:辐射传输和着色产生线性辐亮度,先转换为线性 RGB;HDR 数据再经过 exposure 和 tone mapping 压到显示范围,最后才执行 linear RGB 到 sRGB 的非线性编码。读取 sRGB 文件后则要先解码回线性空间再参与混合。调高曝光只能改变亮度,不能掩盖把 gamma 编码值直接相加或滤波造成的错误。

感知空间

HSV 用色相、饱和度和明度组织 RGB 立方体,便于选色,但欧氏距离不对应稳定的感知差异,在灰轴附近还存在色相不确定等问题。

CIELAB 以参考白点 (Xn,Yn,Zn)(X_n,Y_n,Z_n) 归一化 XYZ:

L=116f(Y/Yn)16,L^*=116f(Y/Y_n)-16,

a=500[f(X/Xn)f(Y/Yn)],a^*=500[f(X/X_n)-f(Y/Y_n)],

b=200[f(Y/Yn)f(Z/Zn)].b^*=200[f(Y/Y_n)-f(Z/Z_n)].

其中

f(q)={q1/3,q>δ3,q3δ2+429,qδ3,δ=629.f(q)= \begin{cases} q^{1/3},&q>\delta^3,\\ \frac{q}{3\delta^2}+\frac4{29},&q\le\delta^3, \end{cases} \qquad \delta=\frac6{29}.

LL^* 近似明度,aa^* 表示红—绿对立轴,bb^* 表示黄—蓝对立轴。分段函数在暗部保持有限斜率,也让两段连续。CIELAB 只是在规定观察条件下近似感知均匀,不能把所有相同距离都解释为完全相同的可见差异。

适应与对立

视觉系统会根据环境照明调整对白色和颜色的响应,这一生理与神经调节过程称为 色适应 Chromatic Adaptation。物体在不同色温光源下仍常被感知为近似同色,则称为 颜色恒常性 Color Constancy;它除了适应,还依赖背景、场景线索和对照明的推断。两者联系紧密,但含义并不相同。颜色值必须连同白点、亮度和观察环境解释。

对立色理论 Opponent Color Theory 用亮暗、红—绿、黄—蓝通道描述后续视觉编码,可解释负后像和某些颜色组合难以同时感知。CIELAB 的 a,ba^*,b^* 也借用了这种对立组织方式。

颜色与明度的上下文错觉

图中相同的灰色或色块放在不同背景上会被感知为不同明暗和色相,说明视觉判断依赖周围的对比关系,而不是只读取该像素的数值。做颜色校正和材质评估时,应同时记录白点、亮度和观察环境。

减色系统

显示器通过发光做加色混合,印刷则用颜料吸收光谱做 减色混合 Subtractive Color Mixing。CMY 分别主要吸收红、绿、蓝,理论上三者叠加可得到黑色;实际油墨不理想,因此另加黑色通道 KK,形成 CMYK

减色过程涉及纸张、油墨光谱、网点覆盖与多次散射,不能仅靠 C=1RC=1-RM=1GM=1-GY=1BY=1-B 精确转换。印刷工作流需要设备特性文件、总墨量限制和色域映射,把超出打印色域的颜色压回可实现范围。