漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”

在上一篇直观理解光场中,谈到了光场的基本概念、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)

时间: 2024-11-23 17:21:08

漫谈计算摄像学 (二):利用光场实现“先拍照后对焦”的相关文章

计算摄像学:一种多维多尺度的观察世界的方法

7维全光函数: [参考文献] 曹汛:计算摄像学研究 | VALSE2017之十六 http://www.360doc.com/content/17/1213/20/32196507_712818598.shtml 曹汛:计算摄像学研究 | VALSE2017之十六 - CSDN博客 https://blog.csdn.net/XWUkefr2tnh4/article/details/78955485 计算摄像学:一种多维多尺度的观察世界的方法 http://www.lusterinc.com/2

Android短信监听(二)——利用ContentObserver实现短信监听

MainActivity如下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.app.Activity; /** *

互联网广告与计算广告学入门

转载于:http://www.myttnn.com/ad/internet-advertisement/ 互联网广告与计算广告学是新媒体时代.互联网时代的到来,应运而生的领域.拥有更详尽的数据.更丰富的展现.跨越时间与空间的交互,让更多具有价值的产品与服务更准确的抵达受众眼球.收集了一些互联网上广告与计算广告学相关的课程与资料,以供朋友共同学习. Stanford – Introduction to Computational Advertising 斯坦福的计算广告学入门,课程主要围绕搜索广告

[Computing Advertising] 计算广告学笔记之基础概念

因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师,负责 360 商业化变现的产品和技术.曾任微软亚洲研究院研究员.雅虎北京研究院高级科学家 ( 负责全球搜索广告.受众定向广告.个性化内容等项目 ) . MediaV 首席科学家 ( 负责算法和数据平台 ) .以及搜狐集团研究院负责人,WOT 技术峰会特约讲师. 广告其实是大数据的产物,是大数据最实际的应用.我

[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种.NET中特别重要的缓布技术Cache.利用Cache提升程序性能. 1. 缓存Cache的命名空间 .NET中对缓存有两个命名空间 命名空间1:System.Web.Caching 命名空间2:System.Runtime.Caching 引用范围:这两个命名空间,都可以在Web和非WEB应用程序中

计算广告学笔记之基础概念

阅读目录 1. 广告的价值 2. 传统广告和互联网广告的区别 3. 推荐系统和互联网广告的区别 4. 互联网广告系统研究核心 5. 广告的售卖模式 6. 计算广告中基本概念 7. 参考资料 因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师,负责 360 商业化变现的产品和技术.曾任微软亚洲研究院研究员.雅虎北京研究院高级科学家 ( 负责全球搜索广告.受众定向

从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二) 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (三) 在上一篇博客中,我们简单介绍了基于循环图神经网络的两种重要模型,在本篇中,我们将着大量笔墨介绍图卷积神经网络中的卷积操作.接下来,我们将首先介绍一下图卷积神经网络的大概框架

利用AVFoundation实现Blink拍照和录像的功能

利用AVFoundation实现Blink拍照和录像的功能 by 伍雪颖 github代码 前几天偶然发现一个app叫Blink,闲来无事,纯当练手,于是就尝试下自己实现它的功能. 页面都挺简单的 1.打开相机 - (void)openCamera:(AVCaptureDevicePosition)cameraPostion { BOOL hasCamera = ([[AVCaptureDevice devices] count] > 0); if (hasCamera) { AVCapture

从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包

wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前全世界最广泛的网络封包分析软件 什么是ARP协议    协议分析篇第一个要研究的就是ARP协议.ARP(Address Resolution Protocol,地址解析协议)用于将IP地址解析为物理地址(MAC地址).这里之所以需要使用MAC地址,是因为网络中用于连接各个设备的交换机使用了内容可寻址