光场原始图像经过重聚焦可以生成光场图像的焦点堆栈,焦点堆栈即为聚焦在不同深度处的图像,我们通过计算每一个深度图像的聚焦点,最后拼合起来就形成一幅光场全聚焦图像。
光场重聚焦原理和代码可参考:
光场相机重聚焦原理介绍及代码解析
焦点堆栈计算深度可参考:
光场相机重聚焦–焦点堆栈深度估计法
这篇文章是在第二步的基础上得出全聚焦图像,全聚焦图像即为计算出深度图像作为深度图索引在焦点堆栈中取像素,拼合形成全聚焦图像。
注:梯度方法计算深度图的前提假设是:焦点堆栈中最清晰的像素(聚焦处像素)的梯度值最大,我们计算每一层焦点堆栈的每一个像素的梯度值,然后计算每一个像素梯度最大值所在的深度,即为索引,然后用索引值取提取像素值,拼合全聚焦。
1.计算每一层焦点堆栈梯度
2.找出每一个坐标的最大梯度值索引(焦点堆栈中所有图像该像素位置的最大梯度值)
3.计算全聚焦图像
Gradmain.m
%Writen by SuWenBo
filepath='D:\SU\Tao13_LF_Depth_Light\DEPTH_FROM_CORR_DEFOC_JPEGONLY\Desk\9169\';
listing=dir([filepath,'*.tif']);
FocalStack=ComputeAllImage(filepath,listing);
AllGradient=ComputeAllGradient(listing,filepath);
gradientDepthMap=GetDepth(AllGradient);
AllFocusImage=GetFocus(gradientDepthMap,FocalStack);
imwrite(uint8(AllFocusImage),[filepath,'GradAllFocus9169.tif']);
ComputeAllImage.m
%将重聚焦的图像整合成四维图像
function AllImage=ComputeAllImage(filepath,listing)
[M,N]=size(listing);
AllImage=[];
for i=1:M
filename=[num2str(i),'.tif'];
name=strcat(filepath,filename);
img1=imread(name);%读取listing中的图片
AllImage(:,:,:,i)=img1(:,:,:);
end
AllImage=uint8(AllImage);
save AllImage;
ComputeAllGradient.m
%计算焦点堆栈中所有像素的梯度值
function AllGradient=ComputeAllGradient(listing,filepath)
[M,N]=size(listing);
for i=1:M
filename=listing(i).name;
name=strcat(filepath,filename);
img1=imread(name);%读取listing中的图片
gradient=ComputeFinalGradient(img1);%计算出了一幅图的最终的平均梯度值
AllGradient(:,:,i)=gradient(:,:);
end
save AllGradient
GetDepth.m
%计算最大梯度值的索引值,即为深度
function gradientDepthMap=GetDepth(AllGradient)
[m,n,k]=size(AllGradient);
gradientDepthMap=zeros(m,n);
for i=1:m
for j=1:n
[maxValue,index]=max(AllGradient(i,j,:));
gradientDepthMap(i,j)=index;
end
end
GetFocus.m
%根据索引值计算全聚焦图像
function AllFocusImage=GetFocus(depthIndex,focalStack)
[m,n,k,num]=size(focalStack);
AllFocusImage=zeros(m,n,k);
for i=1:m
for j=1:n
index=depthIndex(i,j);
AllFocusImage(i,j,:)=focalStack(i,j,:,index);
end
end