mybreathtaking

文章 › 身边的物理

手机是怎么拍下一张照片的?

· Read in English

前面《无线电是怎么把声音和数据送到你手机里的?》里说:「光和无线电都是一份一份地传递能量的,每一份叫一个『光子』。」手机的摄像头,做的正是一件和光子有关的事:它在一个一个地数光子。

先猜一猜

常听到的说法有:「手机的摄像头和眼睛一样,直接就能看见颜色」;「像素越多,照片就越清楚」。

都不全对。摄像头里的芯片根本分不出颜色,照片里的颜色是算出来的。照片清不清楚,很多时候也不看像素有多少,而看每个像素收到了多少个光子。

拍照,就是数光子

手机摄像头的核心,是一块指甲盖大小的硅芯片,上面排着几千万个「小桶」,每个桶叫一个像素,宽只有 1 微米左右(千分之一毫米)。光子打进硅里,就可能把一个电子从原子身边打出来,掉进桶里。曝光结束,数一数每个桶里有多少个电子,就知道那里有多亮。这就是光电效应:爱因斯坦 1905 年用「光是一份一份的」解释了它,后来因此得了诺贝尔奖。

可不是什么光子都打得出电子。硅里的电子,要拿到至少 1.12 电子伏的能量才挣得脱,这是硅的「门槛」。

一个光子有多少能量?硅里的电子要 1.12 电子伏才打得出来。上:从无线电到可见光,一个光子的能量(对数刻度)。下:放大看 300 到 1200 纳米:眼睛只看得见 380 到 750 纳米,硅一直看到 1100 纳米。

可见光的一个光子有 1.6 到 3.3 电子伏,都跨得过门槛。手机信号、微波炉的光子,只有十万分之一电子伏左右,再多也打不出一个电子,所以相机拍不到无线电波。门槛 1.12 电子伏,对应的波长约 1100 纳米,比眼睛能看到的红光(750 纳米左右)还要长。

《眼睛只会「数到三」:我们是怎么看见颜色的?》里说:「电视遥控器用的是 940 纳米左右的红外光,三种视锥都毫无反应,所以按遥控器时,我们什么也看不见。」可 940 纳米的光子有 1.32 电子伏,跨得过硅的门槛:用手机的摄像头对着遥控器,按住一个键,屏幕上就能看到它在一闪一闪。手机的摄像头前一般有一片挡红外的滤片,各个摄像头挡得多少不一样,所以前后摄像头看到的亮度可能不同,不妨都试试。

一个一个攒出来的照片

光子落到哪个像素,什么时候落,都是随机的。哪怕光照得很均匀,这个像素数到 103 个,旁边那个可能就只数到 95 个。

一张照片,是一个一个光子攒出来的(模拟)。左:随着曝光,每个像素收到的光子越来越多,照片从几个零星的亮点,慢慢变得清楚。右:平均每个像素收到 N 个光子,随机起伏约等于 N 的平方根;光子越多,起伏占的比例越小。

这种随机,有一个很简单的规律:平均收到 NN 个光子,多多少少会差上大约 N\sqrt{N} 个。收到 100 个,差 10 个左右,就是 10%,照片上就是明显的颗粒;收到 1 万个,差 100 个左右,只有 1%,就看不出来了。这叫「散粒噪声」,它不是芯片做得不好,而是光本身就是一颗一颗的。

芯片分不出颜色

硅只管数电子,红光子、蓝光子打出来的电子一模一样。那颜色是从哪来的?

办法是在每个像素上,盖一块很小的滤色片,只让红、绿、蓝三种光中的一种通过。最常见的排法,是 1976 年柯达公司的拜耳(Bryce Bayer)发明的:每 4 个像素里,2 个绿、1 个红、1 个蓝。绿的多一倍,是因为眼睛对绿光最敏感,图像里的明暗细节,主要靠绿色来看。这和眼睛用三种视锥看颜色,是同一个道理。

芯片分不出颜色:每个像素上盖一块红、绿或蓝的小滤片(模拟)。最左边是图 1 里的同一个卡通人像,只是把衬衫换成了白蓝细条纹;红框处放大,就是 ①:背景、脖子的边和衬衫。② 每个像素只记下一种颜色。③ 用周围同色像素的平均,把缺的两种颜色「猜」回来。

