热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python深度视差计算_python窗口代价计算视差

一、窗口代价计算视差的的基本原理二、实现NCC视差匹配方法三、图像集四、总结一、窗口代价计算视差的的基本原理立体匹配算法的原理:就是找出两张图像的对应关系࿰

一、窗口代价计算视差的的基本原理

二、实现NCC视差匹配方法

三、图像集

四、总结

一、窗口代价计算视差的的基本原理

立体匹配算法的原理:就是找出两张图像的对应关系,根据三角测量原理,得到视差图;在获得了视差信息后,根据投影模型很容易地可以得到原始图像的深度信息和三维信息。

立体匹配算法的分类:全局匹配算法、局部匹配算法

局部立体匹配算法:又称基于窗口的方法或基于支持区域的方法,对图像集中每张图像的每个像素计算一个适合大小、形状和权重的窗口。然后对这个窗口内的视差值进行加权平均。理想的支持窗口应该完全覆盖弱纹理区域,并在窗口内深度连续。与全局立体匹配算法相似,通过优化一个代价函数的方法计算最佳视差。但是,在局部立体匹配算法的能量函数中,只有基于局部区域的约束数据项,没有平滑项。局部匹配算法仅利用某一点邻域的灰度、颜色、梯度等信息进行计算匹配代价,计算复杂度较低,大多实时的立体匹配算法都属于局部立体匹配的范畴,但局部立体匹配算法对低纹理区域、重复纹理区域、视差不连续和遮挡区域匹配效果不理想。

全局立体匹配算法: 主要是采用了全局的优化理论方法估计视差,建立一个全局能量函数,其包含一个数据项和平滑项,通过最小化全局能量函数得到最优的视差值。其中,图割(Graph cuts, GC)、置信传播(Belief Propagation,BP)、动态规划(Dynamic Programming,DP),粒子群算法(Particle Swarm Optimization,PSO)、遗传算法(Genetic Algorithm,GA)等优化算法都是常用的求解能量最小化的方法。

全局立体匹配算法一般用到的函数:

其中数据项

描述了匹配程度,平滑项

体现了定义场景的约束,C是匹配代价,P是不同两像素p和q视差的函数,一般称之为惩罚项(penalty),当p点和q点视差不相等时,P>0,且与两者差值越大,P值越大。当p和q视差相等时,P=0。由于全局匹配算法在数学上是一个能量函数的优化问题,因此可以找到最优解。这个问题被证明在二维空间是NP困难的。因此,即使全局算法具有准确性较高的优点,其计算速度确非常慢,在实时性要求高的场合不适合使用全局立体匹配算法。

比较两种算法之间的差异:局部算法运算速度快,但是弱纹理、遮挡和视差不连续区域错误匹配率高。全局算法精度高,但计算复杂度也相应的较高,耗时长、难以达到实时性。

立体匹配的步骤:

①匹配代价计算(Cost Computation):计算参考图像上每个像素点IR(P),以所有视差可能性去匹配目标图像上对应点IT(pd)的代价值,因此计算得到的代价值可以存储在一个h*w*d(MAX)的三维数组中,通常称这个三维数组为视差空间图

②代价聚合(Cost Aggregation):  通常全局算法不需要代价聚合,而局部算法需要通过求和、求均值或其他方法对一个支持窗口内的匹配代价进行聚合而得到参考图像上一点p在视差d处的累积代价CA(p,d),这一过程称为代价聚合。通过匹配代价聚合,可以降低异常点的影响,提高信噪比(SNR,Signal Noise Ratio)进而提高匹配精度。

③视差计算(Disparity Computation): 局部立体匹配算法的思想,在支持窗口内聚合完匹配代价后,获取视差的过程就比较简单。通常采用‘胜者为王’策略(WTA,Winner Take All),即在视差搜索范围内选择累积代价最优的点作为对应匹配点,与之对应的视差即为所求的视差。即P点的视差为

④后处理(Post Process):  一般的,分别以左右两图为参考图像,完成上述三个步骤后可以得到左右两幅视差图像。但所得的视差图还存在一些问题,如遮挡点视差不准确、噪声点、误匹配点等存在,因此还需要对视差图进行优化,采用进一步执行后处理步骤对视差图进行修正。

二、实现NCC视差匹配方法

2、1原理:对于原始的图像内任意一个像素点(px,py) (p_x,p_y)(p x​ ,p y)构建一个n×n n\times nn×n的邻域作为匹配窗口。然后对于目标相素位置(px+d,py) (p_x+d, p_y)(p x+d,p y)同样构建一个n×n n\times nn×n大小的匹配窗口,对两个窗口进行相似度度量,注意这里的d dd有一个取值范围。对于两幅图像来说,在进行NCC NCCNCC计算之前要对图像处理,也就是将两帧图像校正到水平位置,即光心处于同一水平线上,此时极线是水平的,否则匹配过程只能在倾斜的极线方向上完成,这将消耗更多的计算资源。

NCC计算公式:

其中NCC(P, d)得到的值得范围将在[-1, 1]之间。

Wp为之前提到的匹配窗口。

I(2, y)为原始图像的像素值。

Ii (PI, Py)为原始窗口内像素的均值。

I2(x + d, y)为原始图像在目标图像上对应点位置在方向上偏移d后的像素值。

