手机从拍照到成像,到底经历了什么?

Jack Cui

共 8000字,需浏览 16分钟

 ·

2021-12-01 17:54

在计算机网络中,有一个经典问题:从浏览器地址栏输入 url 后到出现网页,中间经历了什么?那么,对于计算摄影而言,同样有一个问题:从手机上按下拍照按钮到拍出一张照片,中间经历了什么?这是学习计算摄影首先要了解的问题。也是很多做 low level vision 的同学不怎么关注但其实很重要的问题。


本文就从一个小白的角度来介绍一下这个过程,由于网上的中文资料比较零散,本文主要参考 Michael S. Brown 在 ICCV2019 上的讲座以及 CMU 的计算摄影课程,参考链接在文章末尾获取。

手机成像的基本原理

人眼能看到周围的世界,是因为有光子打在我们的视网膜上,并刺激视网膜上的神经细胞发射电信号和化学信号到大脑,从而使大脑的神经元受到刺激,产生画面。

手机成像的基本原理也非常类似。

首先,手机的摄像头也存在类似眼球和视网膜的组件。大家在高中的时候都学过,爱因斯坦在 1921 年因为光电效应获得诺贝尔奖。

所谓光电效应,就是说光照射到某些物质材料的时候,会使后者中的电子逸出,从而实现光信号到电信号的转换。这个过程和视网膜的原理非常类似。基于此,科学家发明出可以接收光信号的传感器 (sensor),具体地我们稍后再介绍。

这些电信号经过一些电子元件的转换之后,最终可以得到数字信号,也就是通常意义上可以存储在内存或者硬盘上的原始图片 (raw image)。为什么叫原始图片呢?因为它是直接通过传感器得到的、没有做任何后处理的数字信号。

这种图片有这些特点:噪声很大、颜色很奇怪、亮度比较低,它们的格式甚至不是我们熟知的 RGB 格式。

很显然,这种图片是没法看的,因此,之后会有一种称为图像信号处理器 (ISP,Image Signal Processor) 的设备来专门做一些图像处理操作。其实,对于人眼来说,进入我们视网膜的光线也是一种很原始的信号,但经过大脑处理后,这种信号就变成多姿多彩的图像。因此,我们也可以说,ISP 是相机的「大脑」。

ISP 一般集成在手机的芯片中,有些厂商 (比如高通) 可能会把 ISP 和 CPU 做成一块统一的芯片,毕竟对于现代手机来说,拍照和其他运算功能都是不可或缺的一部分了。对于专业相机、监控摄像头等具备拍摄功能的设备来说,ISP 也是必须的。

ISP 本质上是一种用于图像处理的芯片,因此说白了,它也是提供一系列图像处理算法,使得原始的 raw 图变成正常的图片。

整个拍照出图的流程可以归纳为下图:

绿色部分就是传感器的功能,它接收光信号后转换为数字信号 (raw image),然后把数字信号扔给后面的 ISP (红框部分) 进行加工处理,最后输出通常意义上所说的图片 (jpg 图)。

下面,我就重点介绍一下传感器和 ISP 的一些工作原理。

传感器Sensor

严格来说,传感器前面还有镜头,为了控制文章篇幅,我们暂时略过这部分,直接从传感器讲起。

前面说了,传感器的基本原理是光电效应,因此,这其中有一个重要的模块,用于接受光子,并激发出电子。但自然界中的光有各种颜色 (频率),每一束光也有强弱亮暗,如何让传感器感知到这些信息,是很关键的一步。

牛顿在十七世纪的时候,通过实验发现光可以被分解为多种颜色,

此后,人们逐渐发现,只要有了红蓝绿三种光,就可以合成各种频段的可见光。

因此,只要让传感器捕获到每一束光的红、蓝、绿三部分信息,再叠加每一部分的强度 (或者说亮度),线性组合后就可以得到这束光原本的颜色信息了。

在这种设想下,柯达公司的拜耳大师 (Bayer) 发明了可以接收三种色光的传感器

