34. 光场--捕获场景中所有的光线

2020-04-17 15:16:44 浏览数 (2)

在27. HDR - 高动态范围成像中,我向你介绍了把多个不同曝光程度的有限动态范围的图像融合起来,我们可以得到高动态范围的图像

在33. 摄影-怎样对焦才能让不同距离的物体都拍摄清晰?中,我又介绍了另外一种图像融合:把对焦距离不同的图像融合起来,可以得到全焦图像(all-in-focus image):

在11. 图像合成与图像融合中,我还介绍了把同一场景多张空间位置不同的图片融合在一起可以得到全景图像

你可以看到,图像的融合技术有多种多样的用途,很多应用都让人大开眼界。

今天我给你介绍的技术也会用到图像的融合,但内容却和我前几篇文章谈到的相机成像模型高度相关。先来看看今天介绍的技术可以得到的部分惊人效果,我想你一定会对我这篇文章提起兴趣:

超高速摄影

高清高分辨率摄影

拍照后对焦

为了理解本文后面介绍的技术,我们首先得引入一个叫做光场的概念,那就开始吧:

一、一个新概念:四维光场

在29. 小孔相机中,我们看到物体上的一点发出的光线中有少部分(理想情况下只有一条)会穿过小孔在传感器上成像,于是就有了我们熟知的小孔成像

小孔成像的光能利用率很低,因为有大部分光线被遮挡了,但这是只有一个小孔的情况。如果有多个空间位置不同的小孔会怎么样呢?

此时,我们可以通过这些小孔捕获到物体上发出的更多的光线,如果把这些不同小孔的成像融合在一起,就可以有很多有趣的应用。

事实上,这些我们捕获到的所有光线构成了光场集合。这里所说的光场,从论文[2]中的定义来看,应该是指自由空间中某一点在指定方向上的光辐射量。在这篇论文里面,作者介绍了一种非常简单的方法来表述不同位置不同方向的光场,即我们可以用一条光线在两个平行的平面上的交点的位置来表述这条光线:

我们来看一个普通的透镜成像的例子,可以在物空间中任选一个平行于相机镜头的平面,与相机平面在一起构成了一个系统,空间中的光场就可以用一个四维函数L(u,v,s,t)来描述

这里,每一条光线与两个平面的交点分别是(u,v)和(s,t)

我们不仅仅可以把参考平面建立在物空间,也可以建立在像空间,甚至就直接建立在传感器平面上,这时依然可以用函数L(u,v,s,t)来描述光场。注意,这里的传感器平面和上面的物方向的参考平面时共轭的,因此这两种表述方式是等价的。

接下来我们看看这个光场的模型是如何和我上面提到的多个小孔联系到一起的。

现在请你想一想,如果我们固定u=u0, v=v0,s和t可变,那么L(u0, v0, s, t)代表什么?

(停3秒想一想?)

OK,你可能想到了,这就代表了一个物空间中的光线穿过一个位于(u0, v0)的小孔相机在像平面上成像。这里我们相当于在原有的所有光线L(u, v, s, t)中做了一个切片,仅仅取了其中部分光线L(u0, v0, s, t)

那么,如果我们固定s=s0, t=t0, 那L(u, v, s0, t0)的物体意义呢?根据我之前所讲的相机成像模型,我们知道这代表着从物空间中某一点发出的光线在传感器平面上聚焦到了一点上:

论文[2]里面有一个典型的示例图说明我上面阐释的信息:

图中,(a)表示相机平面上每一个点都构成了一个小孔相机,而所有这些点则构成了小孔相机的阵列,这个阵列所成的像在右边展示了出来。你可以看到,每一个小孔所成的像的尺寸是s X t, 而阵列中子图像的数量是u X v

图(b)也展示了一个图像阵列,只不过其中每一个子图像都表述了物体上的一个点。我上面讲过两种共轭的平面建立方式,因此(b)图你可以理解为(s,t)平面上一点发出的所有光线经过了(u, v)平面构成了一幅子图像,所有的点的光线构成了这个图像阵列。

二、获取光场

现在你已经知道了4D光场的概念,那么我们如何能够获取4D光场呢?捕获光场有三种方法:

  1. 阵列相机
  2. 单个相机在不同位置的多次拍摄
  3. 全光相机

下面我为你一一做介绍

2.1 阵列相机

捕获光场的第一种方式是利用多个相机构成的相机阵列。斯坦福大学的Wilburn等在2005 SIGRAPH上展示了他们制作的多种相机阵列(参考论文[3]):

这些阵列的基本单元是廉价的CMOS相机

他们用这个基本单元构成了像昆虫的复眼一样的各种各样的相机阵列,不同的组合方式能够完成不同的功能。

他们的初衷是利用大量廉价、低成像质量的相机构成的阵列来超越昂贵的高端相机,甚至来创造一些传统相机根本无法实现的功能。作者在论文中展示了很多有趣的应用。

