成像

图像有两种来源。渲染是合成 Synthesis:场景、几何和光照由数据描述,光栅化或光线追踪计算每个像素。相机是捕捉 Capture:真实世界中已经存在的光经过成像系统,被记录成照片。二者都要回答同一个问题:哪些光线被保留,哪些光线被积分掉。

普通相机包含光圈、透镜、快门和传感器。关于辐亮度与辐照度,传感器上的一个像素记录的是到达该点的总辐照度,而不是带有来向信息的单条辐亮度。如果把感光元件不加镜头地放在物体前面,每个位置都会收到来自物体许多方向的光,方向被相加后,各位置读数会很接近,结果就是一片模糊。

光圈限制光束的横向范围,透镜把来自某个深度的光重新汇聚到传感器,快门控制积分时间,传感器把光转换为电信号。现实相机的镜头由多片透镜组成,但相机模型可以先把它们压缩成一个薄透镜。小孔成像是理解方向选择的极限:孔径越小,单个传感器位置接收的方向越单一,通光量按孔面积下降;孔径过大时会丢失空间分辨率。

没有方向选择时的传感器

人物不同位置发出的光可以落到感光平面的同一个位置,平面上不同位置也接收混合来向。把所有方向相加后,读数失去物点对应关系;小孔和透镜分别通过限制或重新汇聚光束建立这种对应。

针孔只允许一小束方向明确的光通过。物体上的每一点发出的光穿过针孔后,在另一侧形成倒立像;孔太大时,一个物点会覆盖多个传感器位置,孔太小时通光量极低并最终受到衍射限制。理想几何针孔没有离焦带来的景深变化;实际小孔仍受孔径大小和衍射限制,不能获得无限分辨率。

针孔与透镜成像对照

上排光线只经过小孔,物点在另一侧形成倒立像;下排透镜让经过不同孔径位置的光汇聚到对应像点,可以在保留成像关系时增加通光量。左侧实拍对比还显示,小孔照片并不自动拥有更高分辨率。

传感器与胶片都是感光记录介质:它们负责把到达的光量转换并保留下来。数字图像文件的编码、量化和压缩属于记录之后的输出步骤,不能把胶片说成数字输出格式。计算摄影还研究更丰富的成像方式,例如 transient imaging 在极短时间尺度记录光在空间中的传播过程,这属于 computational photography 的方向,本篇只把普通相机作为基础模型。

视场

视场角 Field of View,FOV 描述相机能够看到的角度范围。传感器在某一方向的尺寸为 hh、针孔到传感器的距离为 ff 时,相似三角形给出

FOV=2arctan⁡h2f.\mathrm{FOV}=2\arctan\frac{h}{2f}.

固定传感器时,焦距越短,视场越宽;焦距越长,视场越窄。配图只改变焦距,左侧的 17 mm 视场最宽,1000 mm 最窄;传感器尺寸保持不变。

固定传感器尺寸时,焦距改变视场角

更换传感器尺寸也会改变视场。为了让不同画幅的焦距数值可以比较,摄影通常以 35 mm 画幅为基准。手机标注的 28 mm 往往是等效焦距,而不是机身内部真的放入了 28 mm 的光学长度。若传感器宽度为 wsensorw_{\text{sensor}},一种水平等效焦距写法是

feq=freal36 mmwsensor.f_{\text{eq}}=f_{\text{real}}\frac{36\ \mathrm{mm}}{w_{\text{sensor}}}.

透视主要由相机位置决定;换焦距而保持相机位置不动,首先改变的是视场和构图。

视场公式来自把传感器高度 hh 对半分:半视角的正切是 (h/2)/f(h/2)/f,取反正切再乘 2 得到完整视场。水平、垂直和对角视场分别应使用对应方向的传感器尺寸;有限物距时传感器到透镜的像距未必等于焦距,严格计算应使用实际像距和入瞳位置。

曝光

快门打开期间,传感器积累辐照度。一般形式是

H=∫t0t0+TE(t) dt,H=\int_{t_0}^{t_0+T}E(t)\,\mathrm dt,

当辐照度在曝光期间近似恒定时,才可写成 H=TEH=TE。HH 是曝光量,EE 是传感器平面的辐照度,TT 是曝光时间。光圈改变单位时间的进光量,快门改变积分时间,ISO 改变传感器信号或输出标度而不增加实际光子数。