这种 sensor 的好处就是,红色的部分会过滤除红光外的其他光,绿色和蓝色也类似:

这种过滤不同色光的组件又称为 Color filter arrays (CFA)

当然,除了这种并排的方式,还可以把它们叠在一起:

但由于效果不如并排的好,因此几乎所有 sensor 都是并排放置的。不过这意味着,对于某个像素点而言,我们只能获得它的红绿蓝中一个通道的信息,另外两个都被过滤了。关于如何恢复另外两个通道的信息,我们后面再讲。

目前主要的传感器有 CMOSCCD 两种电路结构,由于 CMOS 性能更好,因此大部分摄像头都采用了 CMOS 结构。

下图是 CMOS 中一种常见 CFA 排列方式

‍‍‍‍

整个结构可以看作是左上角的四个正方形 CFA 重复排列而成,由于这个正方形是根据蓝绿绿红 (BGGR) 的方式排列的,因此这种排列的 CFA 又称为 BGGR 格式。

除此之外,还有其他许多不同的排列方式:

而且,随着技术的成熟,有很多设计已经不拘泥于红绿蓝三种颜色了。

由于 Bayer 大师首先提出了这种方式的设计思路,因此又经常把这类 sensor 获取到的 raw 图称为 Bayer 格式。

在将光信号转换为电信号后,会有专门的电路负责把这些电信号进行放大,并将这些电信号 (又称模拟信号) 进一步转换为数字信号:

这一块对于学习计算摄影的同学来说,不需要了解太多细节。在之后噪声标定的文章中,我们还会见到它们的。

最后一点,我们要如何获取这些 raw 图呢?在单反相机中,通常可以得到一种 DNG 格式 (也可能有其他格式) 的数据,这种就是直接通过传感器获得的 raw 图。而在安卓手机上,Google 提供了一套接口 android.hardware.camera2,可以在不需要 root 手机的情况下,在应用层接口上获取 sensor 输出的结果,具体可以参考:https://developer.android.com/reference/android/hardware/camera2/package-summary

ISP:相机的「大脑」

好了,现在我们通过 sensor 得到一张原始图片数据了,但它非常的辣眼睛,一般人根本看不下去


这种 raw 图一般长这个样子 (左图是 raw 图,右图是正常的 rgb 图):


前面说了,由于 Bayer 格式的图片会把各种颜色通道的信息都并排放在一起 (相当于只有一个颜色通道),因此在目前的显示设备上只能看到黑白两种颜色。而且,由于 Bayer 格式的图片会按照特定的格式排列 (比如 BGGR),因此整张图看起来呈现出一格一格的「马赛克效应」。
此外,raw 图的存储位数通常很高,大家都知道,我们平常的图片像素值一般是 0~255,总共 256 个数值,用 8 个比特存储,但 raw 图一般会用 16 个比特来存储,数值范围也远大于 255。

因此,接下来就需要用相机的大脑,ISP,来把这些原始图片进一步处理成人眼可以观看的图片信息。

我在前面已经放了一张 ISP 大致的处理流程图:

这里面是 ISP 中一些关键步骤,但其实真正的 ISP 中整个步骤会复杂得多,而且不同产商实现的 ISP,处理流程也有差异。在接下来的介绍中,我会额外介绍一些图中没有的步骤,这些步骤已经比较成熟,算法也比较固定了,但了解它们对我们了解整个成像系统多少会有帮助。

坏点校正 (BPC, bad point correction)

Sensor 作为一种物理器件,难免存在一些坏点 (在全黑的环境下会输出一些亮点),而随着器件老化,这种坏点只会越来越多。因此,ISP 中有一步 BPC 会专门检测出这种坏点,并用类似中值滤波的方式来「消灭」这种坏点。

黑点平校正 (BLC, black level correction)

在 ISP 中有两个很常见的名词:黑电平白电平

