LFToolbox0.4官方使用文档说明

LFToolbox0.4官方文档

  • 1 变化和未来计划
  • 2 安装Toolbox
  • 3 一个快速指南
    • 3.1 编译取样光场
    • 3.3 基础滤波
    • 3.4 运行简单的取样标定
      • 3.4.1 标定
      • 3.4.2 验证
      • 3.4.3 清理和验证
    • 3.5 除了样本:使用你获取的光场
  • 4 细节编码
    • 综述
    • 4.2 分析白图像
    • 4.3 编码一个微透镜图像
    • 4.4 编码光场的结构
  • 5 细节标定
    • 5.1 标定结果
    • 5.2 整改结果
    • 5.3 控制矫正
  • 附录A 使用Lytro 文件工作
    • A.1 提取白图像
    • A.2 定位图片文件
      • A.2.1 LFP, LFR, lfp 还是 lfr?
      • A.2.2 缩略图
  • B 相关功能

1 变化和未来计划

见ReadMe文件

2 安装Toolbox

    解压Toolbox至一个正确的路径,运行程序 LFMatlabPathSetup来安装Matlab路径。每次重新开启Matlab时都要设定这一步骤,所以你可以考虑在startup.m添加语句,例如:

run('~/MyMatlabCodee/LFToolbox0.4/LFMatlabPathSetup.m')

3 一个快速指南

3.1 编译取样光场

  1. 下载LFToolbox并且解压缩至正确的路径。运行LFMatlabPathSetup.m来创建Matlab的路径。
  2. 下载在这里取样光场包,解压至他自己的文件夹内。取样文件夹的结构的选择是为了方便添加您自己的相机和校准:

Samples ----------------------------------------------取样上级
      Images -------------------------------------------取样光场图片
             F01 ------------------------------------------F01图片
             Illum -----------------------------------------照度图片
      Cameras -----------------------------------------存储一个或多个相机的信息
             A000424242 -------------------------------用于测量F01取样的相机
                         CalZoomedOutFixedFoc -----一个单独校正结果
                         WhiteImages----------------------F01相机的白图像
             B5143300780 ------------------------------用于测量照度取样的相机
                         WhiteImages ---------------------照度相机的白图像

    从Matlab打开到顶层的示例文件夹。如果你的路径正确,Matlab命令ls会列出上级文件夹

Image
Cameras
  1. 运行LFUtilProcessWhiteImages来建立一个白图像数据库。这一步骤在Cameras文件夹中寻找白图像,每个白图像形成一个微透镜网格模型-网格模型存储为*.grid.json。白图像的数据库存为 Cameras/WhiteFileDatabase.mat,并且用于选择合适的白图像来编译每个光场。 对于Toolbox0.3版本,取样附带预先计算的.grid.json文件。这些文件可能在他们重新生成过程中被移除。这样做的时候,对于每个微透镜网格模型,给出如图1所示的图,以直观确认网格模型的拟合良好。每个图像展示了整个框架的一个小子集,以便对微透镜进行仔细审查。五个这样的图像显示,一个为图像边角和一个为图像的中心部分。每个红点显示在靠近微透镜中心的部分,举例来说,就像在图一中,每个白色块中最亮的一点处。有一些边缘的微透镜没有红色标记不影响结果。
LFToolbox0.4官方使用文档说明_第1张图片
图一:白图像显示估计的微透镜中心,如红点所示
  1. 运行LFUtilDecodeLytroFold来编码取样光场。脚本在Images文件夹及其子文件夹中搜索光场并且将每一个编码。默认情况下,它搜索所有兼容的Lytro 光场格式,包括lfp,raw。这个编码过程为每一个光场选择合适的白图象,并且保存编码的4D光场*__Decoded.mat,和缩略图, *.png与输入图像存储在一起。每个光场的缩略图也是被编码光场的形式。缩略图是直方图均衡的,但是保存的光场不是直方图均衡的。缩略图举例如图二。

LFToolbox0.4官方使用文档说明_第2张图片
图2:编码图片(第一排)和颜色纠正输出图片(第二排)鸟的白色斑点是由于相机和鸟之间的一块脏兮兮的玻璃造成的。运行 LFDispVidCirc 或 LFDispMousePan创造更加清晰的透视视角。
  1. (可选择)重新运行 LFUtilDecodeLytroFolder来进行颜色矫正。使用命令:
DecodeOptions.OptionalTasks = 'ColourCorrect';
LFUtilDecodeLytroFolder ([ ] , [ ] , DecodeOptions);

DecodeOptions参数要求执行可选的任务颜色校正。第一个和第二个参数通过使用空数组[ ]省略了。
颜色校正应用了在光场元数据中找到的信息,包括基础的RGB颜色和伽马校正。这个脚本保持了每个光场上进行的操作轨迹,这样,操作在编码过程中就不会再重复了。而是加载每个已经解码的光场,对其进行操作,使用颜色校正后的光场重写它。相似的,以后的请求不会重复已经完成的颜色校正操作。
解码和颜色校正可以在一步执行,包括在对LFUtilDecodeLytroFolder的第一个调用中完成colorcorrect任务。
在toolbox0.3版本,直方图调整不再自动应用,你可以使用LFHistEqualisze应用直方图调整。Illum图像不是伽马校正的。示例颜色校正输出在图二第二行图片和图三中展示。

