一、对焦栈与全焦图像
怎样对焦,才能让场景中不同距离的每个物体都拍摄清晰?如果你喜欢摄影,在构图和取景时我想这个问题一定困惑过你。如我的文章31. 镜头、曝光,以及对焦(上)所说,镜头是有景深的,因此景深范围内的物体可以清晰成像,不在这个范围内的物体则会显得模糊。
如果你已经看过我之前的文章29. 小孔相机, 那么你可能会认为采用小孔相机就能解决问题,因为小孔相机的景深无穷大:
很可惜,小孔相机有自己的缺陷,它的图像质量不高,特别是孔越小,噪声越大。由于大部分光被遮挡了,因此其能效也很低。
那么还有没有更好的方法呢?
在27. HDR - 高动态范围成像一文中,我们看到了,如果把不同曝光的图像组合起来,会得到一张高动态范围的图像。而今天这篇文章,我会告诉你,如果把对焦距离不同的图像融合起来,你会得到一张全焦(all-in-focus)图像:
我们称这些对焦距离不同时得到的图像为Focal Stack Image,下面就是一个典型的例子(已经合成为了一个视频):
二、获取对焦栈图像
如何得到对焦栈图像呢?想一想在下图中,你要改变哪些参数,才能获取到对焦距离不同的图像?
事实上,你有多种方法:
- 改变像距D':在31. 镜头、曝光,以及对焦(上)中,我们看到了物距和像距之间的关系,如果像距D'改变,对焦平面的物距也会改变
2. 直接改变物距D: 你可以手动移动相机,也可以像下图一样采用一些特别的设备:
下面是一个典型的对焦栈中的三帧图像,你可以看到它们分别有不同的对焦距离
三、生成全焦图像
假设我们已经获取了对焦栈, 接下来的问题就是如何把它们合并在一起,获取到全清晰的图像了,有时候称为全焦图像(all-in-focus image)
这里面有很多种方法,我先介绍一种最容易理解的方式,它分为几个步骤
- 对齐图像
- 对每个像素赋以一个权重,代表它的清晰程度(也就是它对焦的准确度)
- 求这些图像的加权平均,获取到最终的图像,就是我们所需要的全焦图像
步骤一:对齐图像
首先我们来看看图像对齐,为什么要对齐图像?一个显而易见的原因是我们在拍摄的时候,相机可能是手持的,可能位于不稳定的平台上等等。但即使相机是位于一个稳定的三脚架上,我们也需要对齐图像,你能想到是什么原因吗?(此处停顿思考3秒?)
嗯,也许你已经想到了,当我们通过改变像距、物距来获取不同对焦距离的图像时,图像的放大倍率也会改变:
此时,不同放大倍率的图像就无法简单的融合到一起了。下面是两个图像不对齐的例子,第一个只有放大倍率导致的不对齐,而第二个则还有相机抖动导致的不对齐(手持拍摄)
对于相机运动导致的图像非对齐情况,我们暂不讨论。现在假定是只有改变像距导致的放大倍率不一致,那么如何对齐图像呢?
我之前在31. 镜头、曝光,以及对焦(上)讲过,放大倍率可以用如下公式表示。因此,如果我们知道相机的焦距和各个像距,就可以求出m。只要据此对图像缩放到一致的尺寸,即可完成对齐
步骤二:求取权重
正如前面所说,步骤二是衡量每个像素的清晰度,并以此作为该像素的权重。
一个简单的方法是用拉普拉斯算子,求取图像的二阶梯度(参看3. 数码相机内的图像处理-基本图像滤波)。为了避免图像噪声的影响,同时又假设图像的局部清晰度具有平滑性,因此再对拉普拉斯滤波的结果做一次高斯滤波。如下图所示:
这里介绍的是一个非常简单易理解的方法,事实上当然还有很多选择。总之,我们会把这一步求取的清晰度作为每个像素的权重,然后进入到第三步。
步骤三:加权融合
第三步很简单,就是把各个图像(对齐校正后)加权融合到一起:
最后我们就可以得到全焦图像了:
对焦栈在获取全焦微距图像时非常有用,因为此时相机的景深非常浅,单个图像中很多部分都是模糊的。因此把多帧图像融合在一起,得到的结果更好, 下面是个例子:
对焦栈动图:
全焦图像
不仅如此,由于我们知道了对焦栈中每个图像每个像素的权重,还可以对权重进行排序比较,据此得到每个像素对应的最清晰的图像。这样就知道了每个像素的最佳像距和物距——也就是说,最佳权重反映了每个像素的对焦距离:
Depth from Defocus - 从对焦栈获取深度图
这说明我们可以通过对焦栈得到场景的三维信息,这就是所谓的depth from defocus技术
四、用手机获取对焦栈
对焦栈是非常有用的技术,但早期它只能应用于实验室等相机固定的场景,如果相机移动,一般的方法很难把图像准确的对齐。
但是在2015年,Suwajanakorn在CVPR发表了他在Google做实习生时的研究成果:Depth from Focus with Your Mobile Phone,展示了他通过手持手机拍摄并获取对焦栈,并以此生成全焦图像或深度图的具体方法。
在这篇文章中,作者提出了一种创新性的方法来对齐图像,他没有采用其他学者采用的单应矩阵或者放射矩阵等刚性的对齐方式,而是采用了光流来进行图像间的稠密对齐。并且,由于图像是顺序拍摄的,因此他还利用了图像之间的时序相关性,来连接图像间的光流场,论文里面提到的公式如下,用白话来解释就是(第i张图像和第1张图像之间的光流场 = 第i张图像与第i-1张图像之间的光流场 合并 第i-1张图像与第1张图像之间的光流场)。
这样,所有的图像都可以以第1张图像为标准来对齐,论文中用下面的公式来表示对第i张图像利用它与第1张图像之间的光流场来进行变换。
下面是作者给出的对齐前和对齐后的机组图像的对比:
生成的全焦图像
生成的全焦图像
生成的全焦图像
作者在文章中还把生成深度图和全焦图像看成了一种最优化的过程,这样所生成的结果就比我上面介绍的简单的加权融合的方法要好很多了。
下面是作者给出的更长的演示视频:
论文里面还展示了多个场景的全焦图像和对应的深度图,看起来都很不错。
五、总结
今天给大家介绍了对焦栈,通过它可以生成全焦图像,也可以获取到场景的深度图,是一种有用的技术。Google在2003年就提交了Depth from Focus with Your Mobile Phone的专利,并在2005年正式获得了此专利。所以如果你看到上面的文章后想开发手机上的应用,应该是被我误导了? 这个专利还要十几年才过期?
总之,希望这篇文章给了你启发,别忘了给我点赞哦!
六、参考资料
今天的文章主要参考了这些资料:
- CMU 2017 Fall Computational Photography Course 15-463, Lecture 16
- Suwajanakorn et al., “Depth from Focus with Your Mobile Phone,” CVPR 2015.
- Suwajanakorn的主页supasorn.com/上提供的素材