这样,每个像素只知道三种颜色中的一种,另外两种要从邻居那里「猜」回来。大片的颜色猜得很准;可要是条纹细得和像素差不多大,就会猜错,冒出本来没有的彩色花纹。拍电脑屏幕、细格子衬衫时,常会看到这种花纹。今天的手机用的猜法比图里聪明得多,可原理是一样的。

光线越暗,颗粒越粗

颗粒来自光子太少。光线越暗,同样的时间里落进每个像素的光子就越少,颗粒也就越明显。拿同一部手机,在三种光线下拍同一个人,算一算每个像素能收到多少光子:

同一部手机,同一个人:光线越暗,颗粒越粗(模拟)。按每种光线下脸上的亮度、手机的曝光时间、像素的大小,算出每个像素收到多少个光子,再按泊松分布随机生成。

照到脸上的光有多亮,用「勒克斯」来量,它是照度的单位:一支蜡烛在 1 米外照出的亮度,约 1 勒克斯;晴天的室外,有几万到十万勒克斯。白天站在窗边,脸上约 1000 勒克斯,曝光 1/120 秒,脸上的每个像素能收到约 1160 个光子,起伏只有 3%。晚上在客厅的灯下,约 100 勒克斯,曝光 1/30 秒,收到约 460 个,起伏 5%。只开一盏小夜灯,约 3 勒克斯,曝光 1/15 秒,只收到 28 个左右,起伏将近 20%,满脸都是颗粒。

手机遇到这种情况,有两个办法。一是曝光更久,可手一抖,照片就糊了。二是连拍很多张叠在一起,这就是「夜景模式」:每张都只有几十个光子,叠上十几张,光子就多了十几倍。至于手机的「降噪」,是把颗粒抹平,同时也会抹掉一些细节,脸看起来就像涂了蜡。说到底,最好的办法还是:光多一点。

这也说明了,为什么「像素越多,照片就越清楚」不一定对:芯片就那么大,像素做得越多,每个就越小,收到的光子越少,单看每个像素,颗粒反而更粗。

光从哪里来

光多了,颗粒就细;可照片好不好看,还要看光从哪里来。光从哪里来,影子就落在哪里:

光从哪里来:灯在侧面,还是窗在前面?(计算)用一个球代表头,背后 25 厘米是一面墙,按朗伯余弦定律逐点计算每一点收到的光,并考虑哪些光被球挡住。左:一盏小台灯在左前方,球的右半边很暗,墙上落下一块边缘清楚的影子。右:一扇 1.6 米宽的窗在正前方,影子又浅又柔。

一盏小灯,光几乎只从一个方向来,被挡住的地方就全黑,影子的边也很硬。一扇大窗,光从一大片方向照过来,一处被挡住了,别处的光还能照到,影子就又浅又柔。同样的道理,人离墙远一点,背后墙上的影子就更淡。

所以拍人像,最好站在窗边、面朝窗户:白天窗边的光比晚上的灯光多十倍左右,光子多,颗粒细;窗又大,影子浅。闪光灯正好相反:它是一盏小灯,影子硬;又紧挨着镜头,光照进眼睛,被眼底布满血管的视网膜反射回镜头,就拍出了「红眼」。

拍证件照也是这样,而且证件照要求脸上和背景上都没有阴影。我之前做过一个小工具 SmartIDPhoto,在窗边用手机拍一张,上传后就能很快做成证件照,并生成可以直接打印的版面。不过,软件变不出没有收到的光子,第一步还是在好光线下拍。

一句话:拍照就是数光子。光子一颗一颗随机落下,数到 NN 个,就差上约 N\sqrt{N} 个,所以光越暗,照片的颗粒越粗;芯片分不出颜色,颜色是盖上红绿蓝滤片以后「猜」出来的。想拍得好,就让光多一点、柔一点。

我们怎么知道

  • 自己看看手机看得见的红外光:用手机的前置摄像头对着电视遥控器,按住一个键,看屏幕上的灯是不是在闪。再用后置摄像头试一试,比一比。
  • 自己看看散粒噪声:在很暗的屋子里拍一张照片,再放大看:一粒一粒的颗粒,就是光子太少留下的。打开灯再拍一张同样的,颗粒就少了。
  • 一段历史:1969 年,美国贝尔实验室的博伊尔(Willard Boyle)和史密斯(George Smith)发明了电荷耦合器件(CCD),第一次让一块芯片一行行地把像素里的电子「传」出来读数,2009 年因此获得诺贝尔物理学奖。今天的手机用的是另一种芯片(CMOS),每个像素都有自己的放大电路,可以直接读数,可「数光子打出的电子」这件事没有变。

