1. 程式人生 > >光場相機重聚焦--焦點堆疊深度估計法

光場相機重聚焦--焦點堆疊深度估計法

上一篇部落格中介紹了光場相機重聚焦演算法原理介紹,對光場影象進行重聚焦可以聚焦在不同的深度處,使位於不同深度物體清晰,因此,我們可以對光場影象進行重聚焦,然後進行深度估計。

焦點堆疊深度估計法原理介紹

計算焦點堆疊每一個畫素的梯度,然後對每張影象梯度影象進行均值濾波,然後計算三個通道梯度值的平方和取均值,再開根號,即為該張影象的梯度值,焦點堆疊的同一位置畫素梯度最大則說明該深度時該畫素最清晰,也就是說該深度面上的物體最清晰,記錄該深度的索引值。

焦點堆疊

焦點堆疊就是聚焦在不用平面處的一系列影象
因此,對光場原始影象進行256次重聚焦,這一系列重聚焦影象就稱之為焦點堆疊。

梯度

梯度的概念可以自己瞭解一下

步驟:計算整副影象的梯度值,然後做均值濾波,每個通道梯度的平方去均值再開根號,為該影象的梯度值。

X方向梯度:
這裡寫圖片描述
Y方向梯度:
這裡寫圖片描述
該畫素點梯度:
這裡寫圖片描述

這裡用到了Matlab的gradient函式,自己瞭解一下

梯度計算程式碼:

function img_gradient = DEFOCUS_ANALYSIS(img)//%img為double型別

grad_map = abs(gradient(IM_Refoc_alpha)) ;%梯度計算
h= fspecial('average',[5,5])    ;%定義一個均值濾波器
shear_std_map = imfilter(grad_map,h,'symmetric'
) ;%對梯度進行均值濾波 shear_std_map = ((shear_std_map(:,:,1).^2 ...%梯度圖三個通道的平方相加取平均值 然後開根號,就是其梯度值 +shear_std_map(:,:,2).^2 ... +shear_std_map(:,:,3).^2)/3).^(1/2) ; img_gradient = shear_std_map ;%img_gradient就是這個影象梯度值,為[m,n]大小的單通道影象 end

放一張梯度圖:
這裡寫圖片描述

原圖如下:
這裡寫圖片描述
比較亮的地方就說明該張圖片在整個焦點堆疊中梯度值較大,最清晰

結果展示

我們利用上一篇部落格中的256層重聚焦生成的焦點堆疊進行深度估計

部分焦點堆疊展示:
這裡寫圖片描述

關於索引值
比如第一個畫素,在焦點堆疊中的第25張影象中梯度值最大,那麼該點的索引值即為25,我們對整幅影象m*n個畫素計算其索引值,256層重聚焦,因此索引值應該∈(0,256)

索引影象
這裡寫圖片描述
部分索引值
這裡寫圖片描述

然後可以根據焦距,像距和物距公式計算深度,1/U+1/V=1/F,alpha*F就是V,alpha為上一篇部落格中講到的
這種方法估計深度比較粗糙,而且在紋理重複和邊界估計不準確,需要進行優化,比如MRF優化等

參考:
1.論文Depth from Combining Defocus and Correspondence Using Light-Field Cameras-W.Tao
2.Panoramic Reconstruction from Multiple Light-Field Images-Buyukalp,Yasin