FILMCVT · 番外一篇
胶片如何记住光
光子打在胶片上发生了什么?显影液对它们做了什么?橙色从哪来,为什么 1−x 减不掉它?——以及这一切的数学模型。
〇、先说清楚:光从哪来 ,又是什么
整篇文章里,光只走一条路:
光源 太阳 / 灯箱 发出白光
→
场景 物体反射 各自吸收一部分
→
胶片 感光层记录 (拍摄时)
→
眼睛 / 相机 看负片时,白光 从背后穿过胶片
注意最后一步:负片不发光,它只是挡在光路上的一片滤色片 。这是理解后面一切的前提。
而"白光"并不是一种颜色,是一整段波长的混合。棱镜能把它摊开,人眼的三种视锥细胞把这一整段粗略地归成三类响应——这就是 R、G、B 的由来:
380nm(紫)到 700nm(红)· 白光 = 全都在 · 人眼用三个通道去概括这条连续的曲线
于是有两种造颜色的方式。屏幕是加色 的:黑底上把红绿蓝加进去。胶片和颜料是减色 的:白光里把某些波长拿走,剩下的就是你看到的颜色。
白光穿过染料后剩下什么——点开关,从白光里"减掉"某段波长:
三种减色染料——青、品红、黄——正好各自负责拿走红、绿、蓝中的一种。彩色负片的三层,用的就是这三种染料。这不是巧合,是被"只能做减法"这件事决定的。
一、曝光:光子写进卤化银
彩色负片的感光层是明胶里悬浮的卤化银晶体 (主要是溴化银)。一颗光子被晶体吸收,会把一个电子激发到导带;电子游走到晶体的缺陷处被俘获,吸引一个银离子过来,中和成一个银原子。这个过程重复约 4 次 ,晶体上就形成一小簇银原子——潜影 。它小到看不见,但已经是一条被写下的记录。
AgBr + hν → e⁻ + Br· 光子把一个电子激发到导带
e⁻ 被晶格缺陷俘获;Ag⁺ + e⁻ → Ag⁰ 中和一个间隙银离子
n·Ag⁰ → Agₙ , n ≥ 4 攒够 ≈4 个银原子 = 潜影(Gurney–Mott, 1938)
一颗晶体吸收的光子数 N 服从泊松分布,均值 μ 正比于曝光量 H。它能否被"记住",是一个阈值事件:
\[ H \;=\; t\int E(\lambda)\,S(\lambda)\,\mathrm{d}\lambda \]
曝光量 = 光谱辐照 × 感光度曲线 × 时间
\[ N \sim \mathrm{Poisson}(\mu),\qquad \mu \propto H \]
\[ P(\text{latent}) \;=\; P(N\!\ge\!4) \;=\; 1 - e^{-\mu}\!\left(1+\mu+\tfrac{\mu^{2}}{2}+\tfrac{\mu^{3}}{6}\right) \]
一颗晶体被"记住"的概率——泊松阈值事件
这就是胶片颗粒感 的物理来源:图像本来就是一粒一粒、按概率记下的。
彩色胶片有三层这样的感光层,各自只对一段波长敏感。注意每层里有两样不同的东西 :显影前预埋的成色剂 (染料的原料,本身也带颜色),与显影后才生成的染料 ——切换看看:
显影前
显影后
蓝敏层
黄色滤层 挡住蓝光,保护下面两层(显影中被漂掉)
绿敏层
红敏层
片基 透明支撑
显影前的颜色来自未反应的成色剂;显影后由生成的染料主导。红敏层的成色剂偏红、染料却是青——两样不同的东西,别混为一谈。
二、C-41 显影:把几个原子放大 10⁹ 倍
显影液(C-41 用的显影剂叫 CD-4)会还原卤化银——但只有带潜影的晶体才被催化还原。几个银原子的潜影,触发整颗晶体上亿个银离子变成金属银:这是一次约 10⁹ 倍的化学放大 ,胶片的"感光度"正来自于此。
关键的一步在后面:显影剂被氧化后,会就地与感光层里预埋的成色剂 偶联,生成染料云。蓝敏层生成黄,绿敏层生成品红,红敏层生成青——每层生成的都是自己所感颜色的互补色 。随后漂白与定影把所有的银带走,胶片上只剩染料。
显影(只在有潜影的晶体上发生):
AgBr + Dev → Ag⁰ + Dev⁺ + Br⁻ Dev = CD-4,一种对苯二胺显影剂
偶联(氧化态显影剂就地变成染料):
Dev⁺ + 成色剂 → 染料 蓝敏层→黄 · 绿敏层→品红 · 红敏层→青
漂白(银变回可溶的银盐):
Ag⁰ + Fe³⁺·EDTA → Ag⁺ + Fe²⁺·EDTA
定影(银盐络合溶出,只剩染料):
AgBr + 2 S₂O₃²⁻ → [Ag(S₂O₃)₂]³⁻ + Br⁻
银去哪了 染料不是 银和什么东西反应生成的。银的作用是开关:有潜影的晶体才被还原,还原过程把显影剂 氧化成 Dev⁺,是 Dev⁺ 和层里预埋的成色剂 偶联成染料。最后漂白定影把银全部溶走——成片上一颗银都没有,只剩染料 。银负责的是"哪里该生成染料",不是"染料由什么做成"。
为什么记录红光的层,偏偏生成青色 染料?因为胶片是减色介质 :看负片时,是白光从背后穿过它,每一层只能从穿过的光里"减去"自己那一段波长。红敏层要把"这里有多少红光"写进胶片,唯一的表达方式就是按比例地吸收红光 ——而"只吸收红光的染料",按定义就是青色。假如它生成红色染料(吸的是绿和蓝),红光的信息反而被写进了别的通道。
这一步很反直觉,值得做一次反证 :假如红敏层用红色染料,会发生什么?
先说清两种染料的定义——颜色说的是"放行什么",实质是"吸收什么":
\[ \text{青} = \text{白} - \text{红}\;:\quad \text{吸 R},\ \text{放行 G, B} \qquad\qquad \text{红}\;:\quad \text{吸 G, B},\ \text{放行 R} \]
现在让场景里只有红光变化(绿蓝不变),看两种设计下三个通道的透过率各自怎么走:
场景红光 H_R
✓ 真实设计:红敏层 → 青染料
红光信息全部落在红通道,绿蓝纹丝不动——三个通道正交,可以各自反演。
✗ 假想设计:红敏层 → 红染料
红通道对红光几乎无响应;信息串进了绿蓝通道——红光被记在了别人名下。
右边那套设计并非"颜色不好看",而是信息编码错位 :想知道场景里有多少红光,得去看绿蓝通道;而绿蓝通道同时还背着自己那层的信息,两笔账混在一起,再也拆不开。三层都这么干,三个通道就彻底纠缠了。
一句话 减色介质里,染料是用「减去什么」来表达「记录了什么」的。要记红,就必须减红;而减红的颜色,就叫青。
把正确的那条链写成模型:
\[ H_R \xrightarrow{\;\text{expose + develop}\;} D_{\text{cyan}} = \gamma\log_{10}\!\frac{H_R}{H_0} \xrightarrow{\;\text{transmit}\;} T_R = 10^{-D_{\text{cyan}}} = \left(\frac{H_R}{H_0}\right)^{-\gamma} \]
T_R 是 H_R 的单调递减函数:拍到的红越多,透过的红越少。三个通道各来一遍——这就是"负片"的全部含义。
于是负片天然是"负"的。而且在有效曝光区间内:
\[ D_{\text{dye}} \;\propto\; m_{\mathrm{Ag}} \;\propto\; \log H \]
染料量 ∝ 显影出的银量 ∝ log(曝光量)——注意:是对数
三、橙色:一次模拟时代的预计算
理想的品红染料应该只吸收绿光。真实的品红染料做不到——它还会偷吸一部分蓝光 ;青色染料也一样,偷吸绿和蓝。偷吸的量跟着图像内容走:哪里品红多,哪里蓝光就被多偷一点。这种随图像变化的串扰,印相时没法用一片滤色镜纠正。
柯达在上世纪四十年代给出的解法(Hanson, 1950)漂亮得像一道数学题:把成色剂本身做成有颜色的 。品红成色剂未反应时是黄色的,青成色剂未反应时是偏红的。哪里生成了染料,哪里的成色剂就被消耗——于是:
这个抵消可以一行代数证完。设某处品红染料量为 M(x,y),最大可能生成量为 M_max:
染料偷吸的蓝光密度是 \( \alpha M(x,y) \)(随图像变化);剩余黄色成色剂的吸收被调配成同一系数:\( \alpha\,(M_{\max}-M(x,y)) \)。相加:
\[ \alpha M(x,y) \;+\; \alpha\left(M_{\max}-M(x,y)\right) \;=\; \alpha M_{\max} \;=\; \text{const} \quad\blacksquare \]
M(x,y) 消掉了——剩下一个与图像内容无关的常数
容易想歪的一步 成色剂的颜色不是染料的相反色,而是染料的缺陷色 。真实品红 = 理想品红 + 甩不掉的一点黄(偷吸蓝光=黄的行为),所以品红的成色剂被染成黄——让"多余的黄"在染料和剩余成色剂之间此消彼长,总量恒定。互补的是数量(M 与 M_max−M),不是颜色。青染料偷吸绿和蓝,相当于掺了一点偏红,所以青的成色剂偏红;黄染料在最上层、缺陷最轻,不需要带色——这就是为什么遮罩是黄+红=橙,而不是三色都有。
随图像变化的误差,被抵消成了一个全片均匀的常数吸收 。常数好办——印相时加一次固定滤色就行。所有剩余成色剂叠在一起,就是你看到的那层橙。
所以 橙色不是缺陷,而是一层刻意印上去的"校正矩阵"——在没有计算机的年代,用化学预先完成了一次颜色计算。
四、为什么 1−x 不是 真正的反相
把整条链写下来。设某通道的曝光量为 H,显影后的染料密度为 D,透过率为 T:
\[ D \;=\; D_0 + \gamma\,\log_{10}\!\frac{H}{H_0}, \qquad T \;=\; 10^{-D} \]
γ ≈ 0.6(C-41 负片的斜率);D₀ 里包含片基与橙色遮罩
\[ x \;\approx\; (I \cdot T)^{1/2.2} \]
相机记录:透过的光再经过一次 sRGB 编码
要从 T 回到场景亮度 L,正确的逆是把这条链倒着走:
\[ L \;\propto\; \left(\frac{T}{T_0}\right)^{-1/\gamma} \]
T₀ = 片基(含橙色遮罩)的透过率
这条式子可以验证:把 D 代进去,链条正好闭环——
\[ \frac{T}{T_0} = 10^{-(D-D_0)} = 10^{-\gamma \log_{10}(H/H_0)} = \left(\frac{H}{H_0}\right)^{-\gamma}
\;\;\Rightarrow\;\; \left(\frac{T}{T_0}\right)^{-1/\gamma} = \frac{H}{H_0} \;\propto\; L \quad\blacksquare \]
曝光量被原样解出来了
注意两件事。第一,橙色遮罩在这里是乘在 T 上的常数因子 ,正确的去除方式是除法 (在对数域是减法);第二,逆变换是指数 的,不是线性的。而 1−x 是一个仿射翻转:它既没有除掉那个乘法因子,也没有把对数翻回来。橙的补色是蓝,于是翻完得到一张发蓝、发灰、通道间纠缠的图。
但 1−x 也不是全无道理:sRGB 的 gamma 编码近似一条对数曲线,所以对编码值取补,粗略相当于在对数域做了密度翻转(对数域的补 = 线性域的除法)。这正是它"半对"的原因——也是 FilmCvt 里那个白平衡网络存在的意义:把 1−x 剩下的账(错误的斜率、没除干净的橙罩、通道串扰)一次算清 。
同一张负片,三种命运:
密度反演 = 除以片基透过率 → 取 −1/γ 次幂 → 每通道一个曝光系数(等价于印相时的滤色)。残余的偏色来自 γ 并非精确 0.6 与手机的图像处理——在 App 里,这笔尾账交给白平衡网络。
五、亲手做一次密度反演
下面是那张真实的负片。拖动 γ,试试开关"除以片基"和"每通道曝光",看颜色如何浮现:
γ 拖到 1.0 附近 ≈ 只做线性除法;拖小则对比越拉越开。关掉「除以片基」,橙罩立刻回来——它是乘法项,只有除法能请走它。
参考:Gurney & Mott, "The theory of the photolysis of silver bromide and the photographic latent image", Proc. R. Soc. 1938 ·
Hanson, "Color correction with colored couplers", J. Opt. Soc. Am. 1950 ·
Kodak C-41 process specifications ·
← 返回幻灯片《口袋里的暗房》