还不知道什么

人的眼睛,能不能看见一个光子?眼睛里的视杆细胞,确实会被单个光子激发。2016 年,一项实验让人在暗处猜「刚才有没有来一个光子」,猜对的比例约 51.6%,比瞎猜的 50% 高一点点,而且统计上很可靠。可是,人到底能不能清楚地「感觉」到一个光子,科学家还在争论。另一边,工程师在做能分辨每一个光子的「单光子相机」,想在极暗的地方也拍出照片。

进阶:公式、模拟和数据

光子的能量。E=hc/λE = hc/\lambda,即 EE(电子伏)≈1239.84/λ\approx 1239.84 / \lambda(纳米)。380 纳米 3.26 电子伏,530 纳米 2.34,650 纳米 1.91,750 纳米 1.65,940 纳米 1.32,1107 纳米 1.12(硅在室温下的带隙)。100 MHz 的调频广播 4.1×10−74.1 \times 10^{-7} 电子伏,2.45 GHz 的微波炉 1.0×10−51.0 \times 10^{-5} 电子伏;10 微米的红外光 0.124 电子伏。

散粒噪声。像素收到的光子数服从泊松分布:平均 NN,标准差 N\sqrt{N},相对起伏 1/N1/\sqrt{N}。图 1 中,每一帧在上一帧的基础上,再给每个像素加上按泊松分布抽取的新光子,平均数从每个像素 0.01 个增加到 1 万个。真实的芯片还有读出噪声(每次读数约 1 到几个电子)和暗电流,在极暗时才明显;图 1、图 4 只算了散粒噪声。

一个像素收到多少光子。勒克斯是每平方米 1 流明。1 勒克斯的 D65 日光(380 到 780 纳米),每秒每平方米约 1.39×10161.39 \times 10^{16} 个光子(用 CIE 1931 的明视觉函数和 683 流明每瓦算出)。芯片上的照度 E芯片=E脸RT/(4F2)E_{\text{芯片}} = E_{\text{脸}} \, R \, T / (4 F^2):RR 是脸的反射率,取 0.35;TT 是镜头的透过率,取 0.9;FF 是光圈数,取 1.8。每个像素收到的光子数再乘以像素面积(1.4 微米见方)、曝光时间、量子效率(0.6)和滤色片的透过份额(0.35)。图 4 的三种情况:1000 勒克斯、1/120 秒,约 1160 个;100 勒克斯、1/30 秒,约 460 个;3 勒克斯、1/15 秒,约 28 个。这些参数只是典型值,不同手机差别很大,照度也只是大致的数量级。

拜耳阵列和猜颜色。排列为每 2×2 个像素「红绿 / 绿蓝」(Bayer,美国专利 3,971,065,1976 年)。图 3 的人像和图 1 是同一个,只是衬衫换成了细条纹;用的是最简单的双线性插值:绿色用上下左右 4 个邻居的平均,红色和蓝色用周围 2 个或 4 个同色像素的平均。衬衫条纹的间距约 2.3 个像素,接近芯片能分辨的极限(2 个像素),所以产生了伪彩色。

打光。朗伯余弦定律:一个小光源在某一点产生的照度 E=Icos⁡θ/d2E = I \cos\theta / d^2,θ\theta 是光线和表面法线的夹角,dd 是距离。图 5 把光源分成 500 个小块逐一相加,并判断从每一点看出去,那一块光源是不是被球挡住了;另外加了一点均匀的环境光,代表房间墙壁反射回来的光。球的半径代表 12 厘米,墙在球后面 25 厘米;台灯约 10 厘米大,在 1.5 米外;窗 1.6 米 × 1.4 米,在 1.8 米外。

其他。光电效应:爱因斯坦,1905 年;1921 年诺贝尔物理学奖。CCD:博伊尔和史密斯,1969 年;2009 年诺贝尔物理学奖。单光子实验:Tinsley 等,《自然·通讯》7 卷 12172 页,2016 年。