一些基础内容

动态范围的概念

首先,我们先介绍一个基本概念 —— 动态范围。所谓动态范围,就是相机能感受到最亮部分和最暗部分的比值。比如我们这台相机,能够感受到的最亮的是在这里,我们假设其亮度是 1000,再高就感受不到了。能感受到的最暗是在这里,我们假设其亮度是 20,再暗也感受不到了。我们就说这台相机的动态范围是 1000 比 20。

但是通常情况下,我们更容易看到另外一个计量单位 —— EV(曝光值)。那么 EV 是什么?

为什么我们要放着更容易理解的计量单位不用,而去用一个听起来就很奇怪的单位呢?这和人眼对于光线的感知特性有关。

光线的感知与数字信号

人眼对于光线的感知是指数型的

下面两张图,哪个图像上的明暗渐变看起来更加均匀?

发射光强度均匀分布的明度条

感知光强度均匀分布的明度条

对于绝大多数人来说,是第二张图带给我们的观感更加的均匀。

为何如此?我们刚才确定在第一个图像中,明度度在最黑与最亮之间以均匀(线性)间隔逐渐提高,这是我们的显示器可以再现的。

但是,为什么我们不认为第一张图是一个线性的渐变呢?而第二个图像为什么是我们认为线性的渐变?

答案在于人眼对明度的感应是非线性的。

物理线性与感知线性

假设我们想将以下现实世界中的对象表示存储为计算机上的图像文件(假设现实世界中存在完美的灰度渐变,好吗?)以下是这个“现实世界对象”的样子:

理想的平滑灰度渐变

现在,假设我们只能在这个特定的计算机系统上存储5位灰度图像,这给我们提供了从绝对黑到绝对白的32个不同灰度级别。

此外,在这台计算机上,灰度值与其对应的物理光强度成正比,这将产生如图1所示的32个灰度。我们可以说,这个灰度在连续值之间的光发射方面是线性的。

如果我们仅使用这32个灰度值来编码我们的平滑渐变,我们将得到如下所示的效果(为简化起见,我们暂时忽略抖动):

理想的平滑灰度渐变用32个物理线性灰度值表示

嗯,过渡相当突然,尤其是在左侧,因为我们只能使用32个灰度值。

如果我们稍微眯起眼睛,很容易让自己相信,这在我们的有限位深允许的范围内,已经是“准确”的平滑渐变表示了。

但是注意到左侧的步骤比右侧大得多——这是因为我们使用的灰度在发射光强度方面是线性的,但正如我们之前提到的,我们的眼睛并不是以线性方式感知光强度的!

这个观察有一些有趣的启示。

原始图像和5位编码版本之间的误差在图像各处是不均匀的;

对于暗色值,这个误差要大得多,而对于亮色值则较小。

换句话说,我们在表示暗色值时失去了精度,而在表示亮色值时则使用了相对过多的精度。

显然,我们最好选择一组不同的32个灰度值,使这种误差在整个范围内均匀分布,这样暗色和亮色都能以相同的精度表示。

如果我们用这种感知线性的灰度(但在发射光强度方面是非线性的,并且这种非线性与人类视觉相匹配)对原始图像进行编码,我们将得到与图2中完全相同的灰度图像:

理想的平滑灰度渐变用32个感知线性灰度值表示

我们这里谈到的非线性是之前提到的幂律关系。我们需要对物理线性灰度值应用的非线性转换,以将其转换为感知线性值,称为伽马校正(gamma correction)。

但机器不这么认为,对于机器来说,均匀的亮度就应该是物理线性的。

曝光值(EV)的引入

但是通常情况下,我们更容易接触到另一个计量单位 —— EV(曝光值)。

EV 是光线的倍数。

我们说增加一档 EV 就是将当前的光线增加一倍,而减弱一档 EV 就是将当前光线减弱一倍。

每一档 EV 都是前一档 EV 亮度的翻倍。EV 这个单位可以从人眼的感受出发,线性地描述人眼对于光线的感受。

假设某款相机的动态范围是 12 EV,那么就说明这台相机能够记录的最高亮度是最低亮度的 2 的 12 次方倍。

回归到亮度上,亮度本身还是指数级上升的

CMOS 传感器也可以感受到光线的强弱,并将其转换为电信号。但要将这些电信号存储起来,还需要将它们转换为数字信号。通常我们会使用比特位(bit)的整数来存储这些信号,每个比特位可以表示 256 个不同的数值。