所谓黑点平,指的是全黑 (外界没有光子进入相机) 的情况下的电流值。因为传感器本身也是一种电器,难免存在自由电子逸出的情况 (也就是漏电),因此我们会做一下校正,测出镜头在全黑情况下的数字信号大小,并将这个信号值标记为黑电平。常见做法是将黑电平标记为 64,意味着像素值 64 以下的数值都是黑色的。

与之对应的白电平则是 ISP 能处理的最大亮度,可以认为是纯白色。如果用 10 比特存储图片数据,则白电平的数值为 1023 ()。

镜头阴影校正 (LSC, lens shading correction)

由于光在进入镜头后,会从中心向四周扩散,因此我们实际得到的 raw 图可能长左图这个样子 (右图是校正过的):


LSC 就是希望让亮度均匀些,使中心不会过亮、四个角不会过暗。

一个很简单的做法就是中心点的像素乘以一个缩小的系数,而四周的像素乘上一个放大的系数。

白平衡 (WB, white balance)

提问:对于同一张白纸,在不同颜色的光照下,分别是什么颜色的?

上面就是同一个白色的杯子在灯泡、日光灯、以及自然光下呈现出来的颜色。在人眼看来,它们都是白色,或者接近白色,这是因为人脑对事物有一些先验信息,会自动做一些矫正。

但 sensor 只会忠实地记录真实的情况,因此你会看到,相机拍出来的图在橘光下偏橙,在白炽灯下偏青。而白平衡要做的,就是让不同色温光线下拍出来的白色物体都接近白色。

白平衡可以手工完成,也可以用算法自动白平衡 (AWB)。这里介绍一种 AWB 算法的典型算法案例:灰度世界算法 (Gary World algorithm)

灰度世界算法基于一个简单的观察:我们拍的大部分场景的图片中,对所有像素值取均值,结果应该是灰色的 (这是有人通过实验发现的)。灰色是介于黑色和白色之间的颜色,这意味着,R、G、B 三个通道的能量是大致相等的:R = G = B。

因此,我们可以先求出全图中每个通道的均值:

然后以 G 通道 (人眼对绿色更加敏感) 作为基准,求出 R 和 B 两个通道的缩放系数,再把缩放系数应用到每个像素上:


最终得到的图片就更接近肉眼的感知:

灰度世界算法是一种很基础的操作,在一些情况下容易失灵 (比如纯天空背景的图片,色彩均值就不是灰色的),因此后续又出现更多新的适应性更强的算法。

白平衡目前仍然是研究热点之一。对于同样的场景,不同手机拍出来的色温也不尽相同,这里面主要就是不同产商的白平衡算法导致的差异。一般而言,越接近人眼的感知,白平衡算法越好。

去马赛克 (Demosaic)

前面说了,相机传感器得到的图片是一张 Bayer 格式的图片,要想得到正常的 RGB 图片,我们还要做一步去马赛克 (demosaic) 操作。

从上图中可以看出,demosaic 需要把一张单通道的 Bayer 图片拆成有 R、G、B 三个通道的 RGB 图片。其中,对于某个通道来说,有些位置的数值是可以直接从 Bayer 图上获取的,但有些位置是缺失的,demosaic 算法的核心就是计算出这些缺失的值。

一种最简单朴素的做法就是根据周围的像素值进行插值。

比如上图这个例子里面,R5 这个位置只有红色通道有数值,要想计算出这个位置的蓝色和绿色通道的数值,我们可以根据周围已有的四个像素值,用它们的均值作为 R5 在 B 和 G 两个通道的数值。

除此之外,还有其他更加复杂但效果更好的算法,可以提高清晰度,同时降低噪声等,这里不再展开介绍。

去噪 (Denoise)

去噪可能是大家最熟悉的步骤 (不管之前是否了解整个成像流程)。

ISP 中的去噪算法可能会在 Bayer 图上进行,也可能做完 demosaic 后在 RGB 图上进行,但去噪原理没有本质不同。去噪算法的本质都是根据周围的像素值,对当前像素的数值进行修正:

上图就是经典的均值滤波和中值滤波算法,前者是直接将一个格子里的像素值取平均作为当前像素的数值,后者则是用格子里所有像素值的中位数来代替当前像素值 (因为噪声往往是异常点,出现的概率低)。

