利用光场进行深度图估计(Depth Estimation)算法之一——聚焦算法
前面几篇博客主要说了光场相机,光场相机由于能够记录相机内部整个光场,可以实现重聚焦(模糊线索)和不同视角的变换(视差线索),同时也可以利用这个特性进行深度估计(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)算法之一——聚焦算法的更多相关文章
- 利用光场进行深度图估计(Depth Estimation)算法之二——匹配算法
光场相机由于能够捕获相机内部光线的强度和方向而得到整个光场,可以实现重聚焦(refocus)和视角变换等功能.进而可以进行深度估计获取深度图,前面说过利用重聚焦的图像进行深度估计,今天说一下利用不同视 ...
- 泡泡一分钟:Towards real-time unsupervised monocular depth estimation on CPU
Towards real-time unsupervised monocular depth estimation on CPU Matteo Poggi , Filippo Aleotti , Fa ...
- 【HEVC帧间预测论文】P1.9 Coding Tree Depth Estimation for Complexity Reduction of HEVC
Coding Tree Depth Estimation for Complexity Reduction of HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见: ...
- deep learning+ Depth Estimation
Depth estimation/stereo matching/optical flow @CVPR 2017 Unsupervised Learning of Depth and Ego-Moti ...
- [技术栈]C#利用Luhn算法(模10算法)对IMEI校验
1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...
- 行为识别笔记:improved dense trajectories算法(iDT算法)(转载)
iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法 ...
- 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
转自:http://blog.csdn.net/carson2005/article/details/7647500 TLD(Tracking-Learning-Detection)是英国萨里大学的一 ...
- FM算法(一):算法理论
主要内容: 动机 FM算法模型 FM算法VS 其他算法 一.动机 在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合:非线性SVM可 ...
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等.美国火星探测器核心的寻路算法就是采用的D*(D Star)算法. 最短路经计算分静态 ...
随机推荐
- PHP 判断Header 送出前, 是否有值被送出去: headers_sent()
1 为避免header()函数是,出现 <b>Warning</b>: Cannot modify header information - headers already ...
- window64 PHP ffmpeg详解简单上手 音频amr转mp3
从网上找了一大堆关于window 64 ffmpeg的信息,都是又长又不关键,让人难消化. 我只要简单的amr转MP3格式而已. 终于搞明白.自己总结了下! 希望能帮助到喜欢言简意赅,一眼上手的同学. ...
- BinderPool — Andorid端的“服务发现治理工具”
导语 最近在学习微服务相关知识,突然想到:微服务的思想虽然是在server端的场景下提出来的,但是无论是server,还是移动端,思想是相通的,移动端也会有多服务的场景,就同样面临多服务需要整合治理的 ...
- 初读"Thinking in Java"读书笔记之第二章 --- 一切都是对象
用引用操纵对象 Java里一切都被视为对象,通过操纵对象的一个"引用"来操纵对象. 例如, 可以将遥控器视为引用,电视机视为对象. 创建一个引用,不一定需要有一个对象与之关联,但此 ...
- Ubuntu Bash and Dash
http://blog.sina.cn/dpool/blog/s/blog_5f16b0590100r1ub.html?vt=4
- 【数论】洛谷P1313计算系数
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
- windows PAE扩展和AWE编程
在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开 ...
- HTML知识点之表示强调的主要元素
<h1>~<h6> 在HTML中,标题(Heading)元素共有6个级别的标签:<h1>~<h6>.它们都是块级元素.标题数字越小,字体就会越大,标题的 ...
- Android系统上如何实现easyconfig(airkiss)
刚买回来一个智能音箱和博联,需要给音箱和博联配置联网,音箱需要先打开蓝牙,然后在手机app中填写wifi的ssid和密码,通过蓝牙发送到音箱,音箱收到后连接到wifi. 博联就比较奇怪,进入联网模式以 ...
- 日期插件-flatpickr
github的仓库地址:https://github.com/chmln/flatpickr 手册地址:http://www.htmleaf.com/Demo/201608213895.html ...