我们来创建一个图表,数轴表示的是 CMOS 感受到的光线强度最小为零,最高是 255。

横轴表示的是 CMOS 感受到的光线强度最强的光线,我们用数字 255 来进行表示;最弱的光线用数字零来进行表示。

按照这个关系,我们可以构建一条直线,这样横轴上每一个点都可以找到一个 0~255 之间的数字与之对应。

那么我们的问题也就出现了,最强的光在这里对应的数字是 255,我们将这个最高亮度降低一档,也就是将亮度降低一半,这个位置对应的数字是 127。

我们再继续降低一档亮度,这一档的亮度是上一档亮度的一半,那么对应的数字区间就是 63~127,这一档占用了全部数据容量的 25%。

继续按照这个规律往下分,我们可以分出来八个档位,每个档位的数据容量都是上一个档位的一半。第六档的数据总量只有四个数字,第七档只有两个,第八档只有一个。其实最后剩下的这几档已经不太可用了,精度太差了。

所以才有了 EV 这个概念。虽然每一档 EV 的亮度都是上一档 EV 亮度的翻倍,但是人眼对其变化的感知却是相同的。

举个例子,第3档和第4档,人眼对其变化的感知其实是相同的。但是到了用数字去存储它们的时候,就会发现这一档占用了 50% 的数据容量,也就是 128 个数字,而这一档则只占用了 10%,2.5 的数据容量,也就是只有 32 个数字。更别提再低的档位了。这种数据存储的方式显然是不合理的。

后来人们想了一个办法,就是把这条直线给它掰弯

曲线与曝光值?

伽马曲线与动态范围的关系

为了更好地表示光线强度,人们引入了伽马曲线。

这条曲线刻意给低亮度的区域多映射一些数据,而高亮度的区域则少映射一点数据。

这条曲线就是伽马曲线。

在伽马曲线的影响下,最高亮度的一档已经从 50% 的数据容量,缩小到了 27% 左右,低亮度档位的数据容量也有了不同程度的提升。

我们通常所说的 BT709 的视频,就是使用了伽马曲线。

但伽马曲线并没有完全解决动态范围的问题

随着影像工业的持续发展,人们越来越觉得伽马曲线不够用了,它所能容纳的动态范围太小了。

我们需要一条新的映射曲线。那么如何才能设计一条能够容纳更多动态范围的曲线呢?我们还要从动态范围的定义说起。

如何计算一款相机的动态范围有多少档 EV?

自然对数曲线

Log 曲线通过使用对数函数(例如 log10)来重新映射亮度值,使得每个亮度档位都能分配到相同的数据容量,同时能够容纳更高的亮度值。这种曲线实际上是分段函数,当输入值低于某个阈值时,曲线会变成直线,这有助于在低亮度区域保持数据的精细度。

实际上就是 log2(最高亮度和最低亮度比值)。要提升动态范围,实际上就是要提高这个比值。无非就是两种手段:提高最高亮度或者降低最低亮度。对于降低最低亮度,其实从这个坐标轴就能看出来,最低亮度的坐标轴在原点就是零。

当然这个零其实是理想层面上的一个零,实际上是不可能为零的。

这个话题我们一会深究,这里你只需要知道我们设计的新曲线对于最低亮度这一点不可能比伽马做得更好。那最低亮度不能更低,那最高亮度能不能更高呢?答案是完全可以的。

在 BT709 的伽马曲线里边,最大的数字对应的亮度是在这里。

当我们新的曲线在映射这一亮度的时候,就不能映射到 Y 轴最高的位置了。

也许我们可以映射到一个中间的位置。这样我们就还能剩下一些数据容量,用来存放更高的亮度。

所以这条曲线要满足第一,尽可能保障每一个亮度档位都分配相同的数据容量。第二,容纳更多更高的亮度档位。

我们来看一下这一条曲线
伽玛曲线
可以看到原先伽马能够存储最大亮度到了这个曲线里边,变成了一个中间偏上的数字。这就意味着这条曲线还有空间,来容纳更高的亮度。这个横轴太长了,我们稍微把横轴给它压缩一下。我们再来看一下新曲线。每一档亮度所占的数据容量,可以发现都差不多。可以数下这条曲线,可以容纳的动态范围也大大增加了。相较于 BT709 的伽马曲线来说,这显然是一条更加合理的曲线。