2(P:+ d, Py)为目标图像匹配窗口像素均值。

.若NCC= -1,则表示两个匹配窗口完全不相关,相反,若NCC= 1时,表示两个匹配窗口相关程度非常高。匹配流程

2、2匹配流程

采集图像

级线矫正

特征匹配

深度恢复

2、3代码实现:

1 # -*- coding: utf-8 -*-

2 from PIL import Image

3 from pylab import *

4 import cv2

5 from numpy import *

6 from numpy.ma import array

7 from scipy.ndimage import filters

8 def plane_sweep_ncc(im_l,im_r,start,steps,wid):

9 """ 使用归一化的互相关计算视差图像 """

10 m,n = im_l.shape

11 # 保存不同求和值的数组

12 mean_l = zeros((m,n))

13 mean_r = zeros((m,n))

14 s = zeros((m,n))

15 s_l = zeros((m,n))

16 s_r = zeros((m,n))

17 # 保存深度平面的数组

18 dmaps = zeros((m,n,steps))

19 # 计算图像块的平均值

20 filters.uniform_filter(im_l,wid,mean_l)

21 filters.uniform_filter(im_r,wid,mean_r)

22 # 归一化图像

23 norm_l = im_l - mean_l

24 norm_r = im_r - mean_r

25 # 尝试不同的视差

26 for displ in range(steps):

27 # 将左边图像移动到右边,计算加和

28 filters.uniform_filter(np.roll(norm_l, -displ - start) * norm_r, wid, s) # 和归一化

29 filters.uniform_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, s_l)

30 filters.uniform_filter(norm_r*norm_r,wid,s_r) # 和反归一化

31 # 保存 ncc 的分数

32 dmaps[:,:,displ] = s / sqrt(s_l * s_r)

33 # 为每个像素选取最佳深度

34 return np.argmax(dmaps, axis=2)

35

36 def plane_sweep_gauss(im_l,im_r,start,steps,wid):

37 """ 使用带有高斯加权周边的归一化互相关计算视差图像 """

38 m,n = im_l.shape

39 # 保存不同加和的数组

40 mean_l = zeros((m,n))

41 mean_r = zeros((m,n))

42 s = zeros((m,n))

43 s_l = zeros((m,n))

44 s_r = zeros((m,n))

45 # 保存深度平面的数组

46 dmaps = zeros((m,n,steps))

47 # 计算平均值

48 filters.gaussian_filter(im_l,wid,0,mean_l)

49 filters.gaussian_filter(im_r,wid,0,mean_r)

50 # 归一化图像

51 norm_l = im_l - mean_l

52 norm_r = im_r - mean_r

53 # 尝试不同的视差

54 for displ in range(steps):

55 # 将左边图像移动到右边,计算加和

56 filters.gaussian_filter(np.roll(norm_l, -displ - start) * norm_r, wid, 0, s) # 和归一化

57 filters.gaussian_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, 0, s_l)

58 filters.gaussian_filter(norm_r*norm_r,wid,0,s_r) # 和反归一化

59 # 保存 ncc 的分数

60 dmaps[:,:,displ] = s / np.sqrt(s_l * s_r)

61 # 为每个像素选取最佳深度

62 return np.argmax(dmaps, axis=2)

63

64 im_l = array(Image.open(r'jia/1.jpg').convert('L'), 'f')

65 im_r = array(Image.open(r'jia/2.jpg').convert('L'),'f')

66 # 开始偏移,并设置步长

67 steps = 12

68 start = 4

69 # ncc 的宽度

70 wid = 9

71 res = plane_sweep_ncc(im_l,im_r,start,steps,wid)

72 import scipy.misc

73 scipy.misc.imsave('depth.png',res)

74 show()

2、4结果截图

当wid=2时

运行结果:

当wid=9时

运行结果:

当wid=15时

运行结果:

小结:两张图片是从网上搜集的,图像集下面附有网址,1.jpg为模板,2.jpg为待测图像。我分别把wid设为2、9、15,运行出来的结果如上,当wid越小的时候,结果图的点就越密集,我所观察到的是有轮廓的地方,颜色就越深,而其他地方的颜色就比较浅,有的地方甚至呈现白色。我认为是窗口越小,像素点越密集,图像的清晰度就越高。

三、图像集

left                      right

图片链接:http://vision.middlebury.edu/stereo/data/scenes2003/

四、总结

这次试验我理解不是很精,只是跟着我的理解和参考一些博客来写的,图像是我网上收集的,打开我发的链接就可以搜到,代码是网上搜索到的,我运行出来的结果如上,我学到的知识是窗口代价计算视差的原理,也不是很精,就是大概知道一些原理和实现的步骤,从运行结果来看,我认为当窗口值越小时,匹配出的图像的点就越密集,像素点就越密集。有轮廓的地方,颜色就越黑,应该是因为有轮廓的区域或者很黑的的区域与与原模板相同位置的反差越小,反之,颜色越白的区域白表示周围跟模板相同位置反差越大。

参考博客:https://blog.csdn.net/qq_38898129/article/details/93074387

标签:wid,匹配,python,算法,im,图像,窗口,视差

来源: https://www.cnblogs.com/wyf-1999-1--6/p/12780109.html



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
author-avatar
whucad
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有