首先,他们制作了三种不同类型的阵列相机,用以实现不同的功能。

有专门用于录制室外场景的高分辨率视频的,其基本的相机紧密排列,而且每一个都只有6度的FOV,焦距有50mm,光圈F/2.5,也就是说这个阵列相机是由很多个望远镜头组成的。

这种配置能够实现高清的大视场角高分辨率的视频录制,你可以看看下面的动图和视频:

作者还提到了由于每个相机的曝光都可以分别控制,所以比起对所有相机采用统一的曝光时间,如果能够对特定的相机进行不同的曝光控制,就可以实现高动态范围、高清、高分辨率的视频录制:

另外一种阵列相机由很多更广视角的镜头组合到一起,它们有很大的公共视场,方便把它们录制的视频融合到一起。这里采用的镜头是Sunex的DSL841B, 焦距6.1mm,F/2.6,FOV 57度。

作者对相机阵列中的相机的曝光时刻进行灵活配置,有先有后,然后把结果融合到一起,最终实现了超高帧率的视频录制。

作者还提到阵列相机可以实现“混合光圈”。传统的摄像机当拍摄光线不足的场景时,要么就需要扩大光圈,这会导致景深变浅,一些物体无法对焦。要么时增大曝光时间,这又会导致运动模糊。但阵列相机经过特殊的配置,就可以很好的在这种情况下成像。下面左图是长曝光的成像情况,中间是大光圈的成像情况,而右边这是阵列相机合成之后的结果。

如果相机之间的间距精心的设计,再加上作者创造的一种在时空两个方向进行的平滑插值算法,就能够实现非常平滑的视频拼接和视角转换的功能:

总之,阵列相机能够实现非常多的独特功能,有些功能用单个传统相机是根本无法实现的。下面是作者的演示视频:

2.2 单摄像头的多次拍摄

利用一个摄像头进行多次不同位置的拍摄,也可以捕获光场。在http://lightfield.stanford.edu/,你可以看到利用乐高积木构建的自动拍摄系统,在马达的控制下,可以改变相机的空间位置并进行拍摄(如下图所示)。这种方法和相机阵列类似,只不过是多次拍摄模拟不同位置的相机——很显然它无法像相机阵列一样录制动态场景的视频。

2.3 全光相机(plenoptic camera)

利用全光相机(plenoptic camera)也可以捕获光场。这里plen是拉丁语的"full"的意思,optic则是希腊语的"seeing"的意思,所以plenoptic就是full seeing。

全光相机的基本构成是在传感器平面和相机之间加入小孔相机,这样我们就可以在传感器平面上搜集到聚焦到小孔上的每条光线的信息。

很多个小孔就可以捕捉到全部光场的信息,这就构成了所谓的全光相机

正如前面所说,小孔相机的光能利用率很低,因此我们又可以进一步把小孔替换为透镜:

最初的全光相机由Ng等在论文[4] Light Field Photography with a Hand-held Plenoptic Camera中展示

它的基本主体是Megavision FB4040,其图像传感器是4000x4000的Kodak KAF-16802CE。而作者采用了296x296个微透镜构成的阵列

Ng等在这篇文章里面介绍了全光相机的各种应用,特别是其中的先拍照后对焦,这也正是后面大名鼎鼎的商业化的消费级全光相机Lytro主打的功能。Lytro的第一代产品是这样的:

其内部结构如下图所示,你可以看到它由普通的镜头组加上所谓的光场传感器(Light Field Sensor)所构成,而光场传感器则是在传统的传感器前面叠加了一层微透镜阵列,下面写道这个传感器能够捕捉1100万根光线(即11M像素)

虽然有11M像素的传感器,但第一代的Lytro相机最终成像的像素尺寸却非常低,这是因为它需要将多个像素的信息组合起来构成一幅图像,我们待会会谈到原因。

后来,这个公司又推出了第二代产品,其光场传感器更新到了40M像素,相应的输出图像尺寸也得到了提升。

像Lytro这样的全光相机记录下来的是光场图,如下图所示,放大看可以由更多认识。这里物体上每一点发出的光线都形成了光场图中的一个子图像。

一般来说为了实现后续的各种有趣的功能,需要配合相应的后处理软件, Lytro就提供了这样的商业软件,我们接下来就来看看各种功能的原理:

先让我们再看一次Lytro这样的全光相机的成像过程:

好了,如果我们要得到指定从某个视角观察的图像,应该怎么办呢?这时我们实际上是想固定u=u0, v=v0, 得到由L(u0, v0, s, t)组合而成的图像。由于光场得到的图像是由很多子图像构成的,因此我们应该从这些子图像里面进行采样,且采样坐标都为(u0, v0),如下图所示(红点表示采样位置):