针对不同的噪声类型 (形态),滤波器的选择至关重要。而不管是传统的去噪算法,还是用神经网络的去噪算法,本质上都是在找一个更合适的滤波器而已。不过,神经网络模型由于包含海量滤波器,而且可以通过大量数据总结出经验,因此现在效果较好的去噪普遍都是基于神经网络的方案。

在神经网络学习去噪的过程中,噪声形态的影响非常大,不同传感器表现出来的噪声形态差异巨大,因此,如果可以估计出正确的噪声模型,我们就可以仿真出更加真实的噪声数据用于训练模型,这对模型效果的影响至关重要。这一点我们在之后的文章中再细讲。

通常来说,将 ISP 的去噪模块中直接使用神经网络进行去噪,比做完整个 ISP 流程再去噪效果更好,因为 ISP 中有些步骤会破坏噪声模型,而这种破坏是很难模拟的。

颜色变换 (Color Transforms)

前面提到的白平衡算法主要是对白色进行校准,而这一步则是对除白色以外的其他颜色进行校正。

人眼能看到不同颜色的光,是因为不同色光的光谱各不相同。科学家通过实验发现,人眼所接收的光谱大概是这个样子的:

这个东东又叫做 CIE-XYZ 颜色空间,如果传感器接收到的光谱频率和强度也能和这个频谱图匹配上,那得到的图像的颜色信息就和人眼的感知比较接近了。

然而,传感器由于本身工艺上的差异,不可能百分之百和人眼一致。比如下面这张图,左边显示了尼康、索尼等不同产商的传感器接收到的光谱图差异:

颜色转换很重要的一步就是把不同传感器的颜色校正到标准的 CIE-XYZ 颜色空间 (当然实际操作中是校准到更便捷的 ProPhoto 空间,但本质都是要校准到一个跟硬件无关的、独立的颜色空间)。

校准方面很简单的做法是,用已有的相机拍标准色卡

这个标准色卡上面的颜色都是跟人眼匹配的,我们用相机拍色卡之后,用相机本身的颜色,和色卡上的颜色值组成数据对。然后,可以用一个简单的线性变换来拟合这些数据对:

求出这里面的 后,对相机的颜色做一个线性变换,就大致校准到标准颜色空间了。

大部分情况下,我们会省略 ,直接用 来拟合数据,求解出来的矩阵 是一个 的矩阵,通常把这个矩阵叫作颜色校准矩阵 (CCM,Color Correction Matrix)。

颜色是一个相当复杂的课题,可以专门开一个 topic 长篇大论讲下去,限于笔者学识有限,一些很重要的点暂时无法深入介绍。

色调映射 (Tone mapping)

人眼的视觉系统是一种很神奇的构造。在光线较差的暗环境中,人眼会自动调节对比度,从而对暗区的细节更加敏感 (这是进化中形成的能力,可以帮助人类躲避危险)。

但传感器可没这么智能,它只会忠实记录环境的亮度。下图里面,左边就是传感器实拍的环境光亮度,右边是人眼感知的亮度:

此外,大家可能有这样的经历,在夜晚的环境下,有时候为了拍清楚很暗的区域,比如天空,我们需要把曝光时间拉长,但这样操作后,虽然天空是更亮了,但原本亮的地方就过曝了 (比如下面这个例子,右图的天空虽然更亮,但建筑就过曝了):

这是因为真实世界的亮度范围是很大的,但传感器能接收的亮度范围却比较窄:

tone mapping 要做的事情,就是让图片的亮度或者色调尽可能接近人眼,把暗区的亮度提上来,增加对比度,同时压低亮区的亮度,防止过曝。

tone mapping 的基本做法是用不同的函数曲线,对原图的像素值重新做映射 (和 gamma correction 很类似):

一般来说,会根据映射曲线计算一个查找表格,我们可以直接从这个表格中找出原像素值对应的映射后的像素值。如果是针对 RGB 三种颜色的映射曲线,那么查找表格就是 3D 的,否则一把是 1D 的。

