轻轻一按,你的相机就把光子转换为了比特。于是一张相片就保存到了你的 iPhone 里。
让我们假设一下你身处室外,环顾四周。三亿里之外,太阳无时无刻不在发射光子。它们需要花上 8 分钟之久才能到达我们舒适的星球。有一些光子撞击到你周围的物体,并反射到你眼睛的视网膜上,这会使你的大脑以这些物体为基准,创建一副图像,我们将其称之为视觉。
摄影要做的就是捕获这幅图像。摄影是在 200 年前被发明的,但在此之前的好几千年里,人类已经通过绘画的方式来捕捉他们所看到的东西了。
我们中的很多人其实每天都相机不离身:当今智能手机已经是最常用的相机之一了。在数码摄影的时代之前,摄影通常是记录在纸上或者胶卷上的。而今天,摄影将光转换为比特信息。
这篇文章将带你探索这一切是怎么发生的:智能手机的相机到底是如何工作的。
快门速度,感光度 (ISO),光圈
在我们深入将光子转换为 JPEG 文件之前,我们先来看看相片的一些基本概念。这些概念不仅在过去的胶卷摄影时有效,在今天也是同样的。在不久之前,几乎所有的摄影都是通过胶卷完成的。与今天使用数码感光器不同,那时候成像依赖的是受光照影响的生化反应。但因为在拍摄相片中其他所有东西都遵循同样的原则,所以对笨重的胶卷相机和胶卷摄影适用的规律一样会在使用 iPhone 拍摄时适用。
进光量
拍摄一张相片的过程有时候被称之为曝光。曝光也指单位面积上光的数量。为了相片亮度合适,光的数量也需要在一定的范围内。如果我们没有捕获足够的光,那么相片就会欠曝 – 图像被湮没在图像传感器或者胶卷的固有噪声中。如果我们捕获的光太多,图像就会过曝 – 图片传感器/胶卷所接受的光过于饱和,无法区分不同的光的数量,这意味着几乎所有区域看上去曝光程度都是一样的。
当拍摄照片时,我们必须将相机调整到光线的量既不太高也不太低。下面是同一个场景中欠曝和过曝的样本,右手边的显示了使用 Pixelmator 调整了曝光后的情况。这个例子说明了要是一张照片过度地过曝或者欠曝的话,是没有办法进行修复的:
未调整 | 已调整 |
---|---|
在欠曝图像中,即使我们尝试将它调亮,图像的暗部依然被 “卡” 在黑色,我们没有办法让图像中的笔确实拥有不同的颜色。过曝图像中也有大部分区域被卡在白色或者灰色:编织带和硬币细节已经完全丢失了。
曝光档数
有三个要素可以影响曝光的进光量:快门速度,光圈和感光度 (ISO)。我们稍后会仔细谈谈它们。
在摄影中,通过调整这三者中任意一个来让进光量翻倍或者减半,就叫做改变了 “一档” 曝光。每一档曝光对于这三者 (快门速度,光圈和曝光度) 来说对应的是不同的数字变化。但如果我们将快门速度调整一档,我们需要通过调整 ISO 或者光圈一档来进行补偿,才能获取同样的进光量。我们之后会马上提及一些细节。
有趣的是所有这三者 (快门速度,光圈和 ISO) 也会在曝光上影响其他要素。这三个参数有着无数种组合来达到同样进光量的结果,我们来仔细研究下:
快门速度
当我们捕捉图片时,图像传感器捕捉一段时间的光线。这段时间被叫做快门速度,因为它表示了快门打开和关闭的快慢。
比如 1/50 秒的快门速度会让图像传感器进行 1/50 秒 (= 0.02 秒或者 20ms) 光线捕捉。如果我们将快门速度改变至 1/25s (40ms) 时,图像传感器将捕捉两倍时间长度的光,也就是两倍数量的光子,或者说两倍的进光量。
对于快门速度来说,一档表示将快门速度加倍或者减半。从 1/50 秒到 1/25 秒调整了一档。
iPhone 6 的快门速度可以在 1/8000 秒到 1/2 秒之间调整。我们可以通过改变快门速度来调整进光量,但这也会影响图像的清晰度。如果我们在拍照时相机和场景是完全静止的,我们可以使用任意长的曝光时间 (快门速度),但是更多情况并非如此。我们身边的东西都一直在移动,特别是对于 iPhone 来说,相机本身也一直在移动。
当物体移动的足够快的时候,它在整个曝光时间里便不会只停留在某一个点,这会导致图片模糊。一般来说我们希望画面清晰、不模糊,因此我们通常希望快门速度在 1/100 秒或者更快/更短。对于高速运动的物体的摄影,我们可能还需要选择一个更快的快门速度。但是我们也可以有意地选择一个长的快门速度来让物体模糊,以强调其运动感。这种情况下最好把相机固定在三脚架或者类似的东西上,这样可以确保场景中固定的物体仍然保持清晰。
感光度 (ISO)
ISO 值也被称作胶卷速度。在数码摄影中,它被用来衡量图像传感器对光的灵敏程度,以及因此带来的曝光噪音。实际上的细节非常复杂,Wikipedia 会给你一个更详细的解释。
iPhone 6 可以将相机在 ISO 32 至 ISO 1600 之间调整 ISO 值。一档对应翻倍或者减半 ISO 值。每次我们将 ISO 加倍 (比如从 ISO 100 到 ISO 200),我们就只需要一半的进光量。我们为此是要付出的代价的,那就是相片的噪点将会变多。
在 ISO 32 时,iPhone 传感器得到的图片将会有最少的噪点,但是同时也需要最多的光。在 ISO 1600 时,iPhone 图像传感器就只需要 1/50 (2%) 的进光量,但是图片会有更多的噪点。
这里有用三脚架架上 iPhone 6 后同样场景的两个样本、这些图片是从整幅相片中裁取的一小部分。左边的使用的是 ISO 32 和 1/3 秒曝光。右边的是 ISO 1600 和 1/180 秒曝光。捕获的进光量基本是一致的,但是左边的噪点要比右边的少。但是如果没有三脚架的话,我们是无法使用 1/3 秒的曝光时间来拍出锐利的相片的。
ISO 32 | ISO 1600 |
---|---|
光圈
最后,相机 (更确切地说是相机的镜头) 的光圈是用来衡量到达图像感应器的光所通过的通孔的大小的。光圈值以 F 比例 (焦比) 来进行标定,比如 ƒ/5.6,其中 5.6 表示镜头焦距与光圈 (也就是通孔) 的有效直径的比例。
可能 F 比例会让人有点迷惑。F 比例所对应的一档指的是当前值与根号 2 (√₂ ≃ 1.4) 相乘或者相除。在 ƒ/4 时,我们所得到的光的量是 ƒ/2.8 时的一半。
当使用 iPhone 相机时,事情就变得简单很多了,因为 iPhone 6 的光圈值是固定的,具体来说是 ƒ/2.2。
除了影响进光量,光圈还会对景深造成影响。这和对焦有关系。相机中的光学系统会将与相机一定距离范围内的物体渲染清晰。当我们改变光圈时,这个距离范围将变宽或者变窄。我们可以用这个特性来达到一些很好的效果 (译者注:比如人像的背景虚化等)。但很遗憾的是,我们不能调整 iPhone 的光圈大小。
结合起来
在 iPhone 上,我们能调节的只有 ISO 和快门速度。因此我们需要在噪点 (由 ISO 影响) 以及动态模糊/锐利之间进行权衡,同时保证相同档次的曝光。
这也解释了为什么晚上拍出来的照片看起来要比白天拍出来的差:在晚上光线要少得多,为了仍然有一个可接受的快门速度,自动曝光系统将调高 ISO,也许会被调到相机允许的最大值。要是即使这样还是不能达到足够的进光,自动曝光还会降低快门速度。这样的组合就造成了画面上更多的噪点,以及图像模糊。
有些 iOS app 可以让你手动调整曝光。其中一种选择是去调整 EV (exposure value) 值 (也就是曝光值)。这种方式还是会使用相机的自动曝光逻辑,但是你可以调整你想要的曝光程度。-1 的 EV 值将会通过自动曝光逻辑让图片欠曝一档。自动曝光逻辑仍然会自动地选择 ISO 和快门速度的组合 (因为在 iPhone 相机上光圈是固定的)。
另一种选择是使用快门优先 (通常被标记为 S 或 Tv)。这让我们能都直接设置想要的快门速度,然后自动曝光将自动地调整 ISO 来达到合适的曝光。
最后,我们可以完全手动控制曝光 (通常用 M 来表示),这种情况下我们需要自己调节快门速度和 ISO。当这么做的时候,我们通常会为了方便先自动曝光一张,然后使用自动曝光的参数来作为调节的起始点。
那些允许你调整光圈的相机还有一种模式叫做光圈优先 (通常标记为 A 或者 Av)。这种模式和快门优先在概念上是对应的,我们手动控制光圈,然后让自动曝光逻辑去选择快门速度 (以及 ISO 值,除非它是固定的)。
有一些好办法可以让你获取到好的自动曝光。iOS 的自动曝光逻辑将会检查图像的全部部分,然后去猜测你想要拍摄和曝光的主体是什么。如果画面的一部分特别亮,其他地方又特别暗的话,相机是不能把所有东西都曝光得很好的。所以在这种情况下自动曝光必须选择一些东西作为主体,比如人的面部。内建的 iOS 相机 app 也允许你通过点击画面来提示自动曝光系统某个部分比较重要,应该被良好曝光,这会导致自动曝光进行调整。相机 app 还能让你通过在屏幕上上下滑动来调整曝光值。但是如果你想要直接去设置快门速度和/或 ISO 的话,你就需要用另外的 app 了。
对焦
相机只能将离相机一定距离范围内的物体渲染清晰。在这个范围内的物体就是被聚焦的,而如果太近或者太远而导致模糊的,它们就是失焦的。
包括 iPhone 在内的大多数的相机都有自动对焦 (AF),相机会猜测图片的哪个部分需要被聚焦,并依此来调节焦距。iOS 内建的相机 app 允许用户点击某处来进行对焦 – 有些 app 甚至可以让用户手动调节焦距。
光学组件
相机镜头是由一系列光学组件构成的,它们负责引导和聚集光束。对相机焦距的调整,其实是通过物理移动这些镜头组件来完成的。
模块化相机 – 比如 单反 – 可以让你在不同的镜头间切换。即使是像 iPhone 这样固定镜头的相机,你也可以通过在内建镜头前方再加装额外镜头来调整相机的光学部分。
镜头系统最重要的指标是它的焦距 – 主要是它的放大倍率和视野角度。一个广角镜头的放大倍率比较低,因此可以让相机捕捉更大的区域。而长焦镜头,特别是远摄镜头的视角就窄得多,由于它的放大倍数很大,它只能获取广角镜头中的一小部分区域。
镜头也影响图像的其他部分。它可能会将一些你不想要的变形或者颜色失真引入到拍摄的图片中,比如色差就是一个典型的例子。
光满四溢
现在我们知道一些基础知识了,那么相机实际上是如何捕捉图像的呢?
在你的 iPhone 相机里面,有一个图像传感器。这个部分就相当于我们眼睛里的视网膜。图像传感器可以将光或者光子转换为电信号。
图像传感器是由海量的独个的像素传感器串起来的巨大矩形区域。我们可以将每个像素传感器想象成一个装电荷的桶。当光子撞击到像素传感器的光二极管时,它们将在这个像素的桶中缓慢地积攒电荷。最后,每个像素都会有它自己的一小桶电子。这些电荷的数量是依赖于光子数量的 – 或者说是决定于打到这个特定的点上的光的强度。
因为我们有一个像素传感器的二维阵列,我们现在就拥有能够反应出所有这些位置的光的强度的一组二维电荷阵列了。在 iPhone 6 上,我们有八百万个这样的微小的像素传感器,以及它们所对应的电荷桶。
现在,我们需要明白两件事情:第一,我们需要有重置这些电荷的能力;其次,一旦像素传感器曝光了,我们需要能够读出这些电荷的数量。重置这件事情可以全局地对所有像素一起进行。但是对这样的八百万个小电荷,我们倾向于单独处理,以将它们转换为伏特量级的量,以方便读取。
数码相机通常会去移动一行中的像素:图像传感器首先读取一行中第一个电荷桶中的电荷,然后所有的桶将它们中存放的电荷转移给相邻的前一个桶。这样第一个电荷桶现在就保存了本来在第二个桶中的电荷,并准备好了再次被读取。重复这样的步骤,所有像素的值都将被读入到传感器的行中。
正在被读取的桶,或者说像素传感器中的值将会被一个模数转换器 (ADC) 转换为数字信号。ADC 的输出是一个对应每个像素传感器所接收到的进光量的数字。最终,这些值被传递到一个数字图像处理器中进行处理。对于数字图像处理的过程,我们稍后再谈。
像素尺寸,锱铢必较
知道了这些,我们就明白为什么几百万或者上千万像素中的几百上千这个数字并不影响图片质量了。或者说,真正对图片质量有重大影响的是每个像素的尺寸。这些像素传感器非常小,以 iPhone 6 为例,每个像素传感器边长为 1.5 µm (微米)。而在一个介于消费级和专业级之间的单反相机上,它们的边长有 9 µm 之大。
随着尺寸增加,有两件事会发生。首先,像素越大,撞击它的光就越多,所生成的电荷也就越多。我们拥有的电荷越多,也就意味着读出时的噪声越小。想象一下你在邻着一条繁华的街道的屋子里听音乐吧,如果你使用的是手机的内置的扬声器的话,你基本上不可能听得到什么。但是如果你搬来一套大型环绕声音响,那么街上的噪音就都消失了。像素中的电荷和图像传感器的噪点也是同样。像素越大越好,9 µm 的图像像素将比 1.5 µm 的像素多收集 36 倍的光子。
第二点是更大的像素意味着溅射 (bleed) 的影响变小。和 CPU 或者 RAM 一样,图像传感器也是一个硅基的半导体部件。形象来说,光打在传感器上的时候就像水泼在被冰住的玻璃上一样,它会溅射到邻近的像素中去。随着像素变小,溅射到邻近像素中的光就会变多:实际打到了邻近像素中的光越多地溅射到当前像素的话,它的值所受到的影响也就越大。
快门
胶卷相机使用快门来控制曝光,这是处在胶卷前方的一个非常灵敏的机械部件:在曝光时它将会被打开,然后在快门速度所指定的时间之后关上。大一些的数码相机仍然是使用机械快门,但是像智能手机和其他小的数码相机使用的是电子快门。
包括 iOS 设备在内的许多小型设备使用的是回转快门 (rolling shutter)。它会一行一行地读取图片数据。因为每一行其实不是在同一时间读取的,所以会导致有时候场景中高速移动的物体变形得很奇怪。有些例子其实还蛮有趣的。
颜色
现在我们知道 iPhone 是如何测量光打在每个像素上的多少了。但是通过这个我们仅只会得到一张黑白照片。彩色照片还需要额外的技术。在我们深入之前,我们先来看看颜色是什么。我们会稍微偏点题,来看看所谓颜色学的一些皮毛知识、
深绿色的森林的颜色是深绿色的,浅黄色的自行车是浅黄色的,这似乎是天经地义的。但是这种被叫做”颜色“的东西到底是什么的。在计算机领域,我们也许可以回答说某种颜色就是特定量的红,绿和蓝的组合。但是在现实中,要比这复杂得多。
有些人 (CIE) 试图给颜色一个定义,但是最终却只能终结在像这样晦涩和让人迷惑的词句之中:
颜色是一种由有色或无色内容进行任意组合而构成的视觉感知的属性。这种属性可以被色彩名字描述,例如黄色,橙色,棕色,红色,粉红色,绿色,蓝色,紫色之类;或者被无色名字描述,例如白色,灰色,黑色之类,并被像是深,淡,亮,暗这样的名字或是组合进行修饰。
注意:感知到的颜色依赖于颜色的视觉刺激的光谱分布,这种分布包括尺寸,形状,结构以及视觉刺激本身周围的环境,以及观察者视觉系统的适应性状态。另外进行观察的个人的普世经验以及类似场景也会对感知造成影响。
他们通过使用颜色自身来循环定义颜色,虽然被他们叫做了色彩,但这其实只不过是颜色的另一种叫法而已。
视觉感知
如果说要从上边的定义里抽取一点什么的话,”颜色是一种视觉感知“ 这句话算比较重要。一个人必须要看到之后,才能说有颜色。颜色要是离开了我们的感知的话,也就不再存在了。你必须要看到光源,或者某些反射光的东西,才能说出这个东西的颜色。
牛顿首先发现了光是一组颜色谱。可见光包含了波长大致在 380 至 720 纳米的一组波。但是我们在看不同波长的光的时候感觉是不一样的。
人类的眼睛是拥有光子探测器的,其中一些被称为视锥细胞。我们有三种不同类型的视锥:S,M 和 L。每一种类型对不同波长的光会做出不同的响应。这些视锥细胞有时候被称为红色,绿色和蓝色的光感受器。其实这种说法有失偏颇,更精确的叫法应该是赤色,稍微不那么赤的赤色,以及青色。如图所示,其实它们响应曲线有相当大一部分是重叠的:
像灯泡这样的光源拥有着特定的光谱 – 也就是每个波长的光都有特定的强度。相对应的,一个物体,比如自行车的框架,会按照不同的强度来反射或者吸收特定波长的光。对每一种情况,我们可以将光源光谱和物体的反射光谱以及视锥的响应曲线相乘 (其实是沿波长做积分)。对每一个视锥细胞来说,这样做会得到一个计算结果,S,M 和 L 视锥的三个光刺激值就是感知到的颜色。我们的大脑会将青色,赤色和弱赤色的视锥的值组合起来,形成对颜色的感知。事实上,颜色感知并不只依赖于这三个值的,还和空间和时间的信息有所关联。
指定颜色
现在我们知道颜色是怎么形成的了,但是我们如何定义某个给定的颜色呢?我们要怎么描述某辆自行车上那种特定的红色呢?
答案是,我们需要一种叫做色彩空间的东西来定义它。我们可以将色彩空间理解成一种度量单位。
当有人问 “大象能跑多快” 时,”18″ 或者 “2.8” 这样的答案是毫无意义的。我们需要一套度量单位来衡量它,比如 “18 千米每小时”。对于颜色来说也是一样的。当我们问 “这辆自行车是什么颜色” 的时候,我们也需要一套类似的 “度量单位” 来表述我们的答案。这套度量单位就是色彩空间。
虽然细节很复杂,但是色彩空间的主要概念还是非常简单的:如果我们用三个光源 – 一个红色,一个绿色和一个蓝色的光源 – 我们可以将它们以不同强度混合起来以得到各种颜色的光。举个例子,要是我们想要匹配在我们的台灯反射下的香蕉的颜色的话,我们最后得到的值会是 10 份红光,8 份绿光和 4 份蓝光.天空的颜色可能是 4,8 和 10。这些值精确地依赖于我们所挑选的光源 (也就是基本值),在这里是 4,8 和 10。要是我们挑选了另一组光源 (基准值),达到同样的颜色结果时这个数字可能变为 11,9 和 2。我们所挑选的基准值其实就定义了我们的色彩空间。
当被问到 “这辆自行车是什么颜色” 时,我们可以说这是在某一组三个特定的基准值光源下,将它们的光强调整到 23%,45% 和 53% 所得到颜色。其他拥有同样的一组基准光源的人就可以根据这个数字重新创建出这个颜色。
在现在计算机,包括 iOS 中,事实上所使用的默认色彩空间是 sRGB 色彩空间。它的三个基准值是通过 ITU-R BT.709 标准定义的。除了通过三个基准值之外,还有一些其他的不同方式来定义色彩空间,但其实最终它们的概念都是相同的。
值得指出的是,大部分的色彩空间只能对应可见颜色的一个子集。可以看看 sRGB 色彩空间的图表:
马鞍形的图形区域代表了人眼可见的所有颜色。黑色三角形内的区域表示能被 sRGB 色彩空间表达的颜色。三个顶点是这个色彩空间的基准值 – 也就是只有其中一个基准光源全开的情况。三角形区域之外的颜色可以被人眼感知,但却不能被 sRGB 色彩空间表达。还有一点需要特别说明的是:这张图里在三角形之外的颜色看起来好像和三角形边缘的颜色非常相似。这是因为这张图片本身是用 sRGB 色彩空间来表示的,三角形外的真实的颜色在图片文件中是显示不出来的,因此只能回滚到和这个真实颜色最接近的能表达的颜色去。
当我们通过十六进制 (比如 #dde834
) 或者是 UIKit 的 API (比如 UIColor(red:0.867, green:0.910, blue:0.204, alpha:1.000)
) 选取颜色时,我们所表达的其实是 86.7% 的 sRGB 红色基准值,91% 的 sRGB 绿色基准值以及 20.4% 的 sRGB 蓝色基准值所混合的颜色。
RGB 色彩空间和 sRGB 相比有更大的全色域,也就是所能表达更多的可见颜色。CIELUV (也被叫做 CIELAB) 色彩空间就是一个基于 RGB 基准的色彩空间的例子。它也由三个组成部分:代表亮度的 L,以及代表颜色对立维度的 u 和 v (有时候也被叫做 a 和 b)。
更多信息请去看看 Wikipedia 上关于色彩空间的文章,另外尝试用用 OS X 里的颜色实用工具也是熟悉色彩空间的好办法。
白非白
还有一件事情让颜色变得很复杂,那就是我们的大脑其实做了很多处理,来让东西看上去是 “正常” 的 – 这种处理中很大一部分和白平衡有关。我们都知道白色和灰色是什么意思。但是当我们看到什么东西是灰色的时候,事实上在绝大多数情况下其实它并不真的是灰色。但是我们的大脑会 “指出” 在这个光照条件下,它就应该是灰色,所以我们认为我们看到了灰色。
从一幢白色的建筑物上反射出来的光在早上和晚上其实是大不相同的。但是我们的大脑指出建筑物的颜色并没有从一种变换到另一种。这乍看上去很明显,因为我们已经习惯了我们的大脑无时无刻不在处理这些事情。
我们的大脑有能力进行色彩调节 – 它通过调整每种视锥类型的灵敏程度来进行色彩平衡。另外,除了简单的调整以外,我们的大脑还有一些非常复杂的机制。大脑是如何截取那些来自视锥,但又依赖于环境,时间和空间影响的信号的?Akiyoshi 关于视觉的页面展示了一些证明大脑处理能力的令人精神错乱的例子。但是当事情来到相片和颜色时,要记住的是相机只能简单地记录它所看到的东西,正因如此,有时候对我们来说,拍到的东西和它本身看起来的就有可能偏离很远。
当我们使用相机拍照时,相机可没我们的大脑那么聪明。但是相机也有一套自动的白平衡算法来尝试找出场景中的中性颜色 (也就是灰系色)。之后相机的图像传感器将尝试将相片中的所有颜色都按照这个结果来进行调整。有时候这很好使,但也有失败的时候。失败一般是因为奇怪的光照条件,比如场景的一部分被一种光源照亮,而另一部分被另一种光源照亮。
有了以上这些知识,我们就可以来看看我们的数码相机是怎么看到这些颜色的了。
数码颜色传感器
像素传感器自身并不会因为光的波长不同而有什么区别。但是如果在它们前面放一个颜色滤镜的话,像素传感器的响应曲线就会根据光的波长的不同而发生分离变化。
如果我们使用绿色,红色以及蓝色的颜色滤镜,那么有些像素传感器将只接收绿光,有些只接收红光,而有些只接收蓝光 (在现实中,它们将拥有和我们眼睛的视锥细胞相似的响应曲线)。当今的相机几乎无一例外地使用了一种称为拜尔滤镜 (Bayer filter) 的装置。如果使用这种滤镜的话,绿色的像素传感器的数量将会是红色或者蓝色的两倍。它看上去是这样的:
现在数码相机有颜色信息了,但是同时它也丢失了很多信息。我们只知道所有像素中的 1/4 的部分的红色的值。蓝色也类似。而对于绿色,我们知道 1/2 的像素的值。换句话说,66% 的数据丢失了。将所有像素的全部的颜色信息进行还原的过程叫做逆拜尔化 (debayering)。与之相伴的高级算法将将通过为已存在的信息进行插值,来得到一张全分辨率的彩色图像。
即使是一个简单的插值算法也可能要花上很多努力来得到,而随着时间流逝,越来越多的逆拜尔化方法被开发出来解决这个问题。但是也存在一些问题问题,来举例说明:大部分的逆拜尔化算法非常依赖绿色像素的流明数 (光强度)。这样导致的结果是几乎所有这些逆拜尔化算法在几乎全红色的区域表现不佳。这里截取了一张 iPhone 6 拍摄的照片:
注意相比起小册子上的黑色文字来说,iPad 保护壳上写的 “PRODUCT” 的大字中的 C 和 T 字母是非常不清楚的。这是由于图像在 iPad 保护壳的部分缺少绿色信息而导致逆拜尔化的去噪部分无法得到准确信息,从而图像模糊。
缺陷补偿
除了重建颜色信息,相机里的图像处理器还对图像做了一系列的其他调整。
随着图像传感器的像素数越来越多,某些像素中产生缺陷的可能性也越来越高。通常相机里都会有一系列的像素 (通常是整排) 是无法正常工作的。在对原始图像数据进行处理的时候,图像处理器将去修复那些死掉的像素。
图像传感器有一部分区域的像素的位置是在相机接收可见光的区域之外的。这些图像传感器的像素将永远是黑色的。但是它们读出的数据却不是 0。利用这些像素,图像处理器可以通过用包含实际图片的那些像素的值减去它们,来调整图像的明暗程度。通过这个方式,图像处理器也可以补偿大部分图像传感器 (和/或 ADC) 中的内在误差。
文件格式
数码相机的最后一步是将图像数据写入一个文件中。在大部分情况下,数码相片被保存为 JPEG 格式。JEPG 压缩 会调整图像数据以追求高的压缩比。iPhone 6 所拍摄的一张图片的像素数据大约为 23 MB (3.264 x 2.448 x 3 = 23.970.816),但是这样一张图片对应的 JPEG 文件通常只有 1.5 到 2.5 MB。通过阅读话题 #3 的这篇文章来了解关于 JPEG 的更多信息。
有些数码相机允许用户存储一种叫 RAW 格式的文件。相机的图像处理器仍然会对从传感器拿到的原始图像数据做一些处理,但是这个文件所包含的数据将非常接近于真实的像素值。这么做的好处是我们可以在之后的时间点对它做逆拜尔化。
举个例子,OS X 上的逆拜尔化比大部分单反相机上的要强力。与操作 JPEG 文件相比,对支持的相机的 RAW 文件进行操作,可以让我们在不损失画质的前提下做更多的调整。Core Image 中的 RAW 图像处理将把用户定义的各种调整作为逆拜尔化的一部分。相比起来,在操作 JPEG 图像时,调整仅只是事后工作。
想了解更多细节的话,可以查看 OS X SDK 中的 CoreImage/CIRAWFilter.h
文件,以及 WWDC 2014 session 514 的 32:40 的部分。
结语
我们今天使用的数码相机是数十年研究和工程的结晶。我们在这篇文章里勉强勾勒了它所使用到的科技的轮廓。通过这篇文章,我们希望你能够更了解你的 (iPhone) 相机… 以及为 iOS 和 OSX 制作出更好的相片 app。