LFtoolBox0.4工具包解码Lytro光场图像及子孔径图像获取

关于LFtoolbox0.4解码光场图像以及其使用,VincentQin的主页写的挺详细了,强烈推荐,我这里写一下主要步骤

Light Field 光场以及MATLAB光场工具包(LightField ToolBox)的使用说明

我用的是Lytro illum,下面我根据VincentQin的博客,写一下主要步骤以及注意事项

1.关于文件夹

这里写图片描述

注:

  • LFToolbox0.4与Sample_test同一级别
  • Camera文件夹下创建文件夹Bxxxxxxxxxx,是你的相机的序列号
  • Bxxxxx..文件夹下有WhiteImages文件夹,用于存放Lytro相机自带的白图像
  • Images与Cameras同级,在Sample_test下
  • B01存放illum系列相机拍摄的LFP(LFR)文件

2.关于白图像

一共有两种方法获得自己相机的白图像

1)方法一
打开我的电脑图片\Lytro Desktop\Libraries\Lytro 图库.lytrolibrary,可以找到相关文件
2)方法二
利用Lytro DeskTop可以导出配对数据,到上面的WhiteImages文件夹下
利用lytro Desktop导入你的Lytro图像之后,可以导出配对数据
文件-导出配对数据
这里写图片描述
这里写图片描述
这里写图片描述

上图即为我的相机的配对数据,illum一共34张

3.程序

这个程序是VincentQin根据LFtoolBox修改过的

clc;
clear all;
clc;

addpath(genpath('Sample_test'));
addpath(genpath('LFToolbox0.4'));

LFMatlabPathSetup;
//获取白图像数据
fprintf('===============Step1: Unpack Lytro Files===============\n\n ');
LFUtilUnpackLytroArchive('Sample_test')   

//处理白图像
WhiteImagesPath='Sample_test\Cameras\B5151402850'; //改成自己的文件夹
LFUtilProcessWhiteImages( WhiteImagesPath); 

//解码Lytro图像 LFP/lfr文件
tic
fprintf('=====================Step3: Decode LFP===================\n\n');
cd('Sample_test');  % go to Sample_test directory

lfpname='IMG_0153';     % test file name


if WhiteImagesPath(21)=='A'    %if lytro  exist('LYTRO','var')
    version='F01';
elseif WhiteImagesPath(21)=='B'%if illum  exist('ILLUM','var')
    version='B01';
end


InputFname=[‘Images\’,version,‘\’,lfpname,'.LFR'];   //注,这块应该是英文符号,我给改成汉字的了,不然这个编辑器给当成注释了

[LF, LFMetadata,WhiteImage,CorrectedLensletImage, WhiteImageMetadata, LensletGridModel, DecodeOptions]=  LFLytroDecodeImage(InputFname);
save('WhiteImage','WhiteImage');

imshow(CorrectedLensletImage)
mkdir([‘Results_saving\’,lfpname]);//都是英文符号
imwrite(CorrectedLensletImage,['Results_saving\',lfpname,'\',lfpname,'.bmp']);
save(['Results_saving\',lfpname,'\',lfpname,'.mat'],'CorrectedLensletImage');
toc
//频率域校正
// lytro
if strcmp(version,'F01')==1
    LFPaddedSize = [16, 16, 400, 400];
    BW = 0.03;
    FiltOptions = [];
    FiltOptions.Rolloff = 'Butter';
    Slope1 = -3/9; % Lorikeet
    Slope2 = 4/9;  % Building
    fprintf('Building 4D frequency hyperfan... ');
    [H, FiltOptionsOut] = LFBuild4DFreqHyperfan( LFPaddedSize, Slope1, Slope2, BW, FiltOptions );
    fprintf('Applying filter');
    [LFFilt, FiltOptionsOut] = LFFilt4DFFT( LF, H, FiltOptionsOut );

// illum
elseif strcmp(version,'B01')==1

    LFSize = size(LF);
    LFPaddedSize = LFSize;
    BW = 0.04;
    FiltOptions = [];
    %---Demonstrate 4D Hyperfan filter---
    Slope1 = -4/15; % Lorikeet
    Slope2 = 15/15; % Far background
    fprintf('Building 4D frequency hyperfan... ');
    [H, FiltOptionsOut] = LFBuild4DFreqHyperfan( LFPaddedSize, Slope1, Slope2, BW, FiltOptions );
    fprintf('Applying filter');
    [LFFilt, FiltOptionsOut] = LFFilt4DFFT( LF, H, FiltOptionsOut );
    title(sprintf('Frequency hyperfan filter, slopes %.3g, %.3g, BW %.3g', Slope1, Slope2, BW));
    drawnow
    save(['Results_saving\',lfpname,'\',lfpname,'5D.mat'],'LFFilt');
end

//颜色校正
ColMatrix = DecodeOptions.ColourMatrix;
Gamma=DecodeOptions.Gamma;
ColBalance=DecodeOptions.ColourBalance;

% processing gamma correction to get one image NOT 5D LF
ColorCorrectedImage=LFColourCorrect(CorrectedLensletImage, ColMatrix, ColBalance, Gamma);
imwrite(ColorCorrectedImage,['Results_saving\',lfpname,'\',lfpname,'ColorCorrectedImage.bmp']);
save(['Results_saving\',lfpname,'\',lfpname,'ColorCorrectedImage.mat'],'ColorCorrectedImage')
imshow(ColorCorrectedImage);title('Corrected Lenslet Image');

//获取5-D光场
LFColorCorrectedImage=zeros(size(LF,1),size(LF,2),size(LF,3),size(LF,4),size(LF,5));
for i=1:size(LF,1)
    for j=1:size(LF,2)    
        temp =squeeze(LFFilt(i,j,:,:,1:3));
        temp = LFColourCorrect(temp, ColMatrix, ColBalance, Gamma);
        LFColorCorrectedImage(i,j,:,:,1:3)=temp;    
        imshow(temp);
        pause(0.1)
    end
end
LFColorCorrectedImage(:,:,:,:,4)=LF(:,:,:,:,4);
save(['Results_saving\',lfpname,'\',lfpname,'RawLFColorCorrectedImage.mat'],'LFColorCorrectedImage');//very important

//展示光场图像
ViewLightField(LFColorCorrectedImage(:,:,:,:,1:3));
toc

注:我们需要更改文件夹地址,也就是Bxxxxxx的序列号,注释中说明了

4.结果展示

Lytro Desktop中查看LFP文件:
这里写图片描述
颜色校正
这里写图片描述

中间处理过程:
这里写图片描述

子孔径图像展示
这里写图片描述

最后生成5-D光场数据:
这里写图片描述

5. 5D光场提取子孔径图像

function []=GetSubApertureImage(LF)
[u,v,m,n,k]=size(LF);%5D光场
for i=1:u
    for j=1:v
         img=(squeeze(LF(i,j,:,:,1:3)));%每一个角度的图像
         str=strcat(num2str(i),'_',num2str(j));
         filename=[directory,str,'.jpg'];%把directory改成自己想要保存的文件夹
         imwrite(img,filename,'jpg');
    end
end

部分结果:
这里写图片描述

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页