光场相机重聚焦原理介绍及代码解析
光场相机重聚焦–焦点堆栈深度估计法
全部代码下载地址:
https://download.csdn.net/download/weixin_38285131/10441175
上一篇博客中介绍了光场相机重聚焦算法原理介绍,对光场图像进行重聚焦可以聚焦在不同的深度处,使位于不同深度物体清晰,因此,我们可以对光场图像进行重聚焦,然后进行深度估计。
焦点堆栈深度估计法原理介绍
计算焦点堆栈每一个像素的梯度,然后对每张图像梯度图像进行均值滤波,然后计算三个通道梯度值的平方和取均值,再开根号,即为该张图像的梯度值,焦点堆栈的同一位置像素梯度最大则说明该深度时该像素最清晰,也就是说该深度面上的物体最清晰,记录该深度的索引值。
焦点堆栈
焦点堆栈就是聚焦在不用平面处的一系列图像
因此,对光场原始图像进行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