光场的可视化与重聚焦原理(附重聚焦代码)

2023-10-29 20:40

本文主要是介绍光场的可视化与重聚焦原理(附重聚焦代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为计算光学成像领域的一个重要分支,随着近年来光场相机的发展,光场成像得到了越来越多的关注。本文主要介绍了光场的三种可视化途径(阵列子图像、宏像元图像与极平面图像),并分析了光场重聚焦的基本原理。

图1:四维光场在不同维度的可视化表现

光场成像专栏:

光场成像的历史与发展

光场的可视化与重聚焦原理

阵列相机光场去遮挡网络 DeOccNet(WACV2020)

一、光场的可视化途径

因为光场的双平面模型L(u,v,x,y)有四个维度,而图像通常只包含两个维度,因此我们难以直接通过2维图像对4维光场进行描述。然而,我们可以通过固定两个维度,将4维光场投影为2维图像,从而对光场进行观察。这个过程称作光场的可视化。根据所固定维度的类型不同,我们可以得到阵列子图像、宏像元图像与极平面图像三种不同的可视化形式。下文分别对这三种可视化途径进行分析。

(1)阵列子图像

图2:四维光场表达为阵列子图像方式示意图
 

由于相机平面上每一个采样点都可以采集到当前场景的一幅二维图像,因此如果固定相机平面的两个坐标 u=u0, v=v0, 则四维光场可以投影为坐标为 (u0, v0) 的相机所拍摄的子图像。若将光场中每一个视角的相机采集到的子图像看成一个整体,并按照相机平面的坐标顺序将子图像排列为一个阵列,则4维光场可以表达为“阵列子图像”的形式,如图2所示。在获取阵列子图像的过程中,我们固定了相机坐标,这使得每幅子图像反映的是光场的空间信息。由于阵列中的每张图像都对应着相机平面上的不同的采样点,其视角有着微小的差异,这种视角的差异体现在图像上就是不同子图像中同一物体之间存在的位置差异(disparity)。因此,所有的子图像可以联合反映出光场中的角度信息。

(2)宏像元图像

图3:四维光场表达为宏像元图像方式示意图

光场成像与传统成像方式不同之处在于——前者不仅仅可以记录光线的强度信息,还可以记录光线的方向信息。在光场的双平面模型中(参考光场成像的历史与发展),光线方向信息的记录可以理解为穿过像平面上点 (x0, y0) 的不同方向的光线在相机平面上映射为不同的坐标。如果固定x-y 坐标,将不同相机所拍摄的同一位置的像元组合在一起,则可以反映穿过 (x0, y0) 这一点的光线的角度信息。这个由多个像元组合而成的集合称为“宏像元”,如图3所示。宏像元内像素的数量为相机平面上采样点的数量,如果使用阵列相机进行场景获取的话,则对应阵列相机中子相机的数量。如果将所有的宏像元看成是普通的像元,按照单张场景图像的排列方式组合在一起的话,则构成了表达4维光场的另外一种方式——“光场宏像元图像”。

(3)极平面图像

图4:四维光场表达为极平面图像方式示意图

前面两种理解光场的方式分别是通过固定相机平面上的点(阵列子图像)或像平面上的点(宏像元图像),将另外一个平面的点组合在一起。阵列子图像在获取的过程中固定了相机平面的两个坐标,更侧重于反映光线的空间分布信息;宏像元图像在获取的过程中固定了像平面的两个坐标,更侧重于反映光线的角度分布信息。如果固定相机平面的某一个坐标(不失一般性地假设为u=u0 )与像平面的某一个坐标(不失一般性地假设为x=x0),则可以获得光线空间与角度分布的混合信息。如图4所示,这样形成的图像称为“极平面图像(Epipolar Plane Image,EPI)”。

EPI是多视角计算机视觉中的一个重要概念。不同于前面的阵列子图像与宏像元图像,单张EPI既包含光线的空间信息,也包含着光线的角度信息。综合考虑这两种类型的信息,在一幅EPI中就可以推断场景的深度与结构:假设空间中的点向各个方向发出的光线强度相等(即满足朗伯表面的性质),则该点对应于EPI中的一条纹理线,而纹理线的斜率可以映射出该点的深度信息。

(4)讨论

光场的高维度特性是光场图像处理(如光场图像超分辨、光场深度估计、光场视角重建等)面临的主要难题。以上讨论的三种可视化方案均为4维光场在不同空间的投影。对于不同的任务而言,采用不同的投影方式会取得不同的效果。例如有很多光场深度估计的算法选择基于对EPI图像中纹理线的斜率进行分析;arXiv上最近挂出的光场图像超分辨网络 LF-InterNet 则巧妙地通过阵列子图像与宏像元图像两种形式进行信息交互,大幅度提升了超分辨的性能。

二、光场图像的重聚焦

重聚焦作为合成孔径成像的一种最简单的形式,本质是利用“不同深度的物体在多视角子图像中对应的disparity不同”这一基本原理,将多视角子图像按照规律进行平移并叠加,最终凭借较大的等效孔径实现“浅景深”的效果。为了深入理解多视角子图像的叠加,我们首先利用双目图像(图5)对基本原理进行简单说明。

图5:双目立体图像重聚焦原理示意图

如图5(a)所示,假设我们利用双目相机对当前场景从左侧和右侧两个不同的角度进行拍摄,所拍摄的图像分别如图5(b)和图5(c)所示。由于距离相机较近的物体具有较大的视差,因此图中的矩形在双目图像中的disparity较三角形更大。如图5(d)所示,如果将两张图片进行平移,使得矩形重合的话,则不在同一深度的三角形由于disparity不匹配,无法同时重合,此时我们则称矩形处于聚焦状态,三角形处于失焦状态,反之同理。平移两幅图像使得某一深度的物体处于聚焦状态的操作称为“重聚焦”。

图6:光场重聚焦原理示意图

相比于双目图像,光场图像具有更多的视角,这也使得光场重聚焦涉及到多幅图片的联合位移与叠加。为了便于说明光场重聚焦的原理,我们作图6。图6(a)所示为光场子图像阵列,其中的图片之间具有一定的视角差异。由于disparity与深度存在反比关系(参考光场成像的历史与发展),因此物体所在深度越大,对应图像的disparity越小,无穷远处的disparity为0。在通常情况下,为防止图像之间disparity的绝对值过大,这些子图像会首先经过预处理使得场景中某个深度值(称为校正深度)对应的disparity为0,从而使得大于校正深度的物体对应的disparity为负值,小于该校正深度的物体对应的disparity为正值。预处理后,如果将这些图片直接进行叠加,则校正深度的物体由于disparity为0而处于聚焦状态,其他深度的物体则经历不同程度的焦外虚化。

图6(b)形象地说明这个过程,我们取光场子图像阵列中的某一行或某一列的5张图像叠加在一起,用不同颜色的直线从纵向穿过不同深度的物体的同一点,则处于聚焦深度的物体对应的直线应当是竖直状态的,而其他深度的物体对应的直线处于倾斜状态。且直线越倾斜,对应的物体所经历的失焦就越严重。如图6(c)所示,当子图像经过联合位移后,各条直线的状态会发生改变,对应于不同深度的聚焦状态发生改变。

我们在斯坦福大学光场数据集的 Lego Knights 场景中进行了重聚焦实验,图7展示了光场重聚焦的效果。

图7:光场重聚焦效果展示图

最后,笔者给出了光场重聚焦的一个示例代码(Demo),相关下载链接为:https://github.com/YingqianWang/Light-Field-Refocusing-A-Demo

更多《计算机视觉与图形学》知识,可关注下方公众号:

这篇关于光场的可视化与重聚焦原理(附重聚焦代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303219

相关文章

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例