在这一思路指导下,tone mapping 通常有两种实现方法:global tone mappinglocal tone mapping

global tone mapping 的思路就是全图采用统一的映射曲线:

而 local tone mapping 则是不同区域采用不同的映射曲线,比如,在下图所示的算法中,我们会根据边缘和色彩信息来决定哪些区域需要提高对比度,哪些区域应该保持原始亮度 (结构信息):

Tone mapping 算法也是研究热点,目前还没有哪种 tone mapping 算法可以 hold 住所有情况,针对特定的场景,一般都还需要选择或者设计针对性的 tone mapping 算法。

图像压缩

图像压缩想必学过图像处理的同学都不会陌生了。由于图片数据量比较大,为了减小存储空间,通常会把图片数据进行压缩,丢弃那些肉眼无法识别的信息,再用一些编码技术来提高信息利用率。最常用的编码格式当然就是 JPG 格式了。

除了以上提到的步骤外,还有其他模块,比如 HDR、自动曝光控制 (AEC)、锐化、gamma 校正等,也是  ISP 中比较重要的模块,对最终成像效果有比较大的影响。限于篇幅这里不展开介绍了,我们以后有机会再讲。

总结

这篇文章简单介绍了手机成像的整个流程。总的来说,硬件和软件的协同,共同影响着成像质量的好坏。但目前来看,硬件 (传感器) 仍然决定着图像质量的上限。

大家也看到了,整个成像的流程非常复杂,但我们在用手机拍照的瞬间几乎是无感秒拍出图,这主要得益于 ISP 芯片的加持,这种芯片经过这么多年的发展,技术已经相当成熟,很多算法直接固化 (汇编代码编写) 在芯片里面,因此速度非常快。

但这并不意味着这里面每个算法都很成熟了,大家如果在晚上拍照,不管使用哪种高端手机,都会发现要么噪声很大,要么色彩失真,总之在你眼中如诗如画的景象,到了手机上就是渣画质了。

近些年随着深度学习的优化,计算摄影有了一些新的突破,很多以前实现不了的功能,现在几乎是标配了 (比如背景虚化这个功能,随着人像分割愈发成熟,效果有了质的飞跃),有些效果在画质上也正在逐渐逼近单反的效果,而后者可是通过昂贵的硬件实现的。

不过,有些同学 (尤其是还在读书的同学) 可能觉得,为啥要了解这么复杂的成像过程呢?直接在最终输出的图片上再跑算法不就好了?

确实,如果是做一些 high level 的任务 (识别、检测、分割等),那完全没必要了解这么复杂的流程,但对于计算摄影这样的 low level 任务 (去噪、超分辨率等) 来说,好的数据源是非常重要的。

就拿某公司非常成熟的超分方案来说,由于 ISP 中某些步骤会破坏细节纹理,因此,只有在 ISP 中集成进超分算法,和 ISP 的功能联调后,才可能做出满足工业界要求的图像或者视频超分辨率产品。另外,对于去噪来说,噪声模型尤其重要,而 ISP 中的去噪模块会破坏噪声形态,因此也必须对整个成像过程有比较深刻地理解才能做好去噪。(这一点我们在之后介绍噪声模型的文章中再细聊)。

这篇文章只是简单介绍了一下整个成像流程,忽略了很多细节,权当是给小白快速入门准备的。我自己也还在学习研究当中,如有错误,欢迎大家指正。

后面也会介绍一些我觉得比较重要的知识,感兴趣的同学欢迎关注一波^0^

参考

https://www.eecs.yorku.ca/~mbrown/ICCV2019_Brown.html
http://graphics.cs.cmu.edu/courses/15-463/2019_fall/
https://zhuanlan.zhihu.com/p/374450578
·················END·················

推荐阅读

•   这个项目,我能玩一年•   这两个练手项目,我王多鱼投了•   我的十八般武器,这波稳了

浏览 308
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报