如果你对摄影有一点基础的了解,可能你经常知道的常识是拍照时,在保证图像曝光合适的情况下要尽量用低ISO,因为高ISO会带来高噪声,就像下图所示
另外,现代单反的传感器一般具有一定的动态范围,很多单反都可以达到2000:1的动态范围(参见27. HDR - 高动态范围成像),当我们获取RAW图像后,可以自己来做想要的色调映射,而不是让相机内的图像处理器来做。但此时我们通常会发现,如果把图像的亮度映射的更亮时,图像上的噪声也加强了,如下图所示,左上角是相机不开HDR时拍摄并保存的一张图像,左下是做某种色调映射或亮度拉伸后得到的图像。右图则是局部细节,可以看到噪声非常明显。
这就让我们不得不问几个问题:
- 为什么高ISO时图像通常会有更大的噪声呢?
- 为什么对单帧图像做色调映射会带来更大的噪声呢?
- 为什么我们之前看到的多帧融合来做HDR时,不会有这么明显的噪声呢?
今天我想通过这篇文章,为你介绍一种基础的成像过程中的噪声模型,以及获取这个模型中的各项参数的方法。通过这些介绍,我们能部分回答这些问题。
一. 回顾图像的生成过程
在2. 从入射光到JPEG相片-数码相机内部的秘密中,我们看到了成像系统是如何把入射光变成最终的JPEG图像的:
那么在这个过程中,噪声是哪些地方引入的呢?
实际上,真正引入噪声的地方就是上面的绿色框的部分
让我们将这一部分进一步拆开看看,噪声到底是如何引入的,如下图所示
这里面场景的光辐射通量是Φ,它照射到传感器上通过光电效应产生电子,与此同时,传感器自身因为温度等因素的影响会释放出一些电子,它们构成了暗电流D。光辐射和暗电流共同作用到像素上,产生了模拟电压L。这些电压在模拟放大器的作用下会变成模拟电压G,后者进入到模数转换器后,最终变成了数字信号。
Tips: 辐射通量与光源的光亮度正相关,而光亮度是表示发光面明亮程度的,指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比,单位是坎德拉/平方米(见27. HDR - 高动态范围成像)
如上图所示,这里面有3处都会引入噪声,首先是在传感器部分会有光子噪声和暗噪声,接着在模拟放大器部分会产生读出噪声,最后在模数转换器部分会有所谓的ADC噪声。你可能会问这些噪声是什么意思,它们又是如何产生的。不着急,我们一个个的来介绍。
二. 图像生成过程中的噪声
2.1 光子噪声
在对光电效应和传感器特性不了解的人看来,当传感器像素受到恒定亮度的光源照射时,每个单位时间接收到的光子的数量是恒定的,因此其通过光电效应激发出的电子也是恒定的。
然而,像素接受到光子,就像下雨天你站在室外淋雨一样,滴到你身上的雨滴的数量以及像素捕获到的光子数量都是随机量。
这种随机量围绕着某个均值波动,并符合泊松分布。传感器像素在单位时间接受的光子数量的这种波动性在图像上表现为可见的噪声,也因此它被称为光子散粒噪声,或泊松噪声。
泊松分布随机量有一个有趣的特点,即其平均值和方差是一致的,下面是这种随机量在不同的均值情况下的概率函数示意图,我们可以看到当它的均值λ越大时,其方差越大,表现为曲线覆盖宽度越宽。
回到光子噪声,我们可以认为单个像素在曝光期间接收的光子平均数量与曝光时间及光辐射通量φ成正比,因此可以表示为下面的公式,其中α是一个比例常数, t是曝光时间
光子噪声有两个典型的特点:
- 曝光时间越长,或者场景辐照度越强,平均来说捕获到的光子数量总体越大,其波动也越大,即光子噪声绝对值越大
- 光子数量越多,噪声绝对值越大,但在图像中反而越不明显。这一点在我们后面讲信噪比时还会再仔细说明,但现在可以通过下图得到一个直观的印象,我们可以看到,当画面较暗时单个像素捕获的光子平均数量较少,其波动也较少。随着图像变亮,光子噪声增加变得明显。但当图像继续变亮时,虽然光子噪声的幅值变大了,但从肉眼上看却变得不明显了。你现在可以在心中留一个问题,我们稍后来看看怎么回事。
2.2 暗噪声
我们都知道光电效应会导致传感器激发出光电子,然而传感器即便在没有接受到光子时,因为温度的影响也会释放出电子。在曝光时间内,这种电子的数量也是一个符合泊松分布的随机量,我们可以将其表示为下面的公式,其中t是曝光时间,D是当前温度下单位时间内的热电子的数量):
这个随机量也会导致图像上的噪声,我们称其为热噪声。它有以下的特点:
- 它与温度成指数关系,温度每升高6摄氏度,暗噪声的均值扩大一倍
- 它与曝光时间成线性关系,曝光时间越长,暗噪声越强。
在天文观测一类的长曝光应用中,暗噪声影响特别大。如果要消除暗噪声,最基础的方法是
- 降低传感器温度,比如超低温环境下放置传感器(例如太空中)
- 或者控制曝光时间
- 提前测量出暗噪声图像,并在最终图像中减去暗噪声图像,这一点我们稍后来看看如何做到
由于光子噪声和暗噪声的存在,传感器像素在进入放大器之前的输出电压L也是一个随机量。由于两个泊松分布之和也是泊松分布,且其均值是两个泊松分布的均值之和,因此L可以表示为:
2.3 读出噪声和ADC噪声
如前所述,像素在光子和暗电流的影响下释放出电子,曝光时间内累积的电子被转换为与其数量成比例的电压。然后该电压被放大成与相机中设置的ISO增益成比例的量,并在模数转换器(ADC)中数字化。
代表所有像素的光子计数的数字信号构成图像的原始数据(原始单元有时被称为模数单元ADU,或数据号DN)。我们将这个数字称为像素的原始值。在理想情况下,记录在原始数据中的数字应该与光子计数成正比。在现实世界中,原始数字并不精确地反映光子计数。信号处理链中的每个电子电路组件--从传感器读出、ISO增益到ADC数字化--都会受到电压波动的影响,导致原始值偏离与光子计数成正比的理想值。由信号处理电子设备引起的原始值波动构成了传感器的读取噪声和ADC噪声,其中ADC噪声还包括了因为从连续的电压值量化为离散的整数值的过程中的量化误差。
三. 包含了噪声信息的图像生成模型
考虑到前一节讲的各种噪声的存在,我们将放大器的输出电压G表示为下面的公式,其中
是读出噪声,而g则是一个和ISO相关的增益比例。正如你所看到的,放大器会同时放大原始电压L,以及读出噪声。
而经过ADC后的输出数字信号可以表示为:
也就是说
这里面读出噪声和ADC噪声都符合高斯分布,而原始电压则符合泊松分布:
这个数字信号I的均值和方差也很容易可以计算出来:
这里面,由于读出噪声和ADC噪声都符合高斯分布,我们还可以将整个成像过程简化为下面的"仿射噪声模型":
其中
被称为加性噪声,它是两个高斯噪声之和,它也是高斯噪声,因此有
我将前述所有的信息总结到下面图中:
我们从这个模型中可以观察到下面的信息:
- 因为暗噪声的存在,像素的原始值并不绝对反映场景的亮度
- 拍摄多幅图像并取均值的方法可以消除读出噪声和ADC噪声,但无法去掉暗噪声
- 为了去除暗噪声,需要专门测量出暗噪声,并从最终信号中减去
关于噪声还能看到:
- 场景很亮时,光子噪声起主导作用
- 场景很暗时,加性噪声起主导作用
- 最重要的是,由于光子噪声和输入信号本身绑定在一起,所以无法消除
- 低ISO值时,ADC噪声会更突出,而高ISO值时,光子噪声和读出噪声更突出
- 曝光时间越长,暗噪声影响越大
四. 信噪比
现在我们有了新的问题,由于光子噪声和图像的曝光时间及光辐射正相关,那岂不是意味着图像越亮时,噪声越大?那为何我们在下图中看到的不是这样的呢?
这就牵涉到一个重要的概念——信噪比。
我们知道,信号的方差反映了它的噪声的绝对大小(的平方)
而信噪比则反映了噪声相比信号的相对大小,当噪声减小时方差变小,而信噪比减大
现在回到传感器信号,如果我们不考虑暗噪声的话,前面讲的成像模型的噪声和信噪比可以表示为:
观察一下信噪比公式,我们会发现如果曝光时间t很大,或者场景很亮时,我们可以忽略掉加性噪声部分,此时
也就是说,这种情况下像素值越大,信噪比也越大,噪声在图像中看起来越不明显——这就回答了我们刚刚的疑问。
反过来讲,如果曝光时间t很小,或者场景很暗时,光噪可以忽略,加性噪声占主导,此时
可以看到,如果图像亮度保持不变(即SNR的分子不变时),ISO越大,g越大,SNR越低,噪声越明显——这就回答了我们本文开始的问题,为什么高ISO值通常有更大的噪声呢,因为读出噪声被放大了:
那么,在我们对下面的RAW图像进行色调映射,拉伸暗处细节时,噪声加强也是很自然的了,因为此时暗处噪声的绝对值被放大了,而暗处几乎没有捕获到有效的信号:
五. 各种噪声的标定
如果我们能提前测量,或者标定出上述成像模型中的各种噪声,就有机会在最终图像中消除它们,从而得到干净的图像。这一节我们看看如何做到这点。
首先看看,系统噪声模型中的哪些参数是我们需要测量的
从上图可见,暗电流D, 读出噪声
, ADC噪声
, 以及增益尺度k,都是我们需要知道的。那么,如何获取这些量呢?
首先我们看看如何标定暗噪声。
5.1 暗噪声
根据仿射噪声模型,加性噪声的均值为0
因此如果我们把相机镜头遮挡住,并在这个状态下拍摄大量的图像,再对这些图像取均值,相当于在令Φ=0,于是这个均值图像相当于:
虽然此刻我们并不知道g的具体值(它是一个跟ISO成正比的常数),但我们由此就知道了在当前ISO设定下,一定曝光时间的暗帧。
这意味着什么?意味着我们不必求出暗电流D的具体值,只需要在同等曝光时间和ISO设定的图像中减去这个暗帧,就可以消除图像中的暗噪声。为了消除在不同的ISO设定下的暗噪声,我们需要做的就是在相机的不同ISO设置下分别标定出当前的暗帧即可。由于曝光时间可以任意设置,我们很难针对每个不同的曝光时间去标定当前的暗帧。但可以用暗噪声大小与曝光时长成正比的原理,来进行一定的比例补偿即可。
这样,消除掉暗噪声的相机噪声模型就变成了这样
5.2 加性噪声
接下来的问题就是如何标定加性噪声了。
观察一下此时的图像噪声式子:
这意味着:
可以看到图像像素的方差与像素的均值呈现出来了一种线性关系。于是,我们可以在特定的增益g下,拍摄大量的灰阶图像,如下图所示。
然后对每张图像,我们首先减去当前的暗帧(需要按照曝光时长进行补偿),然后求取每个像素的均值的方差。此时如果我们把大量像素的均值和方差画在下面这张图上,可以看到它们几乎形成了一条直线,并且增益g是这条直线的斜率,而方差
则是这条直线的截距。通过采样大量不同均值的像素点的信息,可以很容易的拟合出这条直线,并求得g和对应的加性噪声方差
(这也是为何要用上面的灰阶图卡的原因)
你可能会问,我们有没有办法分离读出噪声和ADC噪声呢?当然是有办法的,根据下式
因此,我们可以在不同的ISO设置(也即是不同的g)下,多重复几次上述实验,即可获得足够的数据,拟合出
以及
六. 总结
今天这篇文章,我介绍了一个简化的相机成像的噪声模型,其中包括了
- 暗噪声
- 光子噪声
- 读出噪声
- ADC噪声
我们看到了信噪比是如何计算的,这些噪声又是如何影响信噪比的,对实际图像的影响又是如何的。我们还看得,通过简单的方式,就可以提前标定出暗噪声、读出噪声以及ADC噪声。
在这里,我必须强调一下,前面描述的过程的前提假设是每个像素的噪声特性以及对原始光信号的响应都是一致的。然而,事实上传感器中各个像素因为生产制造、材质本身的非均匀等等各方面原因,会导致传感器各个位置上的噪声参数都是不同的。也因此,上面介绍的噪声模型只是一种近似,如果要精确的标定成像系统的各种噪声,还需要更多的理解噪声模型。在这方面,有更多的资料做了更加准确和深入的讲解,我也希望之后能够用比较清晰易懂的文字再加以详解。先给出一些重要的参考资料:
- Noise, Dynamic Range and Bit Depth in Digital SLRs
- 数字图像传感器的噪声模型及标定
七. 参考资料
本文基本上是对如下资料的中文讲解,如果有讲得不清楚的地方,也是我自己的理解不足,与原课程老师无关。
CMU 2020 Fall Computational Photography Course 15-463, Lecture 7
在这个过程中,还参考了前面说的两份资料:
Noise, Dynamic Range and Bit Depth in Digital SLRs
数字图像传感器的噪声模型及标定
今天内容比较多,也容易引起争论,欢迎你的留言讨论。在下一篇文章中,我会讲解该噪声模型在HDR融合中的应用,看看有没有办法融合LDR图像在保持高对比度的情况下,还能获得更好的去噪效果,敬请期待。