其实这就是索尼的 S-Log3 曲线。

S-Log3公式
这条曲线的公式是这样的,你没必要去细看。
S-Log3曲线
核心就是这个 log10 的对数,所以这种曲线就被称之为 log 曲线。

一个值得注意的细节是,这条曲线其实是一个分段函数。当输入小于某个阈值的时候,就会变成一条直线。这种做法可以将横轴上零亮度较为方便的固定到纵轴的一个定值上面去。

使用 Log 曲线拍摄能够得到更好的动态范围

但是想要拍好,你还需要一些技巧。接下来我们来研究一下动态范围和 ISO 的关系。光圈、快门、ISO 是曝光三要素。你初学摄影的时候一定学过这一套理论。今天我要重新给你讲解这套理论,因为你以前学的是有问题的。

光圈: 通过放大和缩小可以控制曝光量。这一点很好理解。

快门通过控制曝光时间也可以控制曝光量。这一点也很好理解。

但是 ISO 呢?

ISO 的概念与作用

在胶片相机里边,ISO 指的是胶片的感光度,也就是对光的敏感程度。你可以换不同感光度的胶片来实现控制曝光。

但是到了数码相机里边,胶片已经变成了 CMOS 传感器。大家拍照的时候也不能去更换,那么数码相机里边的 ISO 到底是什么呢?

实际上数码相机里边的 ISO 就是增益

CMOS 会把光线转换成电信号。

大体转换过程则是“CMOS记录——电信号——电信号放大——电转数——数字信号——数字信号放大”

这里的电信号放大器就是数码相机里边的 ISO。

那么这个电信号的放大器初始增益值,就是我们常说的原生 ISO。

后面这个数字信号的放大器,其实就是扩展 ISO。调整 ISO 的大小,就是在调整这些放大器的增益倍率。

这个过程是在曝光完成之后才进行的,也就是说 ISO 并不参与曝光的过程。曝光只与光圈快门相关,与 ISO 无关。

那么有的同学就要问了,不对吧?我用很高的 ISO 拍摄的时候,画面就会出现很多的噪点。那你既然说 ISO 和曝光本身没有什么关系,那这些噪点是哪里来的呢?

ISO 与画质的关系

这些噪点仍然是曝光时候所产生的。

因为你用高 ISO 拍摄的时候,相机会自动为你调节光圈和快门。

你等于是拉低了 CMOS 的进光量,然后用 ISO 的高增益把亮度给拉了起来。噪声是由于你的进光量低而导致的,并不是由于 ISO 本身导致的。

这里的噪声,其实是始终存在的;因此无论通过何种方式进行拍摄(如大光圈低ISO),这类噪声会始终存在。

所以有部分高端机型引入了双原生 ISO 的配置,所有的数码相机(CCD\CMOS)往往在原生 ISO 的情况下可以获得最高的画质。

因此 ISO 增益只是会放大这类噪声,使用更接近原生 ISO 进行拍摄则是使这些噪声更不易被我们看到。

所以说 ISO 和曝光本身没有什么关系。

ISO、Log与动态范围的关系

ISO、Log与动态范围有关系吗?

关系自然是有的,但是在讲关系之前,我们要先搞清楚一个问题,那就是我们之前提到的动态范围计算公式里边的这个最低亮度。我们在此之前提到,这个最低亮度不可能是零。

那有的同学就要说了,最低亮度不就是没有光的时候吗,那不就是零吗?

我们来做个实验,拿出相机,我们直接用保护盖把相机的 CMOS 传感器给它盖起来,然后录制一段视频。

我们去看这段视频的波形图,可以发现,尽管画面上看上去一片漆黑,但是在波形图上面仍然有很多小白点,在信号较低的区域不断跳动。

这些就是噪声。噪声的源头有很多,并不是说我们只要用更先进的电路,更好的器件就可以避免。

有的噪声是由于 CMOS 的热效应而产生的,有的噪声甚至是光的量子特性而产生的。这个话题要聊起来就很大了,还要涉及到量子力学,热力学。

我们先不做讨论。反正你就记住噪声限制了相机可以感知的最低亮度,决定了下限;而可以感知的最高亮度就是相机的上限,它们的比值就是相机的动态范围。

那么 ISO 会影响什么呢?

