漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”
本文和该系列均以搬运至知乎: https://zhuanlan.zhihu.com/p/24983091
在上一篇直观理解光场中,谈到了光场的基本概念、3D性质、实际应用中的采集办法和插值求任意光线的办法。这一篇继续上一篇的基础上给出利用光场实现“先拍照后聚焦”的原理和基本步骤。
对焦与光路
首先,什么是对焦呢,我们先简单回顾一下中学物理。
先看左图,物体端的对焦面就是最上方的平面,从这个平面上的每一点发出的光线最后都汇聚在另一端的像平面上,一个典型的光路如加粗的四色直线所示。如果希望物体端的焦面移动到和原焦面到透镜之间的位置,可以看到光线仍然是那些光线,但是聚焦到像面的光线组合就不再是之前的光线了,比如右图里,加粗的光线除了红线以外,黑绿蓝三色的光线都不再是原来的那几根。对应对焦的基本光路,再回来看光场,根据上一篇文章中介绍过的光场的基本原理,很自然的,我们会想到,只要把在一个物平面上发出的光线所对应的像素叠加在一起,不就实现了重聚焦了吗?事实上这就是最简单的基于光场的重聚焦算法,叫Shift-and-Add[1]。
先拍照后对焦的算法
还是借助上一篇文章中的配图来讲解Shift-and-Add算法:
如左图所示,在原始的采集位置上,蓝色光线在两幅采集到的图像里分别对应于不同的位置,所以如果要对焦于蓝色的方块,则需要将他们的相对位移消除,这一步就是Shift,然后在把两个像素的平均值求出作为对焦后的新图像的像素值,则得到了对焦于蓝色方块的图像。同样道理,对于更远的绿色三角,则进行更大距离的位移来消除对应像素之间的相对距离,然后叠加得到新的对焦于绿色三角的图像。需要注意的是,如上面的小图所示,移动叠加之后,边缘部分总是有些像素是不重合的,所以或多或少都会形成瑕疵。
具体到上篇文章里手机拍的照片例子,就是按照每张照片采样位置相对于中心位置进行等比例的移动,就可以得到在不同物平面上重聚焦的图像,比如我们选取9个采样点的中心点作为中心位置的话,将其他8个采样点放置到不同位置上,就对应得到不同的重聚焦图片:
绿圈位置对应图像:
蓝圈位置对应图像:
就这么简单。那么,Lytro中的算法是不是Shift-and-Add呢?答案是否定的,Lytro的算法是把平移-叠加这种空域的算法放到了频域执行。基于的原理叫做中心切片定理,这里只简单提两句,中心切片定理是二维的,不过其基本原理可以拓展到任意维度,Lytro中用的是其在4维时的应用。简单来说就是把4维的光场进行傅里叶变换之后,在4D的傅里叶空间内,不同位置的重聚焦图片分别对应一个穿过中心的不同角度的二维傅里叶空间的插值切片的逆傅里叶变换。所以本质上而言,这种办法和Shift-and-Add没有区别,只不过是把线性操作换到了频域空间。shift-and-Add每次产生新的重聚焦图片时都需要用到所有采集的光场信息,算法复杂度是\(O\left( {{n}^{4}} \right)\)。而如果是从变换后4D数据里产生新的重聚焦图片,则分为两步:1) 求插值得到2D的傅里叶空间切片,复杂度是\(O\left( {{n}^{2}} \right)\);2) 二维傅里叶逆变换,复杂度是\(O\left( {{n}^{2}}\log n \right)\),当然为了得到4D的傅里叶变换还有一步初始化计算,复杂度是\(O\left( {{n}^{4}}\log n \right)\)。所以在已经有了采集到的4D数据需要不断生成新的重聚焦图片的场景下,在频域的重聚焦算法时间上更经济一些。更多关于频域重聚焦算法的详细,有兴趣的朋友可以参考[1]。
另外特别要提的一点是,在这种Shift-and-Add框架下的重聚焦算法,和实际相机成像的图片是有区别的。原因就是第一节中对焦与光路部分。可以看到在凸透镜光路中,不同位置上对焦的光线是互相不平行的,而Shift-and-Add算法下,所有光线都被认为是“平行”移动的,所以在重聚焦后的照片中,虚化的部分图像是不一样的,然而这种差距对于人眼来说,其实也没那么大差别。
插值法去重影
可能有的朋友看到这里已经发现了,虽然重聚焦是完成了,可是重对焦后图像的质量并不好,比如上一节中对焦在Dell标志上的一张:
花朵的部分有很明显的重影,和用相机镜头照出来的显然不一样。通过前面部分的原理讲解,这个原因也是很显然的:因为只有9个采样点,在移动-叠加的过程中,不同图像对应像素的移动超过了一个像素,则叠加后的图像就会出现这种类似于重影的瑕疵。其实这个问题解决起来也很简单,记得在上篇文章中,已经讲过如何通过插值得到虚拟位置采样的图像,所以很自然地,我们只要通过插值,让采样点更密,密到每一个采样点和相邻采样点的图像上的对应像素的位移都小于或接近一个像素,那么视觉上这种重影的现象就可以消除了。得到的结果如下:
最后来个连续变焦的动图:
光圈的模拟
许多人在用传统相机拍摄“虚化”照片时喜欢通过调整光圈来控制虚化的程度。这在基于光场的重聚焦中也是可以模拟的,道理很简单,就是将采样的范围调整就可以了。还是用上一篇文章中的例子,比如用所有的采样点(包括插值得到的):
得到的图像:
而如果只采用中间一小部分的采样点的话,相当于小光圈:
则得到虚化程度比较低的图片:
[1] R. Ng, "Digital Light Field Photography," PhD thesis, Stanford University, Stanford, CA (2006)