Lytro In Matlab

本文翻译自:http://www.timzaman.com/2012/12/imaging-lytro-in-matlab/

Lytro In Matlab

这篇文章告诉你如何使用Matlab的Lytro相机拍摄的图片。Lytro图像被称为“光场图像”或者动态图像,但不管它们告诉你什么;这只是一幅由数字传感器前的“微透镜阵列”拍摄的普通图像。听起来容易吗?它是很容易的。

你可以对光场图片做什么

基本上有三件很棒的事情是其他方法无法做到的,因为你可以追溯它(一个后验)。

  1. 你可以移动观察者,来制造一个远程图像或者广角图像;
  2. 你可以四处移动观察者(在微透镜尺寸的范围内);
  3. 在聚焦或模糊方面,你可以选择(这个性能已知);

首先,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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章