# 光子到电子到数字 光从各种光源发出来,经过遥远的距离,再经过镜头或者人眼的折射,落在传感器或者视网膜上。人眼和摄像头目的都是一样的:测量来自这束光的亮度。尤其是摄像头,它会把光的亮度转化成数字,而显示器再把数字再转化回亮度,这我们就能在屏幕上见到摄像头拍到的画面了。 有一个基本的物理事实:一束光,并不是“连续”的。我们知道光子的概念,光的能量是一份一份传播的,而相机也是对落在上面的光子进行计数。对于老式的胶片相机,光子会导致银盐颗粒发生分解,然后通过各种化学反应变成颜色的深度。现在大家常用的CCD、CMOS相机,传感器是由半导体组成的,光子落在上面会激发出电子,从而将光子数变成了更容易测量的电子数。然后经过放大、模数转换,就变成了可以传输和储存的数字。 在这个过程中,总会产生一部分噪声。所谓噪声,就是测量结果相对原始值的偏离,而尽可能降低噪声,才可以得到高质量的画面。有个概念就是信噪比,顾名思义,信噪比就是信号/噪声。只要尽力降低噪声,信噪比就越高,测量结果就越好。 接下来我们就详细分析光子-电子-数字的转换,了解各种噪声的源头,从而可以找到流星相机的关键参数,和优化设计的方向。简便起见,我采用的是非常简化的模型。真实的图像传感器的原理和性质非常复杂,基本是一门单独的学科。 油管上有[一个很不错的系列](https://www.youtube.com/playlist?list=PLD9DE4E7DCC55AB4C)解释图像传感器中的噪声,推荐大家观看。 ## 数光子 刚才我们说了,相机传感器可以对落在上面的光子进行计数。而光子的数量,本身就带有随机性,而随机性就会带来噪声。平时我们不会注意到这种随机性,因为白天或者灯光下光子数量很多,随机性被抹掉了,而在拍摄星空时,光子的数量很少,这种效应就很明显。我们进行一点计算就会发现,对于我们用肉眼观察6等的恒星,每秒钟进入我们眼中的光子数量只有10个左右!对于跟人眼尺寸差不多的摄像头,这个数字也差不多。可见人眼还是一台很不错的相机。 关于“光子”为什么会带有这种天然的噪声,我们用一个日常生活中的场景来类比。我们在公交站等公交车,对于10分钟一班的车,有时候两辆车的间隔会是15分钟,有时候又是10分钟。而如果一班车我们不知道发车频率,我们可以在公交站边等边算时间,用这个时间间隔来估算。 如果我们在公交站等了10分钟,这10分钟一共来了1辆车,那这辆车的发车间隔可能是多少?当然最佳估计就是10分钟一辆(每小时6班),但完全有可能是15分钟1辆(每小时4班),也很有可能是5分钟一辆(每小时12班)。这种时候你就非常拿不准这个发车频率。 而如果你在站台上等了两个小时,等到了12辆车,那你说这趟车是每小时6辆的把握就大得多了。每小时8班、每小时5班的概率都大大降低。如果你等的时间更久,等了整整一天,你对发车频率的测量就更有把握了。 这个例子就表明,“一个一个”随机出现的事件,对出现概率的测量是随着出现次数增加逐渐变精确的。在数学上,这就是所谓的“泊松噪声”。它的大小等于光子的平方根,比如100个光子,泊松噪声的水平是10个光子,此时信噪比是10,而10000个光子,泊松噪声是100个光子,信噪比是100。 这基本就是为什么越暗的星就越难拍到。并且3s/ISO5000曝光拍出来的照片明显不如30s/ISO500,也是这个原因。在这个问题上是没法作弊的,比如我问:我把每个光子都转变成100个计数,100个光子跟以前10000个光子一样亮了,噪声会减小吗?并不会,因为这时候噪声是被等比例放大了。就像是数公交车的时候,每过一辆车就在本子上记100,最后没有什么区别。 ## 暗电流和背景天光 这里我们要注意,虽然放在一起讨论,暗电流和背景天光的来源完全不同。 背景天光很好理解,那就是大气发射和反射的光。随着曝光时间,整个画面都变亮了,一部分原因就是背景天光。在城市中背景天光很亮,这就造成我们在城市中看不见银河,看不见很亮的星。 暗电流是另一方面。理论上,只要温度不是绝对零度,都会有一些电子自发地跳出来。于是即使没有光子照射,拍出来画面也是有计数的,并且正比于曝光时间。 之所以把它们合在一起写,是因为他们观测上产生的效果是差不多的:就是随曝光时间均匀增加的计数。问题来了:这些计数也有泊松噪声。深空摄影中经常会使用“暗场”来去掉图像中的暗电流,而拍摄星野也可以用ps减掉背景天光,虽然本身减掉了,但他们的噪声依然存在,这样总和的噪声就变大了。 我们修改一下数公交车的场景,除了你要数的那趟公交车之外,还有每小时60班其他公交车经过这个站,你数了10分钟,总共确实数到11辆。按理说应该扣掉10辆其他的公交车,但问题是真的正好经过了10辆其他公交车吗?也有可能是9+2辆或者11+0辆,那你对目标的计数就差了非常非常多,没有精度可言了。 光子数量也是一样的。本来100个来自目标的光子可以带来10的信噪比,但如果又有了800个光子的背景天光,一共900个光子,那么噪声就是30光子,信噪比就只剩3.33了。这就是为什么天文观测一定要寻找光污染最小的地方,还有CCD需要制冷来降低暗电流,就是因为它们带来的噪声是无法去除的。 唯一能去除的方法就是不要让这些额外的光子到达传感器。比如有“光害滤镜”这种产品,把一部分天光滤掉,这样就可以出现在城市里拍银河的神片了。 ## 读出噪声 图像传感器是如何将光子转换成电子的?可以从一个PN结开始理解。我们给PN结通上反向偏压,此时几乎没有电流,是因为PN结上形成了一个势垒,电子能量不够不能通过。但这时如果有一个光子撞到一个电子,电子受到了激发,就会越过势垒跑到另一边,于是就形成了光电流。光子和电子的相互作用是一对一的,也就是说,电子的数量就代表着光子的数量,它们的比值就是大名鼎鼎的量子效率。通常量子效率小于100%,但厂商都在朝这个方向努力,最好的CMOS芯片已经达到90%以上。 而产生的光电子十分珍贵,不能让它白白溜走。于是,紧接着PN节是一个电容,电容里的电场可以将这些电子吸在上面。在曝光的时候被吸在上面的电子逐渐增多,这就是为什么图像亮度正比于曝光时间。而在曝光结束之后,一个特殊的“开关”打开,这些电子可以通过另一条通路流走,这就是所谓的读出。 在这个电路上,有几个环节会造成噪声。光电子在沿着导线读出来的时候,最终出来的电子有可能会多几个少几个,这是因为导线中自带的电子也会热运动,所以有一些随机性。这种噪声遵循高斯分布,是一种“白噪声”。另一个是电子在经过各种门电路的时候,因为半导体的缺陷,有时候会“卡住”,过一段时间才释放出来,这对应一种低频噪声。这两种噪声可以认为与曝光时间无关,每次读出产生的噪声水平是差不多的。 这些转移出来的光电子,会经过放大电路进行扩增,然后流过ADC。这时电子的数量就会被记录下来,成为一个个代表亮度的数字(叫做ADU值)。 我们回头考虑刚才那个电容。电容是靠电压来吸住电荷的,而如果电荷非常多,电容两边的电压就会变高,进而降低了PN结两边的偏压。所以因为PN结是单向导电的,一旦偏压消失,这些电子就会重新通过PN结溜走。所以,每个像素能储存的电子数是有限的,这就是所谓的“满阱”。对于CCD来说,这些多余的电子会外溢到相邻的像素中,这就是CCD特有的smering(漏光)现象。