Google更新相機應用:用算法實現單反的景深效果和光場相機的先拍照後對焦

Google近日正式推出了新版的Google Camera app。這款Android應用的最大亮點是用算法實現單反相機的景深效果—即可以讓前景清晰,遠景模糊。不過app目前僅支持Android 4.4(KitKat),但官方稱後續將支持更多版本。

新版Google Camera 的版本號為2.1.037。該應用不僅開發了全新的界面,而且新增了幾項令人眼前一亮的新功能,包括鏡頭模糊功能、改進的全景拍攝,以及照片球等。

其中最重要的新功能就是類似數碼單反相機的鏡頭模糊功能。我們知道,對於業餘的攝影愛好者來說,最難掌握的技巧之一就是對景深的把握。哪怕用單反相機也要經過一些相對複雜的設置才能實現前景突出背景模糊的效果。智能手機的相機儘管從分辨率上來看也能與數碼相機匹敵,但以往並不具備類似的功能。

比單反相機更強悍的是支持先拍照後對焦的光場相機Lytro。這種相機可以讓用戶先拍攝照片,然後再根據需要自由對焦。其原理是相機傳感器前面佈設大量微鏡頭,通過這些微鏡頭,相機傳感器記錄下的不是單一的由鏡頭、光圈等設置決定的圖像,還包括了用複雜的方式記錄下來的各個方位的光線,隨後Lytro軟件會根據需要對圖像進行解碼,從而達到先拍照後對焦的效果。

Google Camera的原理與Lytro類似,只不過前者是軟件實現的,後者是硬件實現。Google工程師Carlos Hernández在博客中解釋了其鏡頭模糊功能的機制。Google Camera事先捕捉的也不僅僅是一張照片,而是在用戶拍照前移動手機時捕捉下一系列的幀。然後利用計算機視覺算法對這些圖像幀進行處理,創建出對象的3D模型,再估算出到達屏幕每一點的距離(景深)。就像下面這組照片的對比(左邊是原始效果,右邊是鏡頭模糊效果):

其具體過程是這樣的。

首先,App 會篩選出屏幕上的視覺特徵,然後在一系列圖像中跟踪這些特徵。接著利用所謂的運動求取結構(Structure-from-Motion,SfM)算法及光束法平差來計算相機的3D 定位和定向,以及所有的圖像特徵在一系列幀中的3D 位置。

接下來,app 再利用多視角立體( Multi-View Stereo,MVS)算法計算參照圖上每一個像素的景深。Carlos 解釋說,MVS 的原理類似於人的立體視覺:只要知道同一個對像在不同圖片中的3D 位置,我們就能三角定位出該對象的3D 位置併計算出與該對象的距離。人具有高超的識別對象能力,但機器如何識別兩張不同照片裡面哪個像素和哪個像素是對應的呢?計算兩個像素RGB 顏色之間的絕對誤差和(SAD)。於是景深問題就解決了。

最後就是優化問題。按照Carlos 的說法,一張最好的景深圖應該是所有的相應像素之間相互類似程度最高的。但這樣又會導致不同的景深圖的匹配度一樣。為了解決這個問題,Google 引入了場景的3D 幾何學條件來輔助優化,比方說,可以假設臨近的兩個像素之間的景深類似。最後,再利用馬爾科夫隨機場推理法來解決此優化問題(下圖中的中間那幅就是景深圖,越近顏色越黑,越遠顏色越白)。

有了景深圖之後,app 就可以對圖片進行重新渲染了。渲染的效果可以根據像素深度、光圈以及與焦面的相對位置來進行不同程度的模糊化處理。焦面決定了對哪一像素進行模糊化,app 會根據像素與焦面的距離按比例提高/ 降低模糊度。也就是說用戶可以通過app 確定焦點在哪裡,然後實現前景清晰背景模糊或者背景清晰前景模糊(如下圖)的效果。

有了景深圖之後,app 就可以對圖片進行重新渲染了。渲染的效果可以根據像素深度、光圈以及與焦面的相對位置來進行不同程度的模糊化處理。焦面決定了對哪一像素進行模糊化,app 會根據像素與焦面的距離按比例提高/ 降低模糊度。也就是說用戶可以通過app 確定焦點在哪裡,然後實現前景清晰背景模糊或者背景清晰前景模糊(如下圖)的效果。

[36氪原創文章,作者: boxi]