LFToolbox0.4官方使用文档说明_第3张图片
图3:编码和颜色校正后的Illum图像,手动通过调整到0.7度的伽马校正
  1. (可选)使用LFDispVidCirc或LFDispMousePaan来用变化的视角将光场可视化。首先使用如下命令加载光场:
load('Image/F01/IMG_0001_Decoded.mat');

来加载光场变量LF,然后运行 LFDispVidCirc(LF) 或LFDispMousePan(LF)其中之一。前者自动使圆周运动具有动画效果,后者允许鼠标控制运动:在窗口内点击和拖拽调整观点。使用 LFDispMousePan(LF, 2)或者LFDispVidCirc(LF, [ ], [ ], 2)尝试更大的显示,这样使显示窗口增加一倍(变为原来的两倍)在更改显示大小之前,请关闭任何打开的显示窗口。

  1. (可选)运行 LFUtilProcessCalibrations 然后重新运行 LFUtilDecodeLytroFolder来执行更改。要纠正特定的光场,使用命令
DecodeOptions.OptionalTasks = 'Rectify' ;
LFUtilDecodeLytroFolder(... 'Image/F01/IMG_0002_rrame.raw',[ ] ,DecodeOptions);

LFUtilProcessCalibrations脚本建立一个校正数据库,并保存在Cameras/CalibrationDatabase.mat中。这个文件允许为每一个光场显示合适的校正。样品包中只提供一种校准,仅适用于F01样品2和5。
正如在颜色校正举例中,我们传递一个OptionalTasks参数,这一次请求纠正。纠正后的光场重写编码的光场文件,并且编码的脚本不会重复的采用同一类校正。对样品2进行纠偏的结果如图4所示:

LFToolbox0.4官方使用文档说明_第4张图片
图4:F01取样2在纠正之前和之后的图片,有一个子集显示透镜畸变的反转。
## 3.2 加载框架式光场 在toolbox0.3版本中新的东西是LFReadGantryArray,它可以读取就像那些在斯坦福光场档案馆可获得的框架式光场(网址: http://lightfield.stanford.edu)框架式的光场通常由安装在机器框架上的单个摄像机收集,任何存储为单个图像有序集合的光场都可以使用此功能读取。
  1. 在斯坦福光场档案馆下载一个图像,举例:the LegoKnights light field。下载“修正和裁剪”版本
  2. 解压将归档文件放入斯坦福示例的专用文件夹中,其结构如下:
    Stanford---------------------------斯坦福光场顶级
         JellyBeans
                rectified--------------修正和裁剪的图像文件
    LegoKnights
    rectified--------------修正和裁剪的图像文件

3.从斯坦福光场取样顶级 运行 LFReadGantryArray:

LF=LFReadGantryArray( ' LegoKnights/rectified ' ,struct ( 'UVLimit ' ,256));

这将LegoKnights光场加载到一个17×17×256×256×3的数组中。

  1. 运行LFDispMousePan来显示加载好的光场。
    可以在全分辨率下读取Stanford light fields,例如,下面的结果是一个17 x 17 x 1024 x 1024 x 3的数组,占用了909兆字节的RAM:
LF = LFReadGantryArray('LegoKnights/rectified');

一小部分斯坦福光场具有Lawnmower模式。这些图像可以用如下语句读入并且调整

LF = LFReadGantryArray('humvee-tree', struct('STSize', [16,16]));
LF(1:2:end,:,:,:,:) = LF(1:2:end,end:-1:1,:,:,:);

3.3 基础滤波

一些基础滤波是新出现的 LFToolbox 0.4,包括用于平面焦点的移位和求和滤波器,以及用于平面焦点和体积焦点的一组线性2D和4D滤波器。
运行 LFDemoBasicFiltLytroF01 或者 LFDemoBasicFiltIllum其中一个可以用于演示在Lytro图像上运行的一些过滤器。这些应该在取样文件夹的顶级运行,在3.1节描述的编码光场过程后。采用整流光场可获得最佳性能。
运行LFDemoBasicFiltGantry作为一个过滤斯坦福光场的演示。这应该在按照3.2节的说明下载并解压缩示例之后,从Stanford light fields文件夹的顶级完成。
取消注释LFDemoBasicFiltGantry顶部附近的适当行,以便从12个输入光字段中进行选择。
滤波输出的例子如图5、6、7所示。

LFToolbox0.4官方使用文档说明_第5张图片
图5:三个过滤Lytro图像的例子:在前景窗口(左侧)和Lorikeet上执行平面聚焦的shift-and-sum过滤器 (中间),和一个超调滤波器执行体积聚焦,通过Lorikeet和背景建筑,同时拒绝前景窗口(右,与图3相比)。
LFToolbox0.4官方使用文档说明_第6张图片
图6:三个例子的过滤框架图像:位移和和滤波器执行平面焦点(左),超范滤波器执行体积焦点(中),和两个超调滤波器之间的最大值,同时聚焦在两个平面上(右)。
LFToolbox0.4官方使用文档说明_第7张图片
图7:过滤Lytro Illum图像的示例,显示输入(左)和执行平面聚焦的移位和求和滤波器(右)