在这里假设有一块可以自发光的板子,板子的光源是3700K,板子上面有 21 个白灯,这块板子就是Xyla21动态测试卡。

Xyla21动态测试卡

这个板子的最右侧的灯的亮度是最高的,然后相邻的每一个灯都是前一个灯亮度的一半;最左侧的灯则是最暗的。

根据我们之前所学的,相邻两个灯之间的亮度差了一档 EV 的这种板子,就是用来进行相机动态范围测试的测试版。

这块板子在使用的时候要保持环境黑暗,然后用你的相机对其进行拍摄之后,分析拍摄的样片。

来看一下这个样片的波形图,在这张波形图里边,最高亮度一档的灯已经过曝了,第二高的灯处在一个要过曝,还没有过曝的临界位置上面。

然后一档一档的这样下来,最后最暗的这几档,其实已经被淹没在了噪声里边了。

那么我们这台相机的动态范围就可以大致数一下,是差不多 14 档的动态范围。

此时我们尝试在保持光圈和快门不变的情况下,提高 ISO

随着增益逐渐加强,刚才要过曝还没有过曝的第二档就过曝了,而第三档就处在了一个要过曝,还没有过曝的位置上面。

再来看一下低亮度的几档,可以发现,虽然提高 ISO 可以对亮度进行增益,但是噪声也会被同时放大。

原来被噪声淹没的那几档,现在仍然被噪声淹没。

所以提高 ISO 会导致损失高亮度的动态范围,而不会对低亮度有所提升。动态范围就会缩小。

当然对于低亮度的部分来说,该淹没的还是会被淹没。

至于高亮度的部分,要分情况进行讨论。

如果高亮度的过曝是因为 ISO 的增益,把原本不过曝的画面给增过曝了,那么降低 ISO 这部分的亮度是可以救回来的。

但是如果是因为光线强度超过了 CMOS 的最大感光度,那么你通过降低 ISO 是救不回来的。

所以降低 ISO 不会对暗部产生什么影响,但是可以在一定范围内增加亮部的动态范围,总体的动态范围就会提升。

调整 ISO 就是对所有光信号的强弱进行缩放

通过对信号进行缩放,我们就可以调整动态范围的分布情况。

我们在波形图中间画一条线,这条线代表的就是当前画面的中灰位置。

我们提高 ISO 会发现,有更多的档位被排布到了中灰线以上,也就是说,提高 ISO 可以给亮度分配更多的动态范围。

而拉低 ISO,会发现有更多的档位被排布到了中灰线以下,也就是说,降低 ISO 可以给暗部分配更多的动态范围。

实际拍摄中的 ISO 选择

我们假设一个情况,假设你拍摄的场景是一个很亮的场景,比如说天空,那么其实你有两种拍摄方式。

第一种是用一个较低的 ISO 增益,然后通过调节光圈快门提升进光量,从而达到一个正确的曝光。

其二通过调节光圈快门降低进光量,然后使用一个较高的 ISO 增益,把亮度给拉起来,达到一个正确的曝光。

那么你应该选择哪种呢?

两种都可以达到目的,但是第一种因为你使用了较大的 CMOS 进光量,你拍摄的东西又是高亮度的,所以稍有不慎,你的进光量就会超过 CMOS 的最大感光能力,就会过曝,导致丢失细节。

而使用第二种,减少 CMOS 进光量,可以让光线分布在较低的水平,然后通过调节 ISO 来增益体量,这样你就更容易进行调整,更不容易过曝。

那么换一种场景,假设你拍的场景是一个很暗的场景,比如说夜景,那么你其实也有两种方式进行拍摄。

第一种调节快门光圈用一个较低的 CMOS 进光量,然后提高 ISO 进行提亮。

其二调节光圈快门用一个较高的 CMOS 进光量,然后用一个较低的 ISO 进行提亮。

如果是第一种的话,高 ISO 增益在放大正常信号的同时也会放大噪声,你最后得到的画面噪声就会多很多。

而如果提升 CMOS 进光量,然后用一个较低的 ISO 进行提亮,噪声就能维持在一个较低的水平,你最后画面的噪声就会低很多。

结合这两种场景,在高亮度的场景下,你应该用更高的 ISO 配合较低的 CMOS 进光量,而在低亮度的场景下,你应该用更低的 ISO 配合较高的 CMOS 进光量。