基于python的PatchMatchStereo立体匹配算法实现

news2024/11/17 1:32:52

文章目录

  • 前言
  • 一、PatchMatchStereo是什么?
    • 1.随机初始化
    • 2.迭代传播
      • 2.1空间传播
      • 2.2视图传播
      • 2.3帧间传播
      • 2.4平面细化
  • 二、PatchMatchStereo立体匹配算法实现


前言

  PatchMatchStereo是Michael Bleyer等在2011年发表于British Machine Vision Conference(BMVC)上的一篇双目立体匹配算法文章,和AD-census、SGM都是非常经典的算法,PMSstereo原文链接在此,可以直接下载阅读。PatchMatch Stereo - Stereo Matching with Slanted Support Windows
参考文献:必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程
【理论恒叨】【立体匹配系列】经典PatchMatch: (2)基于PatchMatch的视差估计


一、PatchMatchStereo是什么?

  PatchMatchStereo的思路主要是使用和传统固定窗口式不同的倾斜支持窗进行局部立体匹配,在Middlebury数据集上获得非常好的匹配效果,一段时间内高居排行榜第一名。更难能可贵的是,它和SGM一样数据泛化能力出色。
  倾斜支持窗原理李博讲的已经很清楚啦【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
  PMS巧妙的借用PatchMatch的思路。PatchMatch的基本思想是:在自然图像中,一个有一定大小的像素块内所有像素都可以用同一个平面来近似。这也构成了PMS的基本思想,即图像可看作多个像素块,而每个像素块可有一个近似的视差平面,算法的目标就是要找到图像的所有视差平面。感兴趣的同学可以阅读一下:PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing

1.随机初始化

  PMS的出发点是为所有像素点都找到一个属于它的动态的视差平面,设像素点p 的视差为dp,则p 的视差平面方程为:
在这里插入图片描述
  随机初始化是PMS寻找视差平面的第一步,即为每个像素随机一个视差平面。PMS期望能够通过该步骤能够在每一个平面区域中至少为1个像素随机到正确平面,后续PMS会经过多次传播,把该正确平面传播到同一平面区域的其他所有像素。原则上是可以直接对平面图片的三个参数af、bf、cf进行随机赋值,但是这样做无法保证在可允许的视差空间中进行均等的采样,且对效率和效果都有影响,故PSM的做法是:设定视差范围[0,dmax],从中选取一个视差值z0,这样我们就有了平面上的一个点P ( x0 , y0 , z0 ),然后随机一个单位向量 n ⃗ \vec n n = ( nx , ny , nz ) 作为平面法线,则af、bf、cf就可以解出:
在这里插入图片描述
注:
若固定 n ⃗ \vec n n = ( 0 , 0 , 1 ) 则变成Fronto-parallel Windows。
若想取整像素精度,则可强制 z0为整数值(一般而言 z0为浮点数)。

2.迭代传播

  如图所示,它的基本思想是把随机的所有视差平面中的少数正确的视差平面传播至同一视差平面内的其他像素。迭代过程中,每一个像素将经历4个阶段:空间传播、视图传播、帧间传播、平面细化,一般先处理左图,然后再处理右图。在偶数次迭代中从左上到右下依次遍历每一个像素,在奇数次迭代中,则顺序相反。
在这里插入图片描述

2.1空间传播

  空间传播的思想是在空间上相邻的像素一般具有相近的视差,PMS假设像素点p 当前的平面为 fp,其邻域内像素q当前的平面也为 fp,判断是否m(p,fp)<m(p,fq),若是则用 fp作为q的视差平面。
  m(p,f)为像素p当视差平面为f 时的聚合代价值,详细解释还是参考李博博客【理论恒叨】【立体匹配系列】经典PatchMatch: (1)Slanted support windows倾斜支持窗模型
在这里插入图片描述

注:
偶数次迭代,p是q左侧或者上面的像素 ,  ↓↑  →←
奇数次迭代,p是q右侧或者下面的像素 ,  ↓↑↓  →←→

2.2视图传播

  视图传播的思想基础是左(右)图中的像素点与右(左)图中的对应匹配点应当具有相同的视差平面(一致性检查,同名像对会有相同的视差值)。假设像素点p当前的平面为fp,在右视图上找到同名点p ′的平面为 fp ′,若m(p,fp ′)<m(p,fp),则把平面fp ′ 作为像素p的新平面。

2.3帧间传播

  帧间传播主要用于视频序列中,它所基于的假设是相邻帧同一位置的像素大概率有相似的平面,假设像素点p当前的平面为fp