3.4 运行简单的取样标定

3.4.1 标定

下面的示例假设您已经完成了上面的解码过程,包括生成白色图像数据库。这里使用的小型校准数据集仅用于快速演示工具箱的操作,在有效校准相机方面存在以下几个不足:

  • 棋盘格对于足够的近距离姿势来说太大了——基于镜头的相机有一个小的空间基线,特写镜头有利于校准这个基线。
  • 棋盘格不是很密集-需要更多的角落用于标定
  • 棋盘式的姿势没有足够的多样性——需要十张或更多不同的图片用于标定

更真实(和更大)的数据集可以在http://marine.acfr.usyd.edu.au/plenoptic-imaging获得。想好的结果应该使用19×19网格和3.6 mm间距,且至少有十个不同的姿势。
LFToolbox0.4官方使用文档说明_第8张图片

LFToolbox0.4官方使用文档说明_第9张图片
图8:左:解码棋盘图的例子-无颜色校正是必要的,不应进行校正;右图:在校准的第一步中,棋盘角自动适应棋盘的例子。
  1. 在 http://www-personal.acfr.usyd.edu.au/ddan1654/PlenCalSmallExample.zip.下载简单取样校正.将它解押至你的Samples/Cameras/A000424242/文件夹。
    Samples-------------------------------------------------取样顶级
          Cameras-------------------------------------------存储一个或多个相机文件
                A000424242---------------------------------用于测量取样的相机
                         CalZoomedOutFixedFoc----------一个单独的标定结果
                         PlenCalSmallExample-------------一个新加入的标定
                         WhiteImages-------------------------取样相机的白图像
          Images---------------------------------------------取样光场图片
  2. 运行LFUtilDecodeLytroFolder 来编码标定光场。从Matlab cd中进入样本文件夹的顶层,然后使用命令
LFUtilDecodeLytroFolder( ...'Cameras/A000424242/PlenCalSmallExample/');

这应该发现和解码校准棋盘图像。请注意,颜色校正被省略了,因为它不是必需的,而且校正会影响结果。其中一个解码棋盘图的缩略图如图8所示。
3. 运行 LFUtilCalLensletCam来运行标定。该功能自动完成所有阶段的校准。使用的命令

CalOptions.ExpectedCheckerSize = [8,6];
CalOptions.ExpectedCheckerSpacing_m = 1e-3 * [35.1, 35.0];
LFUtilCalLensletCam( ...'Cameras/A000424242/PlenCalSmallExample',CalOptions);

这些选项说明校准函数棋盘间距是35.1×35.0毫米,有8×6变焦。注意边缘角落不包括在这个数字里面,所以一个标准的8×8平方棋盘收益率7×7角。这些值可以在标定示例附带的自述文件中找到。自动标定通过角识别、参数初始化、无透镜畸变的参数优化、带透镜畸变的参数优化,最后进行参数细化。这些在第5节中有更详细的说明。

在参数初始化步骤中,重新绘制姿态估计显示,如图9所示。这种显示在整个保持阶段都在更新,反映了姿态和相机模型估计的精细化。
文本输出中还显示了重新投影错误。这个小校准示例的典型最终均方根误差(RMSE)值在0.2 mm附近。

校准过程的最终产品是校准信息文件CalInfo.json,其中包含姿态、内在和失真参数,以及用于解码棋盘光场的微透镜网格模型。

3.4.2 验证

验证校准的一种方法是校正棋盘图。这个过程与解码过程中描述的校正步骤非常相似:

  1. 运行LFUtilProcessCalibrations将新完成的校准添加到校准数据库中。注意,从该函数的输出中可以看出,这个小的校准示例非常接近样本包提供的样本校准,只有几个焦点步骤不同。
LFToolbox0.4官方使用文档说明_第10张图片
图9:预估相机位姿显示;左:参数初始化后,右:标定完成后;灰色:初始估计,绿色:无失真优化,蓝色:失真优化,红色:细化后。
  1. 把Cameras/A000424242/PlenCalSmallExample/01文件夹中所有文件复制到一个新的Samples/Images/PlenCalSmallExample这个文件夹内。这将允许校正图像,同时保持未校正的版本进行比较。
  2. 运行 LFUtilDecodeLytroFolder纠正图像,使用命令:
DecodeOptions.OptionalTasks = 'Rectify';
LFUtilDecodeLytroFolder('Images/PlenCalSmallExample', ...[], DecodeOptions);

检查文本输出,请注意校正已经根据这些图像的缩放和焦点设置自动选择了小样本校准。
由于校正数据集的局限性,对校正后的图像进行目视检查可能会显示较差的结果。

3.4.3 清理和验证

在Cameras/A000424242/PlenCalSmallExample删除标定生成的文件 CalInfo.json,并且重新运行 LFUtilProcessCalibrations。上述验证过程中,尽管相机参数有轻微的不匹配,但反复使用默认的样本校准会得到更合理的验证结果,如图10所示。

