漫談計算攝像學 (一):直觀理解光場(Light Field)


本文已經搬運到:https://zhuanlan.zhihu.com/p/24982662

什么是計算攝像學

計算攝像學(Computational Photography)是近年來越來越受到注意的一個新的領域,在學術界早已火熱。本來計算攝像學的業界應用在群眾中一直沒什么知名度,直到Lytro公司推出了外觀十分酷炫的光場相機,打着“先拍照再對焦”的噱頭,這個學科一下子被很多研究領域以外的人開始注意到。那什么是計算攝像學呢?讓我們看看清華大學和中科院的教授們怎么說[1]

“計算攝影學是一門將計算機視覺、數字信號處理、圖形學等深度交叉的新興學科,旨在結合計算、數字傳感器、光學系統和智能光照等技術,從成像機理上來改進傳統相機,並將硬件設計與軟件計算能力有機結合,突破經典成像模型和數字相機的局限性,增強或者擴展傳統數字相機的數據采集能力,全方位地捕捉真實世界的場景信息。”

這種定義雖然沒什么錯誤,可其實相當於什么都沒說。。個人覺得計算攝像學的定義得從一般的數碼攝影對比着來理解。一般的數碼攝影分為兩個大步驟:1) 通過相機采集圖像;2) 后期處理。而在每個大步驟里又有很多小的要素,比如1)里,需要考慮光照,相機角度,鏡頭組(光學系統),傳感器等等,2)里的方方面面就更多了,降噪,調曲線,各種PS濾鏡等等。如果這其中的每一個要素,我們都想辦法進行拓展和改變。比如用特殊手段照明,可以從不同角度,或者按一定的時序打閃光燈,再或者用可見光之外的光。又比如改變光學系統,可以調整光圈大小,調整相機鏡頭位置,或是改變光圈形狀等。而每一項采集圖像的改變,往往都需要相應的計算機算法后期處理,甚至采集到的數據可以用除了普通顯示器以外的方式呈現,那么前面這些一套的成像辦法,就都可以歸入計算攝像學的范疇。更籠統一下,就是拓展了傳統數碼攝影中的某個或多個因素的維度來成像的方法,就是計算攝像學。其實現在早就被用的爛熟的HDR就是計算攝像學中的一種辦法,拓展的是傳統成像中的光圈大小。那么,就當前計算攝像學的發展而言,這些拓展和改變都主要集中在哪些因素上呢?MIT的Raskar教授早就給出過結論:光學系統傳感器照明后期處理[2]。作為漫談計算攝像學的第一篇,今天要談的光場,就是基於光學系統和后期處理上的拓展。

光場的定義

光場,顧名思義,就是關於光的某個物理量在空間內的分布。這個概念第一次被明確提出是在1939年A. Gershun的一篇論文中[3],后來被E. H. Adelson和J. R. Bergen在上世紀末的一篇論文中完善,並給出了全光函數(Plenoptic Function)的形式。簡單來說,光場描述空間中任意一點向任意方向的光線的強度。而完整描述光場的全光函數是個7維函數,包含任意一點的位置(x, y, z),任意方向(極坐標中的Θ, Φ),波長(λ)和時間(t)。附上從Raskar教授的講義里截的圖:

在實際應用中,顏色和時間維度的信息通常是被RGB通道和不同幀表示,所以就光場而言,只關注光線的方向和位置就可以了,這樣就從7維降到了5維。而再一般的,大部分成像系統中光線都是在一個有限的光路里傳播,所以一種更簡單的,用兩個平面表示光場的方式被引入:

這種表示方式中,分別用兩個平面上的兩個點表示光線經過的兩個點,這樣一來光線的方向和位置都可以確定,並且維度降到了4個。注意到這樣雖然簡化了處理,可是局限性是,在實際應用中,兩個平面都不是無限大的(即使是無限大也只能描述一半空間),光場可以描述的范圍被兩個平面的有效面積限制住了。

用數碼相機采集光場

