概述
本文翻译自:http://www.timzaman.com/2012/12/imaging-lytro-in-matlab/
Lytro In Matlab
这篇文章告诉你如何使用Matlab的Lytro相机拍摄的图片。Lytro图像被称为“光场图像”或者动态图像,但不管它们告诉你什么;这只是一幅由数字传感器前的“微透镜阵列”拍摄的普通图像。听起来容易吗?它是很容易的。
你可以对光场图片做什么
基本上有三件很棒的事情是其他方法无法做到的,因为你可以追溯它(一个后验)。
- 你可以移动观察者,来制造一个远程图像或者广角图像;
- 你可以四处移动观察者(在微透镜尺寸的范围内);
- 在聚焦或模糊方面,你可以选择(这个性能已知);
首先,lytro相机有多少万像素?这是很简单的。他是一个方形传感器,由3280*3280像素组成。这相当于11万像素。很棒的地方在于他输出12位的信息,不同于普通相机只输出8位。不同之处是非常明显的,并且他们需要这些因为他们用这个微透镜阵列做各种智能的事情。
首先,微透镜阵列安装在数字传感器上,它没有完全对齐。你可以在这里看到:
|
错误对齐的数量实际上隐藏在元数据文件中。在“mla”寻找。
例子:
"mla" : {
"tiling" : "hexUniformRowMajor",
"lensPitch" : 1.3898614883422850808e-05,
"rotation" : -0.00028155732434242963791,
"defectArray" : [],
"scaleFactor" : {
"x" : 1,
"y" : 1.0004389286041259766
},
"sensorOffset" : {
"x" : -3.5040323734283452459e-06,
"y" : -1.6298500299453736302e-06,
"z" : 2.5000000000000001198e-05
}
}
你需要这样的信息,因为知道微透镜阵列中心的准确位置是我们算法的关键。
工作流程
我们想把图像导入Matlab。您的映像应该是扩展名为.lfp的较大的映像。较大的是TIFF文件,并且也存在一个JPEG压缩文件。
这个. lfp文件包含TIFF文件和一些元数据。我们可以将此元数据看作四个不同的部分:图像、元数据引用、私有元数据和表。
为了将.LFP文件转换或分割为TIF以便在Matlab中使用它,我们可以使用一个名为LFP splitter的方便工具。您需要编译此文件(如果您不知道它是如何工作的,请不要费心,寻找另一个项目)。你可以在这里找到lfpsplitter。它在c++中,只要编译它就行了。
./lfpsplitter IMG_0001.lfp
这是一个命令行接口程序,它将.lfp转换为这些文件。它生成的图像文件实际上是.raw文件。现在我们要把这个原始文件转换成Tiff文件!
raw2tiff -w 3280 -l 3280 -d short IMG_0001_imageRef0.raw
IMG_0001.tif
太棒了!我们获得了我们的.TIF文件。一切按计划进行,这个TIFF文件仍然是一个每像素12位的BGGR Bayer 阵列马赛克(a BGGR bayer array mosaic with 12 bits per pixel)。我们必须解除魔法!幸运的是,Matlab天生就能做到这一点。
下面是一些图像,一个视频,以及我的Matlab代码,它使用。tif文件,这样你就可以处理你的文件了。如果你想要一些示例文件,你可以联系我,或者在web上浏览示例.lfp文件。
Selected Images
Selected Video
https://youtu.be/xNJZHFZEkYQ
matlab 代码
%(c) Tim Zaman 2012, Oct 9th
clc; close all; clear all
%Parameters
%wy=8.60; %average width between cells (vertical)
%wx=10.0; %average width between cells (horizontal)
%From JSON
rotation= -0.00028155732434242963791;
offset_x= -3.5040323734283452459e-0;
offset_y= -1.6298500299453736302e-06;
offset_z= 2.5000000000000001198e-05;
%Calculated
wx=9.94036;
wy=8.60585;
imraw=imread('0027.tif');
imdem = demosaic(imraw,'bggr');
imdemr=imrotate(imdem,rad2deg(-rotation));
imdembig=imresize(imdemr,4,'lanczos3');
imdembig=imdembig(34:end,37:end,:);
imsamp1=imdembig(20:wy*4*2:end,20:wx*4:end,:);
imsamp2=imdembig(53:wy*4*2:end,40:wx*4:end,:);
i=0;
imsamptot=0;
for y=-8:8
for x=-8:8
imsamptot=imsamptot+double(imdembig(y+20:wy*4*2:end,x+20:wx*4:end,:));
i=i+1;
end
end
imagesc(uint16(imsamptot/i))
break;
for i=0:0.5:20
xxx=sin(i)*7;
yyy=cos(i)*7;
imsamp1=imdembig(yyy+20:wy*4*2:end,xxx+20:wx*4:end,:);
imagesc(imsamp1);
drawnow
pause(0.01)
end
while 1==1
[gX,gY] = ginput(1);
gX=((gX/size(imsamp1,2))-0.5)*20;
gY=((gY/size(imsamp1,1))-0.5)*20;
imsamp1=imdembig(gY+20:wy*4*2:end,gX+20:wx*4:end,:);
imagesc(imsamp1);
axis equal
drawnow
end
%imsamp2=imdembig(54:wy*4*2:end,40:wx*4:end,:);
%figure
%imshow(imsamp2);
break;
wx=10*4*2;
wy= 8.6*4*2;
for i=0:0.2:20
s=sin(i)*wx/2;
c=cos(i)*wy/2;
rangey=round(abs(53:wy:size(imdembig,2)-50)+s); %vertical
rangex=round(abs(56:wx:size(imdembig,1)-50)+c); %horizontal
imagesc(imdembig(rangey,rangex,:))
drawnow
pause(0.01)
end
最后
以上就是激昂戒指为你收集整理的Lytro In MatlabLytro In Matlab的全部内容,希望文章能够帮你解决Lytro In MatlabLytro In Matlab所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复