LFToolbox0.4官方使用文档说明_第11张图片
图10:纠正棋盘;如图4所示。在[1]中得到更完整的数据集

3.5 除了样本:使用你获取的光场

处理来自您自己的相机的图像与到目前为止介绍的示例非常相似。
首先,创建一个与相机/A000424242文件夹平行的新文件夹,以包含相机的白色图像和执行的任何校准。命名规定是将这个文件夹命名为与相机序列号匹配的文件夹。接下来,为白图像创建一个子文件夹。您的文件夹结构现在应该是这样的:

Samples----------------------------------------------------样例最高级
      Cameras-----------------------------------------------存储一个或多个相机
            A000424242-------------------------------------用于测量样例的相机
                  CalZoomedOutFixedFoc-----------------一个独立的标定结果
                  PlenCalSmallExample--------------------一个新添加的标定结果
                  WhiteImages--------------------------------示例相机的白图像
      Images--------------------------------------------------光场图片示例

按照附录A中描述的步骤,提取相机的白色图像并将它们放入新创建的白色图像文件夹中。您执行的任何校准都应该位于WhiteImages文件夹旁边的自己的文件夹中。
在samples文件夹的顶层,运行LFUtilProcessWhiteImages来处理相机的白色图像。生成的网格模型将被添加到白色图像数据库,并自动应用于您的相机拍摄的照片。
您可能会得到一个复杂的树结构,图像下面有许多子文件夹。
LFUtilProcessWhiteImages将递归搜索这个结构,解码它识别的任何光场。
要纠正你自己的图像,你应该标定你的相机。按照上述步骤进行,除了使用自己存储在在你自己的相机文件夹里的图像。举例来说,你的第一次标定可能存储在Samples/A123412123/CalZoomedOut。

4 细节编码

综述

此工具箱根据[1]中描述的解码过程将基于透镜的光场图像解码为4D光场结构。这个过程的核心是输入一个白图像和一个微透镜图像。白图像是通过扩散器拍摄的图像,用于校正渐晕(图像边缘附近变暗),并构建一个表示透镜中心位置的网格。
每个Lytro相机都预装了一组独特的白图像,对应于各种变焦和对焦设置。解码光场图像时,选择与相机拍照时的变焦和对焦设置最接近的白图像。白图像可以按照A.1节中的说明从Lytro文件中提取。
在解码光场图像之前,必须对白图像进行分析。这将构建一系列网格模型,每个白图像一个,以及一个列出可用图像的数据库。每个相机这个过程只需要做一次,并且实用功能LFUtilProcessWhiteImages用于自动化流程。
对于每幅要解码的图像,根据相机序列号选择适合该图像的白图像,进行缩放和对焦设置,将白图像和原始微透镜图像传递给解码函数,解码函数构建4D光场。LFToolbox0.4提供了函数LFSelectFromDatabase来帮助为光场选择适当的白色图像,LFLytroDecodeImage演示了这一点。
下面几节将更详细地描述这个工作流,并假设您已经提取了白图像并将光场复制到类似于上面快速导览中使用的文件夹结构中。有关处理……的详细信息,请参见附录ALytro文件。

4.2 分析白图像

为了将网格模型与镜头位置匹配,需要对每张白色图像进行一次分析。实用程序LFUtilProcessWhiteImages自动为您的白图像文件夹中的每个白图像构建网格模型。如果您希望将白图像存储在默认结构之外的结构中,只需更改LFUtilProcessWhiteImages中的WhiteImageDatabasePath变量以指向您的白图像文件夹,或者传递一个参数FileOptions,其中包含WhiteImageDatabasePath字段。
在F01相机中,白图像有两种曝光级别。这两种曝光都不需要,这个工具箱只使用其中较亮的一种。对白图像的检测通常也会发现一些额外的、非常暗的图像。这些都是无用的,并且会被自动忽略。
当LFUtilProcessWhiteImages遍历白图像时,它将网格模型保存为.grid。白图像文件夹中的json文件。它同时构建一个数据库,跟踪与每个白图像相关的序列号、缩放和焦点设置。它将其保存为WhiteFileDatabase.mat。这是由函数LFSelectFromDatabase用来选择适合解码给定光场图像的白图像。

4.3 编码一个微透镜图像

在LFLytroDecodeImage中演示了该解码过程。这个脚本首先加载一个微透镜图像和相关的元数据,选择使用LFSelectFromDatabase挑选适当的白图像,然后将微透镜图像、元数据和白图像传递给处理大部分工作的LFDecodeLensletImageSimple。
LFSelectFromDatabase根据序列数字b、缩放和焦点设置选择适当的白图像。目前,缩放优先于聚焦,尽管这是否是最佳的方法还是个问题。
LFDecodeLensletImageSimple继续按照[1]中描述的那样来解码光场。这包括去马赛克,设计,转换和切片的输入微透镜图像,以产生一个4D结构。更复杂的方法是将步骤组合成联合解,它们通常会产生更好的结果,特别是在透镜边缘附近。选择这里的方法是因为它的简单性和灵活性。
解码过程的一些细节是可以控制的,参见上述函数的帮助文本。