知道了光場的定義,那么是不是有什么專門的神奇設備能夠在空間中采集這樣的4維信息呢?沒有的,光場雖然聽上去比較高大上,可通常采集的辦法還是傳統的成像系統:相機。最經典的光場采集辦法就是相機陣列,比如下圖是Stanford Multi-Camera Array:

所以就是把相機排列在了一個平面上而已。為什么這樣的相機陣列就采集了光場呢?我們先從最原始的針孔(Pinhole)相機模型談起:

小孔成像模型是最直觀也是最古老的成像模型,小孔相當於把光束的寬度限制得很小,所以如左圖光束通過小孔之后再像面上成了一個倒像。這種成像雖然簡單,然而一個重大不足是成像的分辨率被小孔大小限制着,小孔越小,則成像越清晰,然而光量也越小,像會很黯淡。為了成明亮的像我們希望光束的量大,也就是小孔大,但也不希望光束的不集中導致成像模糊,所以很自然的,凸透鏡成像解決了這個問題。在凸透鏡成像系統中,不過鏡頭怎么復雜,模式都是和中間的示意圖一樣,一個空間中的點發出的光束,打在透鏡的一塊面積上后,折射,然后匯聚到一點。所以單從光線采集的角度而言,和小孔成像系統的沒有差別。那么這和光場的聯系在哪呢,回顧前面說的用兩個平面上的兩點坐標表示廣場的辦法,如果我們這里把鏡頭中心所在平面看成uv平面,定義鏡頭中心為(0,0),而成像平面,也就是傳感器所在平面看成xy平面,則在普通的成像系統中捕捉到的一幅圖像可以看成是u=0, v=0出發的光線在傳感器平面上的采樣,也就是說我們采集了

\[L\left( 0,0,x,y \right){{|}_{x,y\in \text{sensor plane}}}\]

其中每個L(0,0,x,y)的值就是傳感器上的像素值。一個直觀的例子是上圖的第三個光路圖,簡化到二維情況的話,只看L(u,x),假設在傳感器平面上有6個像素,那么采集到的6條光線就分別是L(0,-1), L(0,-0.6), L(0,-0.2), L(0,0.2), L(0,0.6), L(0,1)。那么很自然地,如果改變uv的位置,也就是鏡頭中心的位置,不僅能采集xy平面的光線,uv平面的也可以采集了,所以就能采集整個uv和xy間的光場了,所以相機陣列就相當於在uv平面上布滿了很多采樣點。

當然,上面說的是最直觀最理想的情況,把相機近似成針孔模型還有個前提是景深足夠,另外我的例子里xy平面是用傳感器所在平面定義,另一種流行的定義方法是用相機的焦平面,也就是在鏡頭前方,也就是上圖中的虛線箭頭,這種方法相對來說就更為直觀了,尤其是在假設焦距很小的情況下,虛線所在的平面就是相機平面距離為焦距的地方。事實上,在幾何光學里,因為光線是嚴格直線傳播,所以沿着光軸中心的不同位置上,如果都能采樣的話,那么采到的像都是相似的,所以理論上講uv和xy平面是可以沿着光路的中心軸任意位置定義的。另外,除了用x和y,也有很多學者喜歡用s和t描述像平面,不過這僅僅是字母使用習慣上的不同。

相機陣列只是采集光場的最基本模型,實際實現的系統都是基於相機陣列的原理,但是具體結構非常不一樣。

Lytro

Lytro采用的是在傳感器表面覆蓋一層微鏡頭陣列[4]

微鏡頭陣列就是類似如下,近距離覆蓋在傳感器表面:

這個圖是Lytro創始人博士論文里的原型機的陣列,(A)是陣列宏觀的可視效果,(B)和(C)是微觀結構,后來在Lytro中已經改進成了六邊形的鏡頭陣列。一個Lytro在傳感器成像的原始圖片如下:

可以看到和相機陣列不同,Lytro采集到的圖像是虛脫6邊型構成的,不過其實背后的原理都是一樣的,這一大幅看着像昆蟲眼睛采到的圖像是能夠通過算法轉化成前面提到的相機陣列等效圖像的,而每一幅等效的圖像又叫Sub-Aperture圖像。和Lytro類似的還有Raytrix的光場相機,不過Raytrix的采樣精度和采樣數都大幅高於玩具般的Lytro,屬於工業級光場相機。

Adobe Plenoptic Lenses

名字已經寫得很清楚了,lenses,和Lytro還有Raytrix不同,Adobe的光場相機把光場采樣鏡頭置於主鏡頭組前[5]

PiCam

這是個微縮版的相機陣列,用的就是手機上的那種鏡頭,4x4陣列,特點是用提出的算法優化了分辨率和深度圖估計[6]

微縮相機陣列里還有一個例子是去年發布的華為榮耀6 Plus。

光場和3D

知道了光場的直觀意義,那么很自然地就會想到和普通的照片比起來,獲取的信息不再是一幅簡單的2D像素陣列,而是三維空間中的光線,也就是說光場中是包含三維信息的。一個簡單的例子來說明:

左邊的例子是不同uv平面上的相機成像的差別,假設成像后焦平面都取相同的區域的話,可以看到因為uv的不同,所以不同距離上的物體在最終的圖像上的位置也不一樣,其實這個就是典型的視覺中的Stereo問題。另外既然提到了Stereo,也需要特別提到的是,在相機陣列采集到不同拍照位置的圖像之后,有個非常重要的步驟叫做Calibration,也就是在選定的x平面上,要保證兩個相機視野是重合的,如左圖所示。那么深度的信息是如何獲得的呢,來看下圖:

假象我們可以保持右邊的相機的光場不變,然后向左平移,使得藍色的光線在成像面上重合,那么最終藍色方塊在兩個相機成像的照片里位置就會完全相同,這其實就等效於把原始位置成的像向左移動了一段距離,然后和左邊相機成的圖像疊加,那么就會發現藍色方塊重合了。類似的,如右圖所示,如果把右邊相機成的圖像向左移動一大段距離,那么更遠的綠色三角圖像就重合了,要想是不同位置的物體重合就要對應不同的移動距離,而這個距離實際上是和物體到鏡頭的距離相關的,通過移動距離和相機采樣點之間距離的比值就可以輕易求出,進而就相當於我們得出了藍色方塊和綠色三角的深度信息。順帶提一句,讓藍色方塊和綠色三角重合的過程其實就已經是所謂的先拍照后聚焦的聚焦過程了,這篇文章不會展開來講。那么再回到第一幅圖中的插值問題,如何通過兩個相機得到的圖像求出一個虛擬的在兩個相機之間的圖像呢?

以綠色三角為例子,因為我們用的是鏡頭前像平面的二維例子,所以這里用L(x,u)表示入射到虛擬位置的光線,則有

\[L\left( x,u \right)={{\lambda }_{0}}L\left( {{x}_{0}},{{u}_{0}} \right)+{{\lambda }_{1}}L\left( {{x}_{1}},{{u}_{1}} \right)\]

其實就是以虛擬位置到已有采樣位置的距離為權重的線性插值。那具體到采集到的圖像這個過程是怎么實現的呢,在相機陣列中需要注意的一點是不僅僅是相機采樣是離散點,圖像因為是像素構成的所以也是離散采樣。示意圖如下:

所以實際上用來插值L(u,x)的光線采樣有4條,公式如下:

\[L\left( x,u \right)={{\lambda }_{0}}L\left( {{x}_{00}},{{u}_{0}} \right)+{{\lambda }_{1}}L\left( {{x}_{01}},{{u}_{0}} \right)+{{\lambda }_{2}}L\left( {{x}_{10}},{{u}_{1}} \right)+{{\lambda }_{3}}L\left( {{x}_{11}},{{u}_{1}} \right)\]

其中

\[{{\lambda }_{0}}=\left( 1-\frac{\left| x-{{x}_{00}} \right|}{\left| {{x}_{01}}-{{x}_{00}} \right|} \right)\left( 1-\frac{\left| u-{{u}_{0}} \right|}{\left| {{u}_{0}}-{{u}_{1}} \right|} \right)\]