​,前后帧和p位置相同的像素为p ′ ,fp ′ 为p ′的视差平面,若m(p,fp ′)<m(p,fp),则把平面fp ′作为像素p的新平面。

2.4平面细化

  平面细化的目的是通过更新像素p = ( x0 , y0)的视差平面fp进一步降低匹配代价。由于平面图片可以由一个点fp和一个法向量 n ⃗ \vec n n 表示,所以平面的更新可以通过点坐标和法向量的更新来得到。z0 n ⃗ \vec n n 的最大变化量为z0-max,然后在[- Δ \Delta Δz0max, Δ \Delta Δz0max]范围内随机一个值 Δ \Delta Δz0加到z0得到z0,由此得到新的点P’= ( x0 , y0 , z0 '),然后在[- Δ \Delta Δz0max, Δ \Delta Δz0max]中随机三个值来计算新的法向量 n ⃗ ′ \vec n' n = u( n ⃗ \vec n n + Δ \Delta Δn),u为将向量归一化的单位。新的点p‘和新的向量 n ⃗ ′ \vec n' n 组成新的平面fp ′ ,若m(p,fp ′)<m(p,fp),则把平面fp ′作为像素p的新平面。
  平面优化步骤也是迭代进行的,初始设置 Δ \Delta Δz0max = maxdisp/2(maxdispmaxdispmaxdisp为设置的最大视差值)、 Δ \Delta Δnmax =1,每次迭代后,设置 Δ \Delta Δz0max /2, Δ \Delta Δnmax /2由此来逐渐缩小搜索空间,直到 Δ \Delta Δz0max <0.1停止迭代。
  假如像素当前的视差平面是完全错误的,初次迭代使用较大的搜索范围就有可能将其转移到正确平面附近,之后的迭代中不断的缩小搜索范围,使得视差平面在当前平面附近捕获视差细节,能够适用于弧形表面。


二、PatchMatchStereo立体匹配算法实现

  借鉴githubPatchMatchStereo大佬的代码,已经测试好,方便大家使用,链接放到下面啦,自行下载就好啦。
基于python的PatchMatchStereo立体匹配算法实现
在这里插入图片描述
  直接修改自己的图片路径就好啦,这里的50是指的最大视差dmax。其他参数大家也可以自行调整一下,就不细说啦,直接放效果图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 鸢尾花数据集划分 训练集和测试集

目录 一&#xff1a;加载数据 二&#xff1a;数据集整理 三&#xff1a;数据集划分 一&#xff1a;加载数据 加载数据&#xff0c;并创建一个DataFrame&#xff0c;便于数据分析 from sklearn.datasets import load_iris import pandas as pd import numpy as np from skle…

大数据:计算学生成绩

文章目录一、提出任务二、任务进行&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动器类…

【JavaSE】类和对象(三)——内部类

目录 1. 何为内部类 2. 内部类的分类 2.1 静态内部类 2.1.1 如何实例化静态内部类的对象&#xff1f; 2.1.2 外部类与静态内部类如何相互访问&#xff1f; 2.2 非静态内部类/实例内部类 2.2.1 非静态内部类不能定义静态的成员变量以及方法 2.2.2 非静态内部类的实例化 2.2.…

三层-生成树-ospf-速端口思科练习实验

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

Spark-SaprkStreaming(概述、架构、原理、DStream转换、案例)

文章目录SparkStreaming概述特点架构原理DStream和RDD的区别DAG如何读取数据(※)WordCount 案例实操代码解析RDD 队列用法及说明案例实操自定义数据源Kafka 数据源DStream 转换无状态转化操作Transformjoin有状态转化操作UpdateStateByKeyWindowOperationsDStream 输出优雅关闭…

pip命令安装torchnet包,超简单!

pip命令安装torchnet包&#xff0c;超简单&#xff01; torchnet是torch的框架&#xff0c;它提供了一组抽象&#xff0c;旨在鼓励代码重用以及鼓励模块化编程。 目前&#xff0c;torchnet提供了四组重要的类&#xff1a; Dataset&#xff1a;以各种方式处理和预处理数据。 …

Typora入门教程

文章目录Typora入门教程1 简要介绍2 下载安装包3 常用操作3.1 标题3.2 加粗3.3 斜体3.4 高亮3.5 分割线3.6 图片3.7 链接3.8 引用3.9 列表3.10 目录3.11 表格3.12 代码块3.13 行内代码3.14 按键效果4 自定义快捷键5 Typora PicGo 阿里云OSS搭建个人笔记5.1 注意事项5.2 准备工…

Hibernate学习总结

文章目录一、图解运行过程二、核心代码三、session方法2、session缓存3、save&#xff08;&#xff09;与persist&#xff08;&#xff09;4、get()5、update()6、delete()7、evict()8、doWork()&#xff0c;可获得connection对象四、hibernate.cfg.xml(使用数据库连接池)五、*…

java项目-第176期ssm个人交友网站系统-java毕业设计

java项目-第176期ssm个人交友网站系统-java毕业设计 【源码请到下载专栏下载】 《个人交友网站》 该项目分为2个角色&#xff0c;管理员、用户角色。 用户可以浏览前台,包含功能有&#xff1a; 首页、交友信息、线下活动、系统公告、论坛信息 管理员进行后台登录&#xff0c;包…

【KNN分类】基于matlab模拟退火优化KNN、蝗虫算法优化KNN数据分类【含Matlab源码 2275期】

⛄一、1KNN算法思想 K近邻算法&#xff08;KNN,K nearest neighbor algorithm&#xff09;是机器学习中一种基本的分类与回归方法&#xff0c;其主要原理是通过对不同测试样本之间的距离进行量测&#xff0c;而后寻找最为相近的K个样本来进行分类&#xff0c;具有简单、直观、…

【LeetCode题目详解】(三)21.合并两个有序链表、141.环形链表、142.环形链表Ⅱ

目录 一、力扣第21题&#xff1a;合并两个有序链表 解法思路 代码一 代码二 代码三 二、力扣第141题&#xff1a;环形链表 1.快慢指针法 2.证明快慢指针是可行的 三、力扣第142题&#xff1a;环形链表Ⅱ 1.解题思路 2.代码 总结 一、力扣第21题&#xff1a;合并两个…

selenium自动化测试

文章目录1.什么是自动化测试2.UI自动化测试3, webdriver的原理元素的定位定位操作示例操作测试对象添加等待固定等待智能等待打印信息浏览器的操作浏览器最大化设置浏览器宽、高操作浏览器的前进、后退控制浏览器滚动条键盘事件键盘按键用法键盘组合键用法鼠标事件ActionChains…

接口测试(七)—— 参数化、数据库操作封装、接口自动化框架

目录 一、接口自动化测试框架 1、目录结构 二、封装iHRM登录 1、普通方式实现 2、登录接口对象层 3、登录接口测试用例层 4、封装断言方法 三、参数化 1、回顾UnitTest参数化 1.1 原始案例 1.2 参数化实现 1.3 从json文件读取 2、登录接口参数化 2.1 组织数据文…

ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 反距离权重插值分析 4.2 多栅格局域运算 4.3 按表格显示分区统计 4.4 重分类 4.5 邻域运算 4.6 矢量数据的裁剪 4.7 缓冲区分析及栅格数据提取分析 05 思考及讨论 01 说明 由于这次的作业是从word…

jsp+ssm计算机毕业设计宠物寻回系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

2.两数相加

正在建设中 传送门&#xff1a; https://leetcode.cn/problems/add-two-numbers/ 题目描述 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。 请你将两个数相加&#xff0c;并以相同形…

git 进阶系列教程-------git使用流程

GIT使用流程 前言 初衷 git是一门很容易入门的项目管理工具&#xff0c;但是它是一门很难精通的技术。 git pull/git add ./git commit -m "message"/git push/......知道以上几个命令&#xff0c;或许再多一点&#xff0c;也许就能说&#xff1a;‘我会git’了。…

IDEA画UML类图

第一步(IDEA下载画图插件) PlantUML Integration 插件可以支持画图 第二步(创建类图文件) 点击之后会让选择 选择class即可 类图的语法 在画类图的时候分为五种 1. 依赖 依赖分为好多种&#xff0c; 作为成员变量&#xff0c;作为方法的入参和出参&#xff0c;在类中使用…

【JSP菜鸟教程】

简介 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 Scriptlet脚本小程序 如果你想在HTML中写Java代码&#xff0c;就需要将Java代码写入Scriptlet中&#xff0…

数据库实验一:数据定义与操作语言实验

实验一 数据定义与操作语言实验 实验 1.1 数据库定义实验 1.实验目的 理解和掌握数据库DDL语言&#xff0c;能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。 2.实验内容和要求 理解和掌握SQL DDL语句的语法&#xff0c;特别是各种参数的具体含义和使用方…