4.4 编码光场的结构

一个光场基本上是一个四维的结构。粗略来讲,每个像素对应着一个光线,并且两个维度定义光线的位置,其余两个维度定义光线的方向。对于由基于透镜的相机(如Lytro)测量的图像,二维选择透镜图像,二维选择透镜图像中的一个像素。根据[1]中的规定,透镜由对k,l (k是水平的)索引,透镜t中的像素由i ,j (i是水平的)索引。

Lytro的每个微透镜有大约9*9个有效像素,所以LFUtilDecodeLytroFolder的输出结果在i,j方向尺寸大概为9。类似地,在去除与六边形微透镜阵列相关的六边形采样后,Lytro的图像在k和l两种情况下都能产生大约380个像素。样本的实际数量取决于微透镜网格与传感器的对齐方式,并且会随着相机的不同而变化。

检查LFDecodeLensletImageSimple的输出,我们看到它产生一个光场低频的5 d数组大小约9×9×380×380×3。重要的是,LF的索引顺序是j,i,l,k,c,其中c是RGB颜色通道。

要检查通过k和l维度的切片,可以使用命令imshow(squeeze(LF(5,5,:,:,:,?))),从i和j维度的中心生成视图。这看起来非常像图2所示的示例。

要检查i和j维中的一个切片,可以使用命令imshow(squeeze(LF(:,:,380/2,380/2,?))),生成类似于图11所示的输出。请注意,这显示了l微透镜下图像的形状,并以包含很少或没有信息的变暗的角像素为特征。存在用于“填充”这些光场区域的方法,并可能在工具箱的未来版本中进行探索。

LFDecodeLensletImageSimple提供了一个权重通道LFWeight,它表示与每个像素相关的置信度。这样一个通道的i和j切片如图11所示。权重通道用于过滤接受权重项的应用程序。

LFToolbox0.4官方使用文档说明_第12张图片
图11:样本1的光场及其在i和j维上的相关权重通道。
注意,LFLytroDecodeImage将权值通道加到变量LF上,得到一个四通道结构,LFUtilDecodeLytroFolder就是这种四通道格式保存光场。这对于光场是一种方便的格式,因为权重通道在处理光场时通常很有用。例如,LFHistEqualize使用这个通道来忽略零权重像素。权重通道很可能在工具箱的未来版本的过滤操作中有用。