光圈扩大时进光量增加,景深 Depth of Field,DOF,即可以接受为清晰的一段物距范围,通常变窄;快门越长,接收能量越多,但运动模糊越明显;ISO 放大已有信号,也会放大暗部噪声。ISO 100 与 ISO 12800 的对比图中,后者暗部颗粒和彩色噪声明显增加。

ISO 增益放大信号也放大噪声

镜头有效孔径直径为 DD、焦距为 ff 时,f-number 定义为

N=fD.N=\frac fD.

理想像面照度近似满足

E∝D2f2=1N2.E\propto\frac{D^2}{f^2}=\frac1{N^2}.

从 f/4 换到 f/8 时孔径直径减半,面积变成四分之一,若要维持相近曝光量,曝光时间需增加四倍,例如从 1/601/60 秒变为 1/151/15 秒。两张照片的亮度可以接近,但景深和运动模糊不会相同。

标准整档 f-number 近似为 1,2,2,22,4,…1,\sqrt2,2,2\sqrt2,4,\ldots,相邻两档的孔径面积相差一倍。f-number 不能只写成孔径直径的倒数,因为不同焦距的镜头在同一孔径下的像面照度不同;N=f/DN=f/D 才提供了可比较的量。实际有效孔径使用入瞳 Entrance Pupil 的直径,即从物体一侧透过前方镜片看到的光圈像,可能与机械开口不同。

ISO 可以在传感器读出之前使用模拟增益,也可以在数字信号中乘一个比例。两种实现对读出噪声的放大位置不同,但都不会增加曝光期间到达传感器的光子数。为了保持输出亮度,可以在光圈、快门和 ISO 之间调整设置;只有光圈和快门直接改变实际曝光量 HH,ISO 的补偿不能消除低曝光带来的光子噪声。

快门与运动模糊

机械快门从关闭、打开到再次遮住传感器,需要有限运动时间;单反的反光镜抬起也不等于已经开始曝光。不同位置打开的时刻可能不同。先用全局快门 Global Shutter 理想化为全部像素共享同一曝光区间,归一化的时间平均为

I(x)=1T∫t0t0+TL(x,t) dt.I(\mathbf x)=\frac1T\int_{t_0}^{t_0+T}L(\mathbf x,t)\,\mathrm dt.

曝光期间物体从一个位置移动到另一个位置,传感器把中间所有位置的光平均起来,因此物体出现拖影。物体速度越大或快门时间越长,模糊越明显。运动模糊也具有抗锯齿作用:它是在时间维度上对连续运动进行积分。

快门时间决定运动轨迹在传感器上的积分长度

滚动快门 Rolling Shutter 按行或区域依次曝光,不同行对应不同起始时刻。高速旋转的螺旋桨或快速转动的相机因此会出现倾斜、弯曲和扭曲。高速摄影用极短快门冻结运动,通常需要大光圈或较高 ISO;长曝光摄影则利用运动模糊形成流水、车灯和星轨的连续轨迹。

全局快门的时间平均可以写成

I(x,y)=1T∫t0t0+TL(x,y,t) dt,I(x,y)=\frac1T\int_{t_0}^{t_0+T}L(x,y,t)\,\mathrm dt,

滚动快门则让每一行拥有自己的起始时刻:

I(x,y)=1T∫t0(y)t0(y)+TL(x,y,t) dt.I(x,y)=\frac1T\int_{t_0(y)}^{t_0(y)+T}L(x,y,t)\,\mathrm dt.

两者在静止场景中等价,运动场景中会因为不同行记录不同时间而产生几何扭曲。

运动模糊并非总是缺陷。赛车和高速摄影常故意保留拖影来表达速度;高速摄影用很短的 TT 冻结运动,长曝光则让流水、车灯和星轨形成连续轨迹。将一张静止图像统一做二维卷积不能正确处理运动中的遮挡、反射变化和非线性轨迹,渲染时应在快门时间区间内采样场景状态。

薄透镜

真实镜头由多片曲面透镜组成,用来修正球差、色差和畸变。薄透镜近似忽略厚度和像差,假设平行光经过透镜后通过焦点,经过焦点的光反向传播后变成平行光,通过光心的光线近似不偏折。

物距为 zoz_o、像距为 ziz_i、焦距为 ff 时,利用两组相似三角形可以推得

