前面几篇博客主要说了光场相机,光场相机由于能够记录相机内部整个光场,可以实现重聚焦(模糊线索)和不同视角的变换(视差线索),同时也可以利用这个特性进行深度估计(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的代码如下:

 void gradient2D(Mat input, Mat& output)
{
Mat Ix(input.size(), CV_32F);
Mat Iy(input.size(), CV_32F);
//get Iy
for (int nrow = ; nrow < input.rows; nrow++)
{
for (int ncol = ; ncol < input.cols; ncol++)
{
if (ncol == )
{
Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ) - input.at<uchar>(nrow, ));
}
else if (ncol == input.cols - )
{
Ix.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow, ncol - ));
}
else
{
Ix.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow, ncol + ) - input.at<uchar>(nrow, ncol - )) / 2.0);
}
}
}
//get Ix
for (int nrow = ; nrow < input.rows; nrow++)
{
for (int ncol = ; ncol < input.cols; ncol++)
{
if (nrow == )
{
Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(, ncol) - input.at<uchar>(, ncol));
}
else if (nrow == input.rows - )
{
Iy.at<float>(nrow, ncol) = abs(input.at<uchar>(nrow, ncol) - input.at<uchar>(nrow - , ncol));
}
else
{
Iy.at<float>(nrow, ncol) = abs((input.at<uchar>(nrow + , ncol) - input.at<uchar>(nrow - , ncol)) / 2.0);
}
}
}
magnitude(Ix, Iy, output);
}

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. thinkinginjava学习笔记02_对象

    对象 1. 对象通过一个引用来操作,但是java中的对象是按值传递的,基本上可以在操作中认为对象本身,在内部结构中仍然要记得是对象实体的引用:如:String s = "abcd" ...

  2. LeetCode题目总结(三)

    我的代码在github上,https://github.com/WINTERFELLS/LeetCode-Answers 这里只提供个人的解题思路,不一定是最好的. 41-60: 给定一个排好序的数组 ...

  3. swiper轮播问题之一:轮播图内容为动态数据生成时轮播图无法自动轮播

    本人在用H5做移动端项目中使用Swiper遇到的两个问题,因此加深了对Swiper的掌握,分享出来对刚开始接触Swiper的童鞋们或多或少会有帮助.        首先,new Swiper的初始化最 ...

  4. StringMVC @RequestParam属性

    1.jsp: <a href="springmvc/testRequestParam?username=allen&age=sss">test RequsetP ...

  5. [js高手之路]寄生组合式继承的优势

    在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...

  6. 一个简单JDK动态代理的实例

    动态代理的步骤: 创建一个实现了InvocationHandler接口的类,必须重写接口里的invoke()方法. 创建被代理的类和接口 通过Proxy的静态方法 newProxyInsatance( ...

  7. 用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api

    目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个python 的 rest api ...

  8. 深入理解ES6之—数据解构

    一 对象解构 对象解构语法在赋值语句的左侧使用了对象字面量 let node = { type: true, name: false } //既声明又赋值 let { type, name } = n ...

  9. 跟我一起读postgresql源码(十)——Executor(查询执行模块之——Scan节点(下))

    接前文跟我一起读postgresql源码(九)--Executor(查询执行模块之--Scan节点(上)) ,本篇把剩下的七个Scan节点结束掉. T_SubqueryScanState, T_Fun ...

  10. 从Unity中的Attribute到AOP(八)

    本文将讲一下在UnityEditor命名空间下的一些特性. CallBackOrder,这个Attribute是所有带callback index的Attribute的基类,由于官方也没有给出详细的说 ...