要在没有权重通道的光场中工作,例如要可视化切片,只需索引前三个通道,如imshow(squeeze(LF(5,5,:,:,:,1:3))。

5 细节标定

LFUtilCalLensletCam自动通过以下校准阶段:
棋盘角识别。寻找角落是最耗时的步骤,尤其是对于密集的棋盘。首先比较所有输入图像的缩放和对焦设置,如果其中有任何不同,将显示一条警告消息。下一个角落自动定位在二维切片的棋盘光场。输出类似于图8中右边所示,允许可视化确认提取的角是合理的。正常情况下,并非所有的子图像都能成功地识别出所有的角,这是由于在lenslet图像之间的光损失和渗透。每个图像的棋盘角存储在每个输入文件旁的 *_CheckerCorners.mat文件。

初始化姿态和固有参数。首先将棋盘角信息汇总到校准的顶层的单个文件中,Cameras/A000424242/PlenCalSmallExample/CheckerboardCorners.mat。初始姿态和固有估计然后计算并存储在相同的级别,在标定信息文件CalInfo.json中。

优化不失真。对内部函数和姿态进行了优化,并将结果保存到CalInfo.json中。新的姿态估计更新的姿态估计显示。文本显示了优化的过程,包括优化每个阶段之前和之后的RMSE。每个优化阶段还显示一个Matlab生成的优化显示,显示一阶最优性——有关这方面的更多信息,请参阅Matlab的文档。

优化与扭曲。这完成了相机模型包括镜头失真。再次更新姿态估计显示和文本输出。

细化。这只是重复优化与失真,以进一步细化相机模型和姿态估计。

5.1 标定结果

标定结果存储在标定信息文件中:CalInfo.json.标定估计在[1]中有细节描述,并且包括:

  • 微透镜网格模型:描述传感器上微透镜图像的旋转、间距和偏移量。
  • 全光结构模型:一个5×5的矩阵H关联像素索引 n = [ i , j , k , l , 1 ] T n =[i,j,k,l,1]^T n=[i,j,k,l,1]T对一条不扭曲的光线 ϕ u = [ s , t , u , v , 1 ] T \phi^{u} = [s,t,u,v,1]^T ϕu=[s,t,u,v,1]T,由 ϕ u = H n \phi^u=Hn ϕu=Hn
  • 畸变参数:描述射线方向的径向畸变,对每条光线采用小角度就像: θ = [ θ 1 , θ 2 ] ≈ [ d x / d y , d y / d z ] \theta=[\theta_1,\theta_2]\approx[dx/dy,dy/dz] θ=[θ1,θ2][dx/dy,dy/dz]。五个畸变函数为: b = [ b s , b t ] b=[b_s,b_t] b=[bs,bt] k = [ k 1..3 ] k=[k_{1..3}] k=[k1..3],这里b是离心参数,k是径向畸变系数。完整的畸变矢量是有序的: d = [ b , k ] d=[b,k] d=[b,k]。如果 θ u \theta^u θu, θ d \theta^d θd是独自的不失真的和失真的二维光线。然后 θ d = ( 1 + k 1 r 2 + k 2 r 4 + . . . ) ( θ u − b ) + b , r = θ s 2 + θ t 2 \theta^d=(1+k_1r^2+k_2r^4+...)(\theta^u-b)+b,r=\sqrt{\theta_s^2+\theta_t^2} θd=(1+k1r2+k2r4+...)(θub)+b,r=θs2+θt2

由于透镜网格模型是校准的一部分,因此使用校准过程中使用的相同网格参数对应用校准的光场进行解码至关重要。如果用于校正光场的微透镜网格模型与用于解码光场的微透镜网格模型存在显著差异,该软件会进行初步检查并发出警告。

5.2 整改结果

在未校正的光场中寻找光场样本对应的射线相对比较复杂,需要同时应用本征矩阵和畸变模型。然而,一旦一个光场被矫正,校正后光场的本征矩阵直接将样本与光线联系起来,就像 θ = H n \theta=Hn θ=Hn。矫正后的本征矩阵保存在每个矫正光场 RectOptions.RectCamIntrinsicsH中。
对小的标定例子数据集,是一个简单的例子:

n = [1,1,1,1,1]';
p = RectOptions.RectCamIntrinsicsH * n;

产生射线 p = [ 0.0015 , 0.0015 , − 0.34 , − 0.34 , 1 ] T p=[0.0015,0.0015,-0.34,-0.34,1]^T p=[0.0015,0.0015,0.34,0.34,1]T,相似地, n = [ 5 , 5 , 190.5 , 190.5 , 1 ] ′ n=[5,5,190.5,190.5,1]' n=[5,5,190.5,190.5,1]产生射线 p = [ 0 , 0 , 0 , 0 , 1 ] T p=[0,0,0,0,1]^T p=[0,0,0,0,1]T,因为这个n对应于采样光场的中心对应于中心射线。(记住光场尺寸为:9×9×380×380)

5.3 控制矫正

矫正接受作为一个可选的参数所需的固有光场的矫正-即你可以指定的值,你想在RectOpations .RectCamintrinsicsH。默认情况下,校准后的固有矩阵取一个保守值,在s、t和u、v中产生正方形像素。例如,如果需要非正方形像素,您可能希望更改此设置。

新版本0.3有一个帮助函数,用于构建这个矩阵,是LFCalDispRectIntrinsics。推荐的使用模式是加载一个光场,调用一次l LFCalDispRectIntrinsics来设置默认的固有矩阵,操作该矩阵,然后在将其用于一个或多个纠正调用之前可视化操作后的采样模式。假设img001已经解码,但没有被纠正,一个典型的过程可能是这样的:

load('Images/IMG_0001__Decoded.mat');
RectOptions = ...
	LFCalDispRectIntrinsics( LF, LFMetadata, RectOptions );

这将加载光场,然后设置默认的固有矩阵,生成显示采样模式的显示,如图12所示。

如果我们想要更接近这个光场的水平u边进行采样,在使用非平方像素的情况下,我们可以增加H(3,3),如下所示:

RectOptions.RectCamIntrinsicsH(3,3) = ...
	1.1 * RectOptions.RectCamIntrinsicsH(3,3);
RectOptions.RectCamIntrinsicsH = LFRecenterIntrinsics( ...
	RectOptions.RectCamIntrinsicsH, size(LF) );
LFCalDispRectIntrinsics( LF, LFMetadata, RectOptions );

这增加了沿u的采样范围,然后通过u重新居中采样LFRecenterIntrinsics,然后显示得到的采样模式,如图12所示。

最后,对LFUtilDecodeLytroFolder的适当调用将使用所请求的固有矩阵对多个光场进行校正:

DecodeOptions.OptionalTasks = 'Rectify';
LFUtilDecodeLytroFolder([], [], DecodeOptions, RectOptions);

请注意,相同的矩阵可以应用于任何光场,但是对于不同的相机和对焦/变焦设置,产生的采样模式是不同的。图13显示了应用图12中的例子校正的结果——注意,在第二幅图像中,更多的记录图像是可见的,但是它的非正方形像素必须在后续的处理步骤中考虑进去。

图12:默认和调整的采样模式。在这里,采样模式被水平拉伸,合并了更多的测量图像,但产生矩形像素。下图显示了应用这些方法的结果。
LFToolbox0.4官方使用文档说明_第13张图片
图13:使用前一个图中描述的默认和调整的采样模式进行校正。

附录A 使用Lytro 文件工作

从工具箱0.3版本开始,不再需要外部工具从Lytro软件生成的文件中提取白色图像、图片或元数据

A.1 提取白图像

每台相机都有一个解码所需的白色图像的唯一数据库。在Windows机器上,白色图像数据位于表单的文件夹中:
:\Users\AppData\Local\Lytro\cameras\ …
sn-
在mac上,相关地址为:
/Users//Lytro.lytrolib/cameras/sn-
Windows机器上的一个具体例子是:
C:\Users\Bob\AppData\Local\Lytro\cameras\sn-A000424242
Lytro Illum可以将其白色图像保存在SDCard上的压缩文件中,作为“配对过程”的一部分-参见Lytro关于创建这种“配对的文献数据”。数据文件夹或配对数据文件包含指定的文件被命名为:data.C.0,data.C.1等等。这些都是特定于lytro的存储格式,可以使用它来解压LFUtilUnpackLytroArchive。
例如,在解压配对数据或将数据文件夹的内容复制到camera //WhiteImages中之后,从示例文件夹的顶部运行LFUtilUnpackLytroArchive。默认情况下,该功能将搜索相机文件夹中的所有存档文件,并将它们解压。
在提取的结果文件中,我们感兴趣的文件的名称如下:
MOD_0000.RAW
MOD_0000.TXT
MOD_0001.RAW
MOD_0001.TXT

原始文件是对应于各种缩放和焦点设置的白图像,而txt文件包含我们需要分类哪些是哪些的元数据。其他文件包含关于Lytro的大量信息,但是在这个工具箱的修订中没有使用这些信息。一旦解压,您可以安全地删除复制的data.C.*文件。

A.2 定位图片文件

这个版本的工具箱可以直接读取Lytro LFP文件,使用函数LFReadLFP。该工具箱还与使用外部提取的.raw文件兼容工具LFP。
Lytro Desktop version 4及更高版本使查找LFP文件变得更容易,因为它们存储在操作系统的默认图片文件夹中——查找表单的文件夹:My Pictures/Lytro Desktop/Libraries/Lytro Library.lytrolibrary/。图片库有很多子文件夹,结构复杂。你可以直接把这个结构复制到你的工作文件夹下-该工具箱将在解码光场时递归搜索子文件夹。
桌面软件还可以将光场导出到您选择的位置。
如果使用Illum,您可以直接从相机复制文件,因为它直接通过USB公开其文件系统。
如果您运行的是较老版本的Lytro桌面软件,那么可以在存储白色图像的images文件夹旁边的images文件夹中找到Lytro图像文件。例如,在Windows机器上,默认位置是
:\Users\AppData\Local\Lytro\images\ *
在mac上它位于
/Users//Lytro.lytrolib/images/ *
其中末尾的’ * '取数值,如01、02等。

A.2.1 LFP, LFR, lfp 还是 lfr?

Lytro LFP是一种储存格式,可能包含几种类型的数据之一。包含light字段的文件通常根据它们的大小很明显——F01大约16mb, Illum大约55mb。文件扩展名根据文件源的不同而不同,导出的文件、相机上的文件和图像库文件都具有本节标题中所示的四种扩展名。

默认情况下,LFUtilDecodeLytroFolder递归地搜索具有这些扩展名的任何文件,以及以前的工具箱版本所使用的原始文件,并解码它能够理解的任何内容。聚焦堆栈和其他文件也存储为
.lfp文件并且LFUtilDecodeLytroFolder将忽略这些文件。

A.2.2 缩略图

缩略图被构建到一些LFP文件中。函数l LFUtilExtractLFPThumbs将找到缩略图并将它们保存到磁盘。

B 相关功能

这是一个按任务组织的顶级函数的快速列表。有关更多信息,请参考每个函数中包含的文档,以及工具箱内部工作的SupportFunctions文件夹。
些函数首先为所有参数定义默认值,如LFUtilDecodeLytroFolder。因此,可以将它们作为函数调用,也可以不带任何参数直接运行。在没有参数的情况下调用时,编辑代码中的值以匹配所需的设置。当作为函数调用时,只需要传递那些与默认值不同的参数和字段。传递一个空数组[]以省略参数,并省略接受默认值的字段。
有关此参数传递方案的示例,请参见LFUtilDecodeLytroFolder的帮助。

编码 输入
LFLytroDecodeImage 从LFP或原始文件解码Lytro图像。可以直接调用将单个图像解码到内存中,也可以通过LFUtilDecodeLytroFolder间接调用。
LFReadGantryArray 加载框架式光场,举例:斯坦福光场: http://lightfield.stanford.edu.
LFUtilDecodeLytroFolder 实用的解码,色彩校正和校正Lytro图像。可处理多个光场;递归搜索文件夹结构;接受文件名规范,包括通配符。自动选择适当的白色图像和校准文件从多个相机跨越多个变焦和焦点设置。将递增应用于文件的操作,以便,例如,以前解码的光字段可以递增颜色校正,纠正或两者都不需要重复的操作。结果保存到磁盘。输出如图2、4、10所示。演示LFLytroDecodeImage、LFColourCorrect、LFHistEqualize和LFCalRectifyLF。解码依赖于已构造的白图像数据库LFUtilProcessWhiteImages和rectification,类似地依赖于由LFUtilProcessCalibrations创建的校准数据库。
LFUtilProcessWhiteImages 处理填充有白图像的文件夹,生成网格模型(.grid.json),以及一个白图像数据库(WhiteFileDatabase.mat),用于选择适合于l光场的白图像。黑暗图像自动检测和跳过。
滤波
LFBuild2DFreqFan 在频域中构造二维fan滤波器。使用LFFilt2DFFT应用这个过滤器。
LFBuild2DFreqLine 在频域中构造二维线滤波器。s、u、t、v中两行滤波器的级联与4D平面滤波器相同,如LFBuild4DFreqPlane所构造的平面滤波器。使用LFFilt2DFFT应用此过滤器。
LFBuild4DFreqDualFan 在频域中构造一个4D双fan滤波器。使用LFFilt4DFFT应用这个过滤器。
LFBuild4DFreqHypercone 在频域中构造一个4D超锥滤波器。使用LFFilt4DFFT应用此过滤器。
LFBuild4DFreqHyperfan 在频域中构造一个4D超调滤波器。这对于从光场中选择深度范围内的对象是有用的,即体积焦点。使用LFFilt4DFFT应用此过滤器。
LFBuild4DFreqPlane 在频域中构造一个四维平面滤波器。这对于从光场中选取单一深度的对象非常有用,在效果上类似于使用移位和过滤器LFFiltShiftSum重新聚焦。使用LFFilt4DFFT应用此过滤器。
LFDemoBasicFiltLytroF01 演示Lytro f01捕获图像上的一些基本过滤器。
LFDemoBasicFiltIllum 演示了Lytro illum捕获图像的一些基本过滤器。
LFDemoBasicFiltGantry 演示了斯坦福光场存档光场的一些基本过滤器。
LFFilt2DFFT 使用FFT对4D光场应用二维频域滤波器。
LFFilt4DFFT 使用FFT应用4D频域滤波器。
LFFiltShiftSum 位移和滤波器是一种空间域深度选择性滤波器,其效果与平面聚焦相似。
图像调整
LFColourCorrect 应用色彩平衡向量、RGB色彩校正矩阵和伽玛校正。在LFUtilDecodeLytroFolder中演示了使用方法。
LFHistEqualize 根据直方图均衡化调整光场的亮度。对彩色和单色图像进行处理,将彩色图像转换为HSV,并对值通道进行均衡。能够处理不同的输入维度,包括二维图像和4D光场。如果权重通道作为第四个颜色通道出现,则使用它忽略零权重像素。在LFUtilDecodeLytroFolder中演示了使用方法。
可视化
LFDisp 函数的作用是:显示一个光场的二维静态切片。最里面的图像在s和t中拍摄,也可用于三维图像数组。
LFDispMousePan 显示具有基本视差效果的二维光场切片。单击并拖动图像以更改视图。可选参数控制显示大小。请注意,在未过滤光场的边缘变暗意味着在空间范围的中心附近效果最好。有关自动动画显示,请参见l LFDispVidCirc。该功能重用以前打开的光场显示窗口。请注意,更改显示大小要求在调用此函数之前关闭显示窗口。
LFDispVidCirc 动画显示二维切片的光场,类似于LFDispMousePan,除了运动预设为一个圆形的路径。可选参数包括圆形路径的半径、动画速度和显示大小。
LFFigure 代替matlab中的"figure",他不会窃取焦点
标定
LFCalDispEstPoses 可视化相机姿态估计。叫LFUtilCalLensletCam。
LFCalDispRectIntrinsics 帮助建立和可视化整改中要求的内部函数,参见LFRecenterIntrinsics
LFCalRectifyLF 应用校准校正光场。所需要的本征矩阵可以由标定的本征矩阵提供,也可以由标定的本征矩阵自动计算。证明了LFUtilDecodeLytroFolder。
LFRecenterIntrinsics 重定位一个光场内置矩阵,用于修改在LFCalRectifyLF请求的函数。见LFCalDispRectIntrinsics
LFUtilCalLensletCam 运行基于镜头的摄像机校准的所有步骤。
LFUtilProcessCalibrations 建立一个校准数据库,以允许选择适当的标定为给定的光场。
输入输出文件
LFFindFilesRecursive 递归地在文件夹中搜索匹配一个或多个模式的文件。参考此函数用于理解 LFUtilDecodeLytroFolder,LFUtilExtractLFPThumbs 和LFUtilUnpackLytroArchive的路径参数
LFReadLFP 读取Lytro lfp/lfr光场文件。
LFReadMetadata 读取json文件
LFReadRaw 读取10位、12位和16位原始图像文件。
LFWriteMetadata 写入json文件
实用程序/方便
LFMatlabPathSetup 设置Matlab路径以包含LF工具箱。每次Matlab重新启动时都必须重新运行它,因此可以考虑在启动时添加一行代码。m如第2节所示
LFUtilUnpackLytroArchive 从多卷Lytro存档中提取白色图像和其他文件。
LFUtilExtractLFPThumbs 从LFP文件中提取缩略图并将其写入磁盘。

你可能感兴趣的:(图像处理)