前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用光场进行深度图估计(Depth Estimation)算法之一——聚焦算法

利用光场进行深度图估计(Depth Estimation)算法之一——聚焦算法

作者头像
一棹烟波
发布2018-01-12 16:49:35
1.6K1
发布2018-01-12 16:49:35
举报
文章被收录于专栏:一棹烟波一棹烟波一棹烟波

前面几篇博客主要说了光场相机,光场相机由于能够记录相机内部整个光场,可以实现重聚焦(模糊线索)和不同视角的变换(视差线索),同时也可以利用这个特性进行深度估计(Depth Estimation)。

先说一下利用重聚焦得到的不同聚焦平面图像获取深度图(模糊线索 ,defocus),其实这个原理非常简单。

1. 以聚焦范围为0.2F-2F为例,alpha∈(0.2,2),取Depth Resolution=256, 那么步长就为(2-0.2)/256,我们通过重聚焦算法可以获取得到这个范围内的256幅重聚焦图像。

2. 对每一幅重聚焦的图像进行求梯度的操作,得到梯度图,比如使用matlab中的Gradient2D()函数,得到256幅梯度图。注意,都是三通道的,所以求梯度也要在每一个通道进行。

用C++实现的gradient2D的代码如下:

 1 void gradient2D(Mat input, Mat& output)
 2 {
 3     Mat Ix(input.size(), CV_32F);
 4     Mat Iy(input.size(), CV_32F);
 5     //get Iy
 6     for (int nrow = 0; nrow < input.rows; nrow++)
 7     {
 8         for (int ncol = 0; ncol < input.cols; ncol++)
 9         {
10             if (ncol == 0)
11             {
12                 Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, 1) - input.at<uchar>(nrow, 0));
13             }
14             else if (ncol == input.cols - 1)
15             {
16                 Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow, ncol - 1));
17             }
18             else
19             {
20                 Ix.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow, ncol + 1) - input.at<uchar>(nrow, ncol - 1)) / 2.0);
21             }
22         }
23     }
24     //get Ix
25     for (int nrow = 0; nrow < input.rows; nrow++)
26     {
27         for (int ncol = 0; ncol < input.cols; ncol++)
28         {
29             if (nrow == 0)
30             {
31                 Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(1, ncol) - input.at<uchar>(0, ncol));
32             }
33             else if (nrow == input.rows - 1)
34             {
35                 Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow - 1, ncol));
36             }
37             else
38             {
39                 Iy.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow + 1, ncol) - input.at<uchar>(nrow - 1, ncol)) / 2.0);
40             }
41         }
42     }
43     magnitude(Ix, Iy, output);
44 }

3.对每一幅梯度图在局部窗口内进行均值滤波,相当于参考每一个像素点处的邻域梯度值,增加鲁棒性。这个可以简单的使用OpenCV中的Blur()函数实现。

4.均值滤波后的图像也是三通道的,这一步需要将每一个像素点处的三个通道值求平均,得到灰度图像。每一个像素点处的灰度值就为其对应的梯度值,而大家都知道,梯度值能够反应边缘、纹理等信息。

5.在每一个像素点处,遍历256幅图像,找到梯度值最大的那一幅图像(即该点在这一幅图像中最清晰,也就是聚焦到该像素点对应的物平面),获取该图像的索引值。(比如某一像素点处的第200幅图像中的梯度值最大,则记录index=200)。遍历所有像素点,并获取索引值。这样得到的是一幅索引图像,每一个像素点处的值对应为该点在该索引下的图像中梯度最大,在程序中为0~255.

6.得到上述索引图后就简单了,可以根据每一个像素点处的索引值找到对应的alpha值,也就相应的得到alpha*F的值,该值就为像距V。

7.得到像距V,根据光学中的物像位置公示1/U +1/V = 1/F。V和F均已知,当然可以算出该点处的U值,而U就是深度,深度图就得到了。

这次没有放图,有时间再放上去,原算法参考论文为[1],中文较为详细的参考[2]

[1] Tao M W, Hadap S, Malik J, et al. Depth from combining defocus and correspondence using light-field cameras[C]//Proceedings of the IEEE International Conference on Computer Vision. 2013: 673-680.

[2] 杨德刚, 肖照林, 杨恒, 等. 基于光场分析的多线索融合深度估计方法[J]. 计算机学报, 2015, 38(12): 002437-2449.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档