你可以通过下图看到,当我们取不同的u,v值时,我们都可以得到场景的像,但是这些像之间存在视差。

如果我们不是想得到一个小孔的像,而是想得到一定光圈大小的像,应该怎么办呢?

很简单,我们只需要在每个子图像中取一定大小的图像块即可。这相当于要把多个小孔相机的成像加权融合在一起。

这相当于在移动观察者。下面的动图详细说明了这点,当我们选取更多平行于主光轴的光线时,相当于在将相机和对焦平面之间的距离加大。这样我们最终加权融合获取到的图像会更接近一个远心相机,还记得我对远心相机的介绍吗?请回忆32. 镜头、曝光,以及对焦(下)中的内容。你可以看到下面动图中近处的笔和远处的笔在这种情况下尺度越来越趋于一致。

反过来,如果我们将相机和对焦平面的距离缩短,我们会得到一个广角相机的成像,这时候你会观察到明显的透视畸变。

如果我们还想做到模拟对焦到场景中不同的景深效果,即Refocus,那么只需要在每个子图像中取特定的偏移量的块即可

下面的图从另外一个角度阐释了Refocus的原理,本质上Refocus就是选择特定的光线进行加权融合。在Ng等的论文和技术报告中详细分析了为什么是抽取子图像中的一定偏移量的像素进行加权融合,感兴趣的同学可以去读一读。

好了,让我们看一些全光相机的各种成像效果吧:

下面是全光相机的展示视频

2.4 比较阵列相机和全光相机

本文介绍的阵列相机和全光相机都能够以不同的方式捕获空间中的光场信号。阵列相机的重要优点是既能够用于拍照,也能够实现很多视频的特效。但由于需要很多相机组合到一起,因此成本昂贵,制作复杂,而且对相机的选型、相机之间的排列方式、相机的单个控制和组合控制等针对不同的应用都有特殊考虑。

而全光相机相对更加简单,而且更容易制作成便携式设备,这也是Lytro相机的基础技术方向。但其缺点也很明显,由于Lytro相机的第一代的光场传感器分辨率只有11M像素,但它想要实现的功能原理却要求必须把多个原始像素的信息整合起来才能构成一幅图像,因此实际出图的分辨率是很低的,在当时推出后就被消费者所诟病。后来第二代出来,光场传感器分辨率变为了40M,有一定提升,但是比起主流的便携式相机,还是差太远。而且,Lytro的功能很多都需要靠软件后处理来实现,反而使得拍照更加复杂了。同时,它也无法像阵列相机一样拍摄视频。总而言之,这个技术方向的先天缺陷很明显。最终,Lytro被Google所收购,消费级的光场相机这条路就此终止。

其实,对于我所关注的手机领域,上述两种技术所能够实现的效果都已经有了替代方案。

例如,我们现在已经能在手机上进行高速摄影了,因为手机的相机系统的帧率已经越来越高了。另外,采用特殊硬件的手机也已经可以进行视频HDR录制了。“拍照后对焦”这个Lytro引以为傲的功能,早就被多摄像头的组合而实现。我自己从2014年开始就参与了这个功能从硬件选型、工厂生产到算法设计、开发的完整过程——说实话,多摄系统实现的拍照后对焦由于出图的分辨率大,对用户而言实用性远远超过Lytro相机,这也是为何后者被市场所淘汰的原因周一。

但是,阵列相机和全光相机的核心思想我想对之后的消费电子产品的相机设计依然有重要的启示。举个例子,以前人们诟病的是Lytro的光场传感器的分辨率不够,导致实际出图的尺寸不够。但目前已经有很多手机开始主打1亿像素了,例如下面这款——其实远远超过了人们社交摄影的需要。如果这样的传感器再配上全光相机所需要的微透镜阵列,是不是有可能实现出图的尺寸足够人们需要的光场相机呢?当然这只是我脑补YY的,毕竟这是一个非常复杂的软硬件系统工程。

三、总结

今天我给你展示了光场的概念,以及捕获光场的几种方法,尤其重点介绍了阵列相机,以及全光相机。我还给你展示了这些技术所能实现的特效,包括高清高分辨率摄影,高速摄影,拍照后对焦,远心相机等等。希望这篇文章给你启发。

本文篇幅较长,码字不易,别忘了给我点赞送鸡腿哦!?

四、参考资料

本文的参考资料有

  1. CMU 2017 Fall Computational Photography Course 15-463, Lecture 16
  2. Levoy and Hanrahan, “Light Field Rendering,” SIGGRAPH 1996.
  3. Wilburn et al., “High Performance Imaging Using Large Camera Arrays,” SIGGRAPH 2005
  4. Ng et al., “Light field photography with a hand-held plenoptic camera,” Stanford TR 2005
  5. 小米CC9 Pro发布会照片来自https://www.eet-china.com/news/201911061100.html

0 人点赞