前面几篇博客主要说了光场相机,光场相机由于能够记录相机内部整个光场,可以实现重聚焦(模糊线索)和不同视角的变换(视差线索),同时也可以利用这个特性进行深度估计(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 = ; nrow < input.rows; nrow++)
  7. {
  8. for (int ncol = ; ncol < input.cols; ncol++)
  9. {
  10. if (ncol == )
  11. {
  12. Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ) - input.at<uchar>(nrow, ));
  13. }
  14. else if (ncol == input.cols - )
  15. {
  16. Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow, ncol - ));
  17. }
  18. else
  19. {
  20. Ix.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow, ncol + ) - input.at<uchar>(nrow, ncol - )) / 2.0);
  21. }
  22. }
  23. }
  24. //get Ix
  25. for (int nrow = ; nrow < input.rows; nrow++)
  26. {
  27. for (int ncol = ; ncol < input.cols; ncol++)
  28. {
  29. if (nrow == )
  30. {
  31. Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(, ncol) - input.at<uchar>(, ncol));
  32. }
  33. else if (nrow == input.rows - )
  34. {
  35. Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow - , ncol));
  36. }
  37. else
  38. {
  39. Iy.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow + , ncol) - input.at<uchar>(nrow - , 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.

利用光场进行深度图估计(Depth Estimation)算法之一——聚焦算法的更多相关文章

  1. 利用光场进行深度图估计(Depth Estimation)算法之二——匹配算法

    光场相机由于能够捕获相机内部光线的强度和方向而得到整个光场,可以实现重聚焦(refocus)和视角变换等功能.进而可以进行深度估计获取深度图,前面说过利用重聚焦的图像进行深度估计,今天说一下利用不同视 ...

  2. 泡泡一分钟:Towards real-time unsupervised monocular depth estimation on CPU

    Towards real-time unsupervised monocular depth estimation on CPU Matteo Poggi , Filippo Aleotti , Fa ...

  3. 【HEVC帧间预测论文】P1.9 Coding Tree Depth Estimation for Complexity Reduction of HEVC

    Coding Tree Depth Estimation for Complexity Reduction of HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见: ...

  4. deep learning+ Depth Estimation

    Depth estimation/stereo matching/optical flow @CVPR 2017 Unsupervised Learning of Depth and Ego-Moti ...

  5. [技术栈]C#利用Luhn算法(模10算法)对IMEI校验

    1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...

  6. 行为识别笔记:improved dense trajectories算法(iDT算法)(转载)

    iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法 ...

  7. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍

    转自:http://blog.csdn.net/carson2005/article/details/7647500 TLD(Tracking-Learning-Detection)是英国萨里大学的一 ...

  8. FM算法(一):算法理论

    主要内容: 动机 FM算法模型 FM算法VS 其他算法   一.动机 在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合:非线性SVM可 ...

  9. 最短路经算法简介(Dijkstra算法,A*算法,D*算法)

    据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...

随机推荐

  1. Git详解之四:服务器上的Git

    服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做 ...

  2. SQL基础学习_05_函数、谓词、CASE表达式

    函数 算术函数 1. 四则运算: +.-.*./  2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的 ...

  3. Tomcat 到底依赖JRE还是JDK

    Tomcat 6.0 以上可以不再依赖JDK运行,直接使用JRE即可,但Tomcat 5.5以下,是必须安装JDK的. 这主要是由于,Tomcat 5.5及以下版本主要是依赖JDK去编译JSP文件生成 ...

  4. [总结]-2018 w1

    不想总结 2017,过去的就过去吧,不过自己在 2017 年还是收获了很多,最重要的就是赚钱.赚钱还是需要两把刷子,所以,2018 的小目标就是学习数据分析和机器学习.希望自己在这两个领域能搞点事情. ...

  5. redmine 安装(Centos 6.5 x64)

    参考:http://www.linuxidc.com/Linux/2015-03/115545.htm 平台搭建 1)基础环境 yum -y install libyaml-devel zlib-de ...

  6. Python中将函数作为另一个函数的参数传入并调用

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  7. H2Engine游戏服务器设计之属性管理器

    游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...

  8. win8使用putty登录虚拟机linux

    从下午两点开始在尝试,差不多用了6个小时候到现在终于成功了! 连接器使用的是putty,只要知道虚拟机的ip地址就可以尝试连接,所以首先查询虚拟机上的ip地址,使用命令: ifconfig 出现提示: ...

  9. 【转】Mac端包管理工具——Homebrew简介及安装

    Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的两大发行版本都自带了解决方案, ...

  10. 关于 for 循环与 循环嵌套

    FOR循环精讲 > 1.初步结识 for是写出题的重要组成部分之一,每个题如果没有for循环根本是无法做出来的,可见for循环在c++语言中是有多么重要,那么for的格式是怎样的呢?? for( ...