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