\[{{\lambda }_{1}}=\left( 1-\frac{\left| x-{{x}_{01}} \right|}{\left| {{x}_{01}}-{{x}_{00}} \right|} \right)\left( 1-\frac{\left| u-{{u}_{0}} \right|}{\left| {{u}_{0}}-{{u}_{1}} \right|} \right)\]

\[{{\lambda }_{2}}=\left( 1-\frac{\left| x-{{x}_{10}} \right|}{\left| {{x}_{11}}-{{x}_{10}} \right|} \right)\left( 1-\frac{\left| u-{{u}_{1}} \right|}{\left| {{u}_{0}}-{{u}_{1}} \right|} \right)\]

\[{{\lambda }_{3}}=\left( 1-\frac{\left| x-{{x}_{11}} \right|}{\left| {{x}_{11}}-{{x}_{10}} \right|} \right)\left( 1-\frac{\left| u-{{u}_{1}} \right|}{\left| {{u}_{0}}-{{u}_{1}} \right|} \right)\]

這是二維光場的情況,如果實際應用中需要對4維光場插值,則這個公式一共涉及到16條光線,下面是個示意圖:

公式看上去很復雜,不過直觀地理解也不困難,每根光線前的系數里,和u有關的部分就是指將圖像按照相機采樣位置差異進行移動的幅度,也就是把采到的圖像進行平移(如下圖),而和x有關的部分就是在傳感器上對光線通過的位置進行插值。利用深度信息的輔助,在整幅圖像上進行這個過程就能得到一個沒有采樣點上的虛擬相機采到的插值圖像。

來做個簡單的實例試一試,用手機拍9幅照片,也就是3x3的采樣:

接下來是前面提到的Calibration,以中心的字母U作為聚焦平面,並且重新構圖裁剪畫面:

做Calibration的過程中可以得到照片拍攝時的位置信息:

可以看到由於手持手機的誤差,我的采樣位置是很不規則的,不過能大概看出是在“田”字格上采樣,除了位置信息還能提取出深度信息,提取深度的算法有很多,為了方便我這里使用的是最原始的disparity比較:

接下來進行采樣插值,我采取的策略是在每四個采樣點之間進行Quadrilinear采樣:

采樣的效果怎么樣呢,沿着我的采樣點我畫了條軌跡試試,起點和終點分別是左下角和右下角的采樣點,把對應的插值圖像提取出來,軌跡和對應的動圖如下:

另外一個有意思的例子,一個日本人用Optical Flow做雲圖趨勢預測[7],論文里附帶的一個小例子:

分別是從左和右看手辦的渲染圖,用Optical Flow能得到非常好換視角動態插值,但是場景的3D效果很不正常,比如辮子末梢,雙腳,還有黃色的小帶子,效果動圖如下:

如果用光場也能做這件事情,區別是成像效果,尤其是物體邊緣處的質量會下降,但是優點是能夠更准確的還原三維場景,結果如下:

參考文獻:

[1] http://wenku.baidu.com/link?url=ViSzmcYvSZNN-NYa-mxlqy8hnKJWxqj1hukSUYLIuVm79LUjYG54dfEOZTHVDGeMwsd4hFMTUepFMnsVLINlZ1o0-s5oGucwWg4o4RlejYG

[2] http://web.media.mit.edu/~raskar/photo/

[3] A. Gershun, “The light field,” J. Math. Phys., Vol. 18, pp. 51–151, 1939

[4] R. Ng, "Digital Light Field Photography," PhD thesis, Stanford University, Stanford, CA (2006)

[5] T. Georgiev, A. Lumsdaine, "Focused plenoptic camera and rendering," Journal of Electronic Imaging 19(2), 2010

[6] K. Venkataraman, et. al "PiCam: An Ultra-Thin High Performance Monolithic Camera Array," ACM Transactions on Graphics(SIGGRAPH) 2013

[7] http://imoz.jp/research.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM