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

    在上篇文章中,介绍了三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系:对极约束,基础矩阵是这种约束关系的代数表示,并且这种约束关系独立与场景的结构,只依赖与相机的内参和外参(相对位姿).这 ...

  2. Oracle导入导出常用命令

    -- 全量导出 exp system/manager@TEST file=d:\daochu.dmp full=y -- 将数据库中system用户与sys用户的表导出 exp system/mana ...

  3. Protobuf的简单介绍、使用和分析

      Protobuf的简单介绍.使用和分析   一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...

  4. 基于web的网上书城系统开发-----登录注册扩展-------验证码功能

    public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; privat ...

  5. 微信小程序<web-view>嵌入网页后,小程序如何和网页交互传值?

    最近开发一个项目由于小程序某些组件的限制,然后想到嵌入网页,但是遇到一个问题:网页端调取数据的时候需要 小程序传递多个参数值才能用,如何传值呢? 最初我想到是<web-view src=&quo ...

  6. C# war3 巨魔精灵 minimap

    弃坑LOL后,无聊的时候玩玩 war3的RPG地图,巨魔与精灵.  玩了一段时间精灵....然后玩魔结果总是找不到人.所以就有了这个想法. 代码纯粹靠搬运. 说下原理,网上有份代码,可以查看当前选中目 ...

  7. wifipineapple插件:codeInject的使用

    如果在中间人攻击的时候, 能在用户的网页中插入任意代码, 可以说已经完成一半了 wifipineapple有个codeInject插件, 可以让连上这个网络所有设备浏览网页的时候, 在网页中插入任意h ...

  8. 【转载】vim复制时的缩进

    :set paste vi/vim鼠标中键粘贴文本默认情况是自动缩进的,如果粘贴的是多行的文本,则第二行缩进1个tab,第三行缩进2个tab……依此类推,到最后文本会面目全非,解决办法是粘贴之前设置为 ...

  9. Linux基本操作笔记

    1.Linux是一个统称,内核是一致的.分为Linux系统管理员和Linux程序员包括管理和软件开发. 2.要掌握Linux,有四步,第一,在Linux平台上的开发,比如,vi.gcc.gdb等和Li ...

  10. 算法8 五大查找之:二叉排序树(BSTree)

    上一篇总结了索引查找,这一篇要总结的是二叉排序树,又称为二叉搜索树(BSTree) . 构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除的效率. 什么是二叉排序树呢?二叉排序树 ...