1. 程式人生 > >光場相機原理及模擬實現

光場相機原理及模擬實現

估計是因為最近Lytro二代的上市吧,光場相機的概念就又火了一把。藉著昨天晚上無意間看到知乎上關於光場相機的問答,我就在此獻醜,說下當初我對光場相機的一些理解。

需要指出的是,現在所說的光場相機有很多種,比如魅族的偽光場相機(說是偽光場相機我都覺得坑爹,明明是拍攝了幾幅不同焦距的影象而已!)。而我這裡說的是Ren NG的光場相機,也就是Lytro。

什麼是光場相機呢?光場相機就是先拍照後聚焦的相機;光場相機就是可以記錄相機內部的光線傳輸方向等資訊的相機;光場相機就是比傻瓜相機還傻瓜的相機,允許再拍攝後根據拍攝者的需要再重新聚焦到任意的位置。

Matlab模擬實驗

按照慣例應該是先要上圖的,ok,我先上我一年多以前用matlab模擬實現光場相機產生的圖,不夠精確,還請見諒。

下圖(1)是使用matlab模擬產生的光場相機觀測資料。

這裡寫圖片描述

圖(1)

下圖(2)、圖(3)是圖中9個字母的位置關係(9個字母與相機的距離各不相同):

這裡寫圖片描述

圖(2)

這裡寫圖片描述

圖(3)

好了,下面是見證奇蹟的時刻了,如圖(4)所示,是根據圖(1)記錄的原始光場資料重聚焦得到的9幅影象,分別聚焦在每個字母的位置。

這裡寫圖片描述

圖(4)

由於使用matlab模擬驗證,資料的離散化等一系列原因導致重構質量還有待提高,不過已經可以說明問題啦。

光線記錄

結果已經展示,我也說說原理吧,都說有圖有真相,為了讓那些像當初的我一樣的人能夠更好的理解,我會在下面再上幾幅圖。

光場相機是因為在普通相機鏡頭(主鏡頭)焦距處加微透鏡陣列實現記錄光線的,然後根據記錄的光線實現重聚焦的

。那麼是如何記錄光線的呢,我覺得這個可能是很多人想要了結的問題,下面再次上圖,如圖(5)所示,微透鏡s位於主鏡頭u的焦距處,感測器位於微透鏡s的焦距處(這個其實也很重要的,Ren Ng在他的論文中也說啦,下面會簡單的介紹)。

注意:由於微透鏡的焦距遠遠小於主透鏡的焦距,因此主透鏡可以看做位於微透鏡鏡的無窮遠處。從而可以認為主透鏡u上的深綠豎條區域經過某個微透鏡後正好聚焦在微透鏡後的某一個畫素上,又由於微透鏡是主透鏡的幾百分之一,那麼近似於取樣的理解,可以認為這一個畫素就是藍色的線內部所有光線的一個取樣。通過這種方式就記錄了相機內部的一條光線;同理,其他畫素也都對應一條光線(這樣就是為什麼Lytro一代記錄了1100萬條光線,而二代記錄了4000萬條光線)。

這裡寫圖片描述

圖(5)

夜已深了,既然說了,我就說完吧,上面圖(5)說明了光場相機如何記錄一條光線,但是可能還是不夠清楚,索性再上兩幅圖,如圖(6)所示,此刻的某個微透鏡是不是很像傳統相機的主透鏡了,而主透鏡是不是就相當於位於無窮遠的場景了(這些都說廢話),迴歸正題,大家是不是發現了,由於主透鏡、微透鏡陣列、感測器三者的位置關係,每個微透鏡後面的畫素可以看做是該畫素映象到主透鏡區域的過來的光線的取樣。

這裡寫圖片描述

圖(6)

下面再看圖(7),有完沒完啦,手機黨一定要淚奔啦,好吧,在此致以誠摯的歉意。OK,繼續,其實此刻拿出圖(7)是為了說明一個前面沒有講到的問題,前面只說一個了一個畫素記錄了一條光線,而沒有談到光線的方向資訊。其實很簡單,由於每個畫素的位置是固定的,每個畫素對應的微透鏡的位置也是固定的,由於光線的直線傳播,很容易得出光線的方向資訊。好吧,再通俗一點:以圖(6)和圖(7)為例,假設主透鏡後面有4個微透鏡,每個微透鏡後面有8個感測器(為了各種方便,此處都已平面空間為例,立體空間可以以此類推),圖(6)中的紅色感測器對應圖(6)中主透鏡的紅色區域,如果說這個微透鏡的座標為s1(定值),而紅色區域的座標為7,那麼紅色感測器記錄的這條光線就可以表示為:L(7, s),圖(6)中的光線就為L(u, s1),而圖(7)中的這些光線就為L(4,s)。所有的光線就對應L(u, s)。

這裡寫圖片描述

圖(7)

重聚焦

在說重聚焦之前有個問題需要說明下:看過光場相機原始資料的(或者看我模擬產生的資料)都知道,直接觀測資料是不能看的,是一個一個的圓形區域,因為每個微透鏡都對圓形的主透鏡成像,所以實際上光場相機上最終產生的影象是對原始資料進行求和之後得到的,怎麼求和呢,就是每個微透鏡後面對應的畫素加起來,所以一個微透鏡也就成了最終的一個畫素,而微透鏡的尺寸是不能太小的,所以就導致了最終的成像解析度不高。

好吧,下面可以說重聚焦啦,我又要上圖了,如圖(8)所示:由於光線的直線傳播,既然知道了光線在垂直方向上的兩個座標,又知道了兩個座標之間的水平距離,而感測器記錄了光線的強度,根據這些條件,剩下的就是簡單的幾何問題啦,我就不說啦,一切都在圖上。實際上我們的聚焦不就是調整這個水平距離,讓光線到達聚焦平面嘛,現在既然知道了光線的方向和強度資訊,當然可以隨意的重聚焦啦。

這裡寫圖片描述

圖(8)

程式碼