1f=1zo+1zi.\frac1f=\frac1{z_o}+\frac1{z_i}.

一组相似三角形来自通过光心的光线:

hiho=−zizo.\frac{h_i}{h_o}=-\frac{z_i}{z_o}.

另一组来自平行于光轴、折射后经过焦点的光线:

hiho=−zi−ff.\frac{h_i}{h_o}=-\frac{z_i-f}{f}.

消去高度比,得到 zozi=f(zo+zi)z_oz_i=f(z_o+z_i),再除以 fzozifz_oz_i 得到 Gaussian Lens Equation。负号表示真实像倒立。焦距是透镜属性,实际成像位置则由焦距和物距共同决定;对焦就是让传感器与该成像位置重合。

若把通过光心的光线与平行光线分别画出,左侧相似三角形给出物高/物距关系,右侧相似三角形给出像高/焦距关系。两式共享同一个放大率,消去高度后才得到透镜公式;因此像距、物距和焦距的符号约定必须在整篇中保持一致。本文采用真实物体、真实倒立像和实焦距均取正值的约定。

由共轭关系还可得到 Newton 形式:

(zo−f)(zi−f)=f2.(z_o-f)(z_i-f)=f^2.

若 x=zo−fx=z_o-f、x′=zi−fx'=z_i-f,则 xx′=f2xx'=f^2,即物、像距改为从各自焦点测量后,乘积为 f2f^2。两个焦点本身并不互相成像;物体位于物方焦点时,出射光平行,像在无穷远。焦点的几何定义是平行光经过它,或经过它的光反向传播后变成平行光;它不等于任意物体的实际成像位置。

薄透镜光路中的物距、像距、焦距与相似三角形

景深

传感器固定在某个像距时,只有一个物平面能精确成像。其他深度的点在传感器前后会聚,传感器截取的是一个圆,称为弥散圆 Circle of Confusion,CoC。若理想像面为 zi′z_i'、传感器位置为 ziz_i、孔径直径为 DD,相似三角形给出

CD=∣zi−zi′zi′∣,C=D∣zi−zi′zi′∣.\frac C D=\left|\frac{z_i-z_i'}{z_i'}\right|, \qquad C=D\left|\frac{z_i-z_i'}{z_i'}\right|.

代入 D=f/ND=f/N:

C=fN∣zi−zi′zi′∣.C=\frac fN\left|\frac{z_i-z_i'}{z_i'}\right|.

光锥在传感器上截出弥散圆

黑色 Image Plane 是该物点本应汇聚的像面,蓝色 Sensor Plane 是固定传感器。光锥在蓝线处还没有收缩成点,于是截出直径 C。图中 A 标记孔径直径,对应正文 D;光锥相似三角形给出 C/D 与离焦距离、理想像距之比。

孔径越大(NN 越小),同样的离焦量产生越大的弥散圆。若允许弥散圆不超过 Cmax⁡C_{\max},人眼会把对应的一段物方距离都看作清晰,这段范围就是景深。景深不是“所有点都精确对焦”,而是由输出尺寸、观看距离和可接受模糊阈值定义的范围。

把这个关系改写成物方距离,可以完整得到景深边界。相机对焦在物距 dsd_s,由薄透镜方程,传感器位于

vs=fdsds−f.v_s=\frac{fd_s}{d_s-f}.

另一个物点的物距为 d>fd>f 时,其理想像距为

v(d)=fdd−f.v(d)=\frac{fd}{d-f}.

将 zi=vsz_i=v_s、zi′=v(d)z_i'=v(d) 和 D=f/ND=f/N 代入 CoC 关系,先得到

C(d)=fN∣vs−v(d)v(d)∣,C(d)=\frac fN\left|\frac{v_s-v(d)}{v(d)}\right|,

再把分式化简为

C(d)=f2N∣d−ds∣d(ds−f).C(d)=\frac{f^2}{N}\frac{|d-d_s|}{d(d_s-f)}.

对焦位置使 C(ds)=0C(d_s)=0;同样的物距偏移在近处产生更大的弥散圆,因为分母含有物距 dd。令 C(d)=Cmax⁡C(d)=C_{\max},在近界 dN<dsd_N<d_s 处去掉绝对值得

