关于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
部分结果: