到目前为止,我已经介绍了两种用于将模糊的图像变清晰的技术,它们分别是:
- 35. 去卷积:怎么把模糊的图像变清晰?,我介绍了用它来解决镜头光学系统本身导致的模糊
- 36. 盲去卷积 - 更加实用的图像去模糊方法,我介绍了用它来解决相机抖动导致的运动模糊
我注意到了文章下面一些朋友的评论,比如
@sfezzzz
的观点就很有代表性
是的,我们今天就来看看另外一种图像模糊——即失焦导致的图像模糊——应该怎么样处理。
我今天将要介绍的技术,不仅能够从单张图像中同时获取到全焦图像(全焦图像的定义请参考33. 摄影-怎样对焦才能让不同距离的物体都拍摄清晰?),还能顺便获取到场景的景深图。
我想你已经被这个动图吸引了吧,那么让我们先从失焦模糊的原理讲起吧。
一、景深和失焦模糊
1.1 失焦模糊的原理
说起失焦的模糊,我们就要回忆一下我的另外一篇文章31. 镜头、曝光,以及对焦(上)中的内容。
我们看到,当物体位于镜头的对焦面上时,物体上的一点发出的光可以通过镜头在像平面上呈现成一个像点:
但对于不在对焦面上的点,则会形成由很多个像点构成的弥散圆:
弥散圆的大小依赖于当前的对焦距离、光圈值、焦距、传感器的像素尺寸等一系列因素。
从这里你就可以看出,失焦带来的模糊和之前介绍的运动模糊以及镜头本身的不完美导致的模糊是完全不同的。之前介绍的模糊对画面中的每个点都是均匀的,即每个像素对应的PSF都一致。而现在这种由于失焦带来的模糊则是对画面中每个点都不一致的,这是它们的第一个不同。
另外一个不同之处则在于PSF的形状,我们之前讲过衍射极限PSF的形状是这样的:
而相机的抖动PSF则是不规则的,大概长这样:
那么失焦的PSF呢?失焦的PSF其实和镜头的光圈形状高度相关,这里有个动图可以说明:
因此,失焦的PSF相对更加容易测量一些。
1.2 失焦模糊时PSF的测量
当镜头的像距、焦距固定好后,对焦平面也固定了。此时我们可以比较容易的测量出物体偏离对焦平面后的PSF。我们还是可以采用35. 去卷积:怎么把模糊的图像变清晰?中的思想,只不过现在要求的是卷积核c,这就要求我们提前获取到失焦的图像x和清晰的图像b
下面是实施此方法的步骤思想:
- 固定好相机的像距和焦距,这样我们就锁定了对焦平面
- 将平面的物体,例如一个印有特定曲线的标定板放置在对焦平面上并拍照,我们将的到清晰的像 x
- 接着,移动标定板并拍照,我们将得到模糊的像 b
反向使用用去卷积的思想,就可以得到卷积核c。当然实际操作时,通常还需要加入一定的正则化,来限制卷积核中的噪声。
总之,采用类似的思想,我们是比较容易通过提前测量的方式获取到在特定对焦距离情况下的卷积核簇的形状和尺寸的。
此时,聪明的你一定想到如何获取全焦图像了,我猜你是这样想的:
- 先提前标定好各个失焦距离的PSF
- 对输入的模糊图像每一个点,用这些不同的PSF分别做去卷积操作,根据输出的图像的清晰程度,判断哪个是这个点对应的正确尺寸的PSF
- 对所有的局部区域选择正确的PSF进行去卷积,想得到的所有图像块合成起来,就可以得到全焦图像。
- 局部区域对应的PSF的尺寸则形成了场景的景深图
我一开始也和你想的一样,然而以色列理工大学的Anat Levin教授在多年前就指出,这种简单的想法有两个巨大的障碍:
- 即便知道了接近正确的卷积核的尺寸和形状,对应失焦类型的卷积核,也很难通过传统的去卷积方法得到清晰的图像。比如采用经典的Richardson-Lucy方法处理失焦图像很多时候会产生强烈的振铃效应:
2. 用不同尺度的卷积核去卷积后,很多时候很难分清楚哪个更清晰, 特别是比正确尺寸略小的卷积核的去卷积结果很难和正确尺寸的结果相区分, 这导致我们很难为每个区域都选择出正确的卷积核。
这会导致什么后果呢?看看下面这张输入图像
我们采用上面所讲的方法提前标定得到了不同失焦距离的PSF,然后进行局部去卷积,最终得到的全焦图像张这个样子。你可以观察到后面的啤酒瓶都变清晰了,但是前面的食品袋、易拉罐则出现了明显的振铃现象。
那么,如何解决上面这两个问题呢?我们现在才进入今天文章的核心?
二、把失焦模糊的图像变清晰
今天给大家介绍的是以色列理工大学的Anat Levin教授的经典论文
Levin et al., “Image and depth from a conventional camera with a coded aperture,” SIGGRAPH 2007.
在这篇论文中,作者针对性的用两种技术来解决了上面提到的两大问题。我们一一介绍。
2.1 利用自然图像的统计特征来进行更好的去卷积
在35. 去卷积:怎么把模糊的图像变清晰? 和36. 盲去卷积 - 更加实用的图像去模糊方法中,我讲过去卷积其实是一个病态问题,有多种组合都可以产生同样的结果。比如下面两种不同的图像和同样的卷积核卷积后都可以得到一致的模糊图像。但其实只有第一种图像才是我们所需要的。
作者认为,我们可以利用自然图像和非自然的图像的差异作为先验知识,从这些多种组合里面挑选出最佳的结果。
自然图像的特殊之处就是其梯度是稀疏的,我在36. 盲去卷积 - 更加实用的图像去模糊方法里面讲过,自然图像的梯度符合重尾分布。但在当前我们这篇文章里面,Levin认为只需要用到梯度的稀疏性即可,下图是示意图
于是Levin的去卷积思想可以用下图表示
事实上,我在35. 去卷积:怎么把模糊的图像变清晰? 讲过维纳滤波也可以等效于空域中的下面的表示:
这里维纳滤波的正则项是梯度的平方,也是希望惩罚过大的梯度。其实平方梯度和作为惩罚项,相当于一种高斯先验,即假设图像中有很多小的梯度均匀的分布在画面中的各个地方——仔细想想,这其实符合白噪声的分布。所以维纳滤波才会有比较强的去噪作用,因为正则项惩罚了噪声。
但Levin的正则项则是希望去卷积后画面中的梯度更加稀疏,于是采用了下面这样的形式:
让我们来比较一下几种去卷积方法的效果
可以看到利用稀疏梯度的先验信息确实可以得到更好的结果。
2.2 利用编码光圈来提升不同尺度的卷积核之间的区分度
如果说,上面对去卷积的正则项作出的改进还是我们之前所讲的非盲去卷积知识的自然延续的话,那么作者解决第二个问题——即增强不同尺度卷积核去卷积结果的可区分度——的方法就真的是让人大开眼界了。
作者用硬纸板制作了一个小小的掩模,放置在镜头后面。
那么这个Mask有什么效果呢?很显然,根据我们第一节所讲的,它会改变点光源的成像,因此每个尺度的PSF也就不一样了。
这个时候,我们再用不同尺度的卷积核去去卷积,可以很明显看到编码光圈的去卷积结果使得我们更容易区分出正确的尺度和错误的尺度了,因为对于编码光圈,不管是偏大的卷积核还是偏小的卷积核,在去卷积后都会出现振铃效应,而正确尺寸的卷积核则不会。
2.3 完整的过程
有了前面所讲的两点作为基础,作者就进一步解释了如何来获取全焦图像。
- 提前标定好不同尺度的编码光圈卷积核
- 对每个像素i,选择一个局部窗口
,对应的图像为
- 对这个局部窗口,用不同尺度的卷积核进行去卷积,得到局部图像
- 第k个卷积核对应的卷积误差为
- 我们要挑选的是误差最小的卷积核,于是选出的卷积核编号为
- 所以对像素i,其对应的清晰图像为
, 而对应的相对深度可以认为是
- 由于弱纹理,无纹理区域的初始估计不够好,作者还对深度图做进一步优化(不是本文重点,这里我就略过了)
这个过程可以用下图来总结
对每个像素块重复上述过程,将所有像素块的去卷积结果拼接起来,就可以得到一幅全焦图像了,而所有像素对应的
则构成了深度图。
三、效果展示
下面是作者在演示PPT中的效果展示,我们来欣赏一下。
3.1 获取全焦图像
3.2 获取相对景深图
3.3 先拍照后对焦
还可以像光场相机(参看34. 光场--捕获场景中所有的光线)一样实现先拍照后对焦效果
3.4 多视角摄影
有了深度图,作者甚至利用视差原理展示了多视角摄影的效果,你可以看这个视频:http://groups.csail.mit.edu/graphics/CodedAperture/CodedAperture-Video-LevinEtAl-SIGGRAPH07.wmv
四、进一步的原理分析
看到这里,一阵激动之后,你可能突然觉得有哪里不对啊。凭什么说编码光圈就比传统光圈在各个尺度去卷积时区分度更好啊?
我们再回顾一下两个光圈的样子:
可以看到,传统光圈的卷积核通光量更多,产生的画面更模糊,也就是说很多信号频谱都被过滤了。而编码光圈的通光量更少,产生的画面稍微没有那么模糊,所成图像有更多的信号频谱。
如果把滤波器看做是一维的,我们可以用下图来展示两种光圈在频域上的区别,这里展示了两个不同尺度的两种滤波器,分布对应着编码光圈和传统光圈。可以看到编码光圈的频谱有更多的能量为0的点,另外整体的能量分布更广。
先来看看不同尺度的编码光圈对图像信号的影响:
当选择了不正确尺度的卷积核进行去卷积时,由于模糊图像的0点和卷积核频谱上0点的位置不一致,因此去卷积的结果会有明显的振铃效应。因此,不管是从肉眼上观察,还是通过振铃效应导致的过大的卷积误差,我们都很容易判断哪个是正确尺度的卷积核。
再看看传统的光圈,传统光圈的频谱没有那么多0点,因此即便是错误尺度的卷积核,在去卷积时也没有明显的振铃效应。不同尺度结果之间的区分也不明显。
以上就是关键核心思想,作者通过构造特殊的通光形态使得光圈频谱具有较多的0点,从而使得用不同尺度卷积核去卷积的结果更容易区分。作者还比较了不同形态的编码光圈的可判别性,并与传统光圈做了对比。从下图可以看到,传统光圈的可判别性确实不够强,而作者最终选择的形态则具有很强的可判别性。
五、总结
今天给大家介绍了一种可以通过处理失焦模糊的照片同时获取到场景的景深图和全焦图像的技术。这里面的两个关键点是
- 当卷积核是失焦卷积核时,利用稀疏的梯度先验信息进行去卷积,可以得到更清晰的图像。
- 只需要在传统的相机上加一点点小小的改变就能够实现的编码光圈技术,使得不同尺度之间的去卷积结果的区分更加容易。作者专门提到这里面增加的成本仅仅1美元左右。
从今天的文章你可以看到,计算摄影学不仅仅是软件的事情,有的时候也会涉及到一些必要的硬件。我之后还会再更多的文章里面展示这一点。
希望这一篇文章给你带来了新的想法,别忘了给我点赞哦!
最后的最后,再考考屏幕面前的你一个小问题,大家可以踊跃发言,留言区见!
我前面讲过点光源通过光圈后所成的像跟光圈的形状是一致的,那么下面这个传统光圈,它的PSF为何不是中间这张图的样子,而是右边这个样子呢?中间的黑色像素是怎么来的?如果你不清楚的话,可以参考下我之前的文章:35. 去卷积:怎么把模糊的图像变清晰?
六、参考资料
本文的参考资料有
- CMU 2017 Fall Computational Photography Course 15-463, Lecture 18
- Levin et al., “Image and depth from a conventional camera with a coded aperture,” SIGGRAPH 2007., Paper and Slides from groups.csail.mit.edu/gr