NCmax⁡dN(ds−f)=f2(ds−dN),NC_{\max}d_N(d_s-f)=f^2(d_s-d_N),

移项得到

dN=dsf2f2+NCmax⁡(ds−f).d_N=\frac{d_sf^2}{f^2+NC_{\max}(d_s-f)}.

在远界 dF>dsd_F>d_s 处,

NCmax⁡dF(ds−f)=f2(dF−ds),NC_{\max}d_F(d_s-f)=f^2(d_F-d_s),

因此

dF=dsf2f2−NCmax⁡(ds−f).d_F=\frac{d_sf^2}{f^2-NC_{\max}(d_s-f)}.

远界分母为零时,景深延伸到无穷远;分母为负时也不能把负值当成真实距离,应同样解释为无穷远。令该分母为零得到超焦距

H=f+f2NCmax⁡.H=f+\frac{f^2}{NC_{\max}}.

当 ds=Hd_s=H 时近界为 H/2H/2。这只是“弥散圆不超过阈值”的可接受清晰范围,并不意味着整段距离都精确聚焦。

允许弥散圆的阈值可以用像素尺寸帮助理解:若模糊斑不超过一个像素,输出中可能无法分辨它和点像的差异。阈值不是物理常数,而取决于最终输出尺寸、观看距离和观察者的清晰度标准。对焦距离两侧的景深一般不对称,近界更靠近相机,原因正是 C(d)C(d) 的分母包含物距 dd。

小光圈使景深增大,大光圈使焦外模糊增大;短焦距通常给出更深景深,但比较不同焦距时必须说明是否保持构图、相机位置和观看条件不变。

改变焦点时前后景清晰区域的切换

交互示意展示了焦距、f-number、物距和允许弥散圆如何共同影响景深;它适合用来说明参数关系,不应替代上面的 CoC 几何推导。

薄透镜景深与弥散圆的关系

透镜采样

薄透镜相机的光线生成可以按四步实现:

  1. 在像素覆盖区域中采样传感器点 x′\mathbf x';
  2. 从针孔中心穿过 x′\mathbf x',求它与选定焦平面的交点 pf\mathbf p_f;
  3. 在透镜孔径圆盘上采样点 pl\mathbf p_l;
  4. 从 pl\mathbf p_l 指向 pf\mathbf p_f 发射相机光线。

透镜孔径采样与焦平面

对固定的传感器采样点,经过透镜不同位置的虚线在选定 Subject Plane 上对应同一点。焦平面之外的兔子并不共享这个交点,所以多个孔径样本会在其他深度形成模糊。生成光线时应先找到焦平面点,再由孔径采样点朝它发射。

固定一个像素内采样位置时,不同孔径样本生成的光线在焦平面交于同一点,焦外交点随孔径样本变化,平均后形成散焦。圆盘半径为 RR 时要做均匀面积采样,令 ξ1,ξ2∼U[0,1)\xi_1,\xi_2\sim U[0,1):

r=Rξ1,θ=2πξ2.r=R\sqrt{\xi_1},\qquad \theta=2\pi\xi_2.

平方根来自圆盘面积累积分布 r2/R2r^2/R^2。直接令 r=Rξ1r=R\xi_1 会使样本过度集中在中心,破坏孔径积分的权重。针孔相机每个像素只有一个原点,薄透镜相机同时对像素面积和孔径面积积分,有限样本会让散景出现噪声,需要增加样本或使用分层采样。

光线方向的坐标约定要和传感器平面一致。若使用真实传感器平面,传感器到透镜再到场景的方向需要反向延长;若使用相机前方的虚拟像平面,则可直接朝场景发射。像素面积采样和孔径面积采样都属于蒙特卡罗积分,应在估计中使用相应的 PDF。孔径采样越充分,焦外散焦斑的亮度分布越接近真实透镜。

真实传感器在透镜后方,反向追踪应从传感器朝透镜延长到物方焦平面;虚拟前像平面则采用对应的前向约定:

1
2
3
4
5
6
GenerateThinLensRay(pixel):
s = 在真实传感器像素面积内采样一点
d = normalize(lensCenter - s)
focusPoint = 从 lensCenter 沿 d 的射线与物方焦平面的交点
lensPoint = 在入瞳圆盘中均匀按面积采样
返回 Ray(lensPoint, normalize(focusPoint - lensPoint))