3.4、matlab实现SGM/BM/SAD立体匹配算法计算视差图

news2024/9/20 18:54:34

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介

SGM(Semi-Global Matching)、BM(Block Matching)和SAD(Sum of Absolute Differences)都是用于计算立体匹配(Stereo Matching)的经典算法。在 MATLAB 中,可以通过以下步骤实现这些算法来计算视差图:

  1. 数据准备:

    • 加载左右视图的立体图像数据。
    • 确定像素之间的搜索范围。
  2. Block Matching (BM) 算法:

    • 设定一个固定大小的匹配窗口,在右视图中搜索与左视图中当前像素最相似的像素块。
    • 通过计算两个像素块之间的差异度(如均方误差)来确定最匹配的像素块。
    • 根据匹配的像素块位置计算视差值,得到视差图。
  3. Sum of Absolute Differences (SAD) 算法:

    • 对于每个像素,比较左右视图中像素值的绝对差异之和,即 SAD。
    • 选择 SAD 最小的像素对应的右视图像素为匹配像素,计算视差值。
  4. Semi-Global Matching (SGM) 算法:

    • SGM 是一种全局优化算法,通过考虑整幅图像的一致性来提高匹配精度。
    • SGM 中会定义能量函数,包含数据项(代表像素匹配的精度)和平滑项(代表视差之间的平滑性)。
    • 通过动态规划等方式优化能量函数,得到最终的视差图。
  5. 实现算法:

    • 在 MATLAB 中根据以上算法步骤编写对应的代码实现。
    • 使用 MATLAB 中提供的图像处理和计算工具函数进行像素匹配和视差计算。
  6. 可视化结果:

    • 将计算得到的视差图显示出来,以便观察立体匹配的效果和视差分布。

通过以上步骤实现 BM、SAD 和 SGM 算法,在 MATLAB 中可以对立体图像进行立体匹配并得出视差图,进而实现深度信息的获取和立体视觉应用。

立体匹配算法简介

立体匹配算法是计算机视觉中用于解决立体视觉问题的一种重要技术。它的目标是确定左右两幅图像中对应像素之间的视差,从而实现深度信息的获取和三维重建。下面对几种常见的立体匹配算法进行综述:

  1. 区域匹配算法:

    • 基于块匹配(Block Matching):该算法将图像划分为小块,然后在左图像中选择一个块,在右图像中搜索与之最相似的块,最终确定视差值。
    • 基于相似性度量的方法:如SAD(Sum of Absolute Differences)、SSD(Sum of Squared Differences)等,通过计算像素值的差异来找到最佳匹配。
  2. 局部优化算法:

    • 基于动态规划的立体匹配算法:如DP(Dynamic Programming)算法,通过计算代价矩阵并进行动态规划来选择最优路径,减少匹配误差。
    • Census变换:通过对图像像素进行二进制编码,比较像素之间的相似性来提高匹配准确率。
  3. 全局优化算法:

    • Semi-Global Matching(SGM)算法:使用全局成本聚合来优化立体匹配结果,有效降低复杂图像场景下的匹配误差。
    • 图割算法:将匹配问题转化为最小割最大流问题,在全局范围内优化匹配结果。

以上仅列举了几种常见的立体匹配算法,实际应用中还有许多衍生算法和混合算法,如SGM-BM算法、SGM-SAD算法等。不同的算法适用于不同的场景和需求,选择合适的立体匹配算法是提高匹配精度和稳定性的关键。

2、matlab实现SGM立体匹配算法计算视差图

SGM立体匹配算法简介

SGM(Semi-Global Matching)是一种常用的立体匹配算法,通过全局优化来提高立体匹配的准确性。下面是 SGM 立体匹配算法的原理:

  1. 能量函数定义:

    • SGM 算法将立体匹配问题建模为能量最小化问题。定义一个能量函数,包含数据项和平滑项。
    • 数据项:表示匹配代价,通常用像素间的灰度差异来衡量。
    • 平滑项:表示视差之间的一致性,通常取视差的梯度。
  2. 能量计算:

    • 对于每个像素,计算与其相邻像素的匹配代价,并考虑视差之间的一致性。
    • 通过动态规划或其他方法计算各像素处的能量,得到最小的能量值和对应的视差值。
  3. 聚合过程:

    • 在整个图像上进行像素的能量聚合,考虑像素之间的一致性。
    • 通过横向、纵向、斜向等方向的聚合,得到全局一致的能量分布。
  4. 最小路径计算:

    • 根据聚合后的能量图,通过动态规划或其他方法计算从每行最左侧到最右侧的最小能量路径,即最优视差图。
  5. 后处理:

    • 对得到的视差图进行后处理,如边缘保护、视差平滑等,以提高匹配的准确性和稳定性。
  6. 时间复杂度优化:

    • SGM 算法的时间复杂度较高,可通过多尺度策略、并行计算等方法来加速处理。

通过以上原理,SGM 立体匹配算法在全局一致性的基础上,结合数据项和平滑项的能量最小化方法来实现高精度的立体匹配,适用于提取深度信息、三维重建等立体视觉任务。

2.1、左右红外视图SGM立体匹配计算视差图

1)左右红外视图导入及显示

代码:

L= imread('C:\Users\16023\Desktop\例程\L00.png');%红外图
R= imread('C:\Users\16023\Desktop\例程\R00.png');
figure(1);imshowpair(L,R,'montage');title('1左右红外图');

2)SGM立体匹配视差图计算及显示

代码:

DR = [0 48];%视差值范围
DM = disparitySGM(L,R,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure(2);imshow(DM);title('2立体匹配SGM视差图');

2.2、左右彩色视图SGM立体匹配计算视差图

1)左右彩色视图导入及显示

代码:

L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图
R= imread('C:\Users\16023\Desktop\例程\r1.png');
figure(1);imshowpair(L,R,'montage');title('1左右彩色图');


2)左右彩色视图转换为红外图

代码:

LL= rgb2gray(L);%彩图转换为灰度图
RR= rgb2gray(R);
figure(2);imshowpair(LL,RR,'montage');title('2左右红外图');

3)SGM立体匹配视差图计算及显示

代码:

DR = [0 48];%视差值范围
DM = disparitySGM(LL,RR,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure(3);imshow(DM);title('3立体匹配SGM视差图');

3、matlab实现BM匹配算法计算视差图

BM立体匹配算法简介

BM(Block Matching)立体匹配算法是一种基于局部相关性的立体匹配算法,用于计算左右两幅图像之间的视差(disparity)。该算法通过在两幅图像中的对应区域内比较像素值的相似性来寻找最优匹配,以此确定视差值。

具体来说,BM算法将左图像划分成大小相同的块(block),然后在右图像中对应的位置上搜索与左图像块最相似的块,通过计算两个块之间像素值的差异来得到匹配的代价(cost)。最终,选择代价最小的块作为最佳匹配,其视差值即为左右图像之间的视差。

BM算法的优点是简单直观,易于实现,并且具有较好的鲁棒性。然而,由于其依赖局部像素的相似性进行匹配,对于纹理较少、重复区域较多的图像不够稳定,容易产生匹配错误。因此,在实际应用中,BM算法通常与其他更高级的立体匹配算法结合使用,以提高匹配精度和稳定性。

 3.1、左右红外图BM立体匹配计算视差图

1)左右视图导入及显示

代码:

L= imread('C:\Users\16023\Desktop\例程\L00.png');%红外图
R= imread('C:\Users\16023\Desktop\例程\R00.png');
figure(1);imshowpair(L,R,'montage');title('左右红外图');

d5e4e19beb814bc498296b2233a14b66.jpeg

2)BM立体匹配算法视差图计算及效果展示

代码:

DR = [0 48];%视差值范围
DM = disparityBM(L,R,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure();imshow(DM)

7b637d035dae46edb1b06fad6a5986cb.jpeg

3.2、左右彩色图BM立体匹配计算视差图

1)左右视图导入及显示

代码:

L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图
R= imread('C:\Users\16023\Desktop\例程\r1.png');
figure(1);imshowpair(L,R,'montage');title('左右红外图');

515428e8cb394de7b64a8a048adb4f40.jpeg

2)左右视图灰度化及显示

代码:

LL= rgb2gray(L);%彩图转换为灰度图
RR= rgb2gray(R);

77e2fdab1c504e52a864084bbfbd3ca6.jpeg

3)BM立体匹配算法视差图计算及效果展示

代码:

DR = [0 48];%视差值范围
DM = disparityBM(LL,RR,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure(2);imshow(DM)

5c9158e8bdaa4e2d92be7beb9c74ce97.jpeg

 4、matlab实现SAD立体匹配算法计算视差图

SAD立体匹配算法简介

SAD(Sum of Absolute Differences)立体匹配算法是一种基于像素值的相似性来查找最佳匹配的立体匹配算法。该算法的原理是计算左右两幅图像之间每个像素的绝对差异,并将所有差值相加到得到一个代价(cost)值,然后选择代价最小的像素作为最佳匹配。

具体来说,SAD算法首先选择一个目标像素在左图像中的邻域区域,然后在右图像中在相同位置和大小的区域内搜索与左图像区域最相似的区域。对于每个可能的匹配,算法计算左右两个区域之间每个像素值的绝对差值,并将所有差值相加得到一个代价值。最终选择代价最小的区域作为最佳匹配,并将该区域的中心像素的视差作为左右图像之间的视差。

SAD算法的优点是简单易懂,计算量较小,并且对噪声具有较好的稳定性。然而,由于SAD算法只考虑像素值的差异,对于存在纹理重复和遮挡的图像场景,容易出现匹配错误。因此,在实际应用中,通常需要结合其他算法来提高立体匹配的精度和鲁棒性。

4.1、左右红外图SAD算法立体匹配计算视差图

1)左右视图导入及显示

代码:

LI=imread('C:\Users\16023\Desktop\例程\L00.png');%左视图
RI=imread('C:\Users\16023\Desktop\例程\R00.png');%右视图
figure(1);imshowpair(L,R,'montage');title('左右红外图');

d3a2bae56f8b472fb4021c356799db47.jpeg

 2)SAD立体匹配视差图计算及显示

代码:

[m n]=size(LI);%视图大小
w=3;       %窗口边长
depth=10;    %最大偏移距离/最大深度距离
IMG=zeros(m,n);
for i=1+w:m-w
   for j=1+w+depth:n-w 
       tmp=[];%空数组
       LW=LI(i-w:i+w,j-w:j+w);
       for k=0:-1:-depth        
           RW=RI(i-w:i+w,j-w+k:j+w+k);
           diff=LW-RW;
           tmp=[tmp sum(abs(diff(:)))];
       end
       [a IMG(i,j)]=min(tmp);   %获得最小位置的索引
   end
end
figure(3);imshow(IMG,[]);title('SAD视差图');

f1d3e0b2f37e4a4f88549bb288daf175.jpeg

4.2、 左右彩色图SAD算法立体匹配计算视差图

1)左右视图导入及显示

代码:

L= imread('C:\Users\16023\Desktop\例程\l1.png');%彩色图
R= imread('C:\Users\16023\Desktop\例程\r1.png');
figure(1);imshowpair(L,R,'montage');title('左右彩色图');

73f0c1ea2dc8454d88f01e5f3fecc7fa.jpeg

2)左右视图灰度转换及显示

代码:

LI= rgb2gray(L);%彩图转换为灰度图
RI= rgb2gray(R);
figure(2);imshowpair(LI,RI,'montage');title('左右红外图');

ff19784469634025b01a6bed5b4f25f4.jpeg

3)SAD立体匹配视差图计算及显示

代码;

[m n]=size(LI);%视图大小
w=3;       %窗口边长
depth=10;    %最大偏移距离/最大深度距离
IMG=zeros(m,n);
for i=1+w:m-w
   for j=1+w+depth:n-w 
       tmp=[];%空数组
       LW=LI(i-w:i+w,j-w:j+w);
       for k=0:-1:-depth        
           RW=RI(i-w:i+w,j-w+k:j+w+k);
           diff=LW-RW;
           tmp=[tmp sum(abs(diff(:)))];
       end
       [a IMG(i,j)]=min(tmp);   %获得最小位置的索引
   end
end
figure(3);imshow(IMG,[]);title('SAD视差图');

c99806af56274099a3b8400d3d54bfcb.jpeg

5、SGM/BM/SAD立体匹配算法比较 

SGM(Semi-Global Matching)是一种基于全局优化的立体匹配算法,与BM(Block Matching)和SAD(Sum of Absolute Differences)算法相比具有更高的匹配精度和鲁棒性。以下是它们之间的比较:

  1. 精度:SGM算法通过全局优化方法来考虑整个图像区域的一致性,能够更准确地估计视差值,尤其在纹理重复和遮挡情况下效果更好。相比之下,BM和SAD算法局限于局部像素的匹配,容易受到噪声和纹理重复的影响,匹配精度较低。

  2. 鲁棒性:SGM算法通过全局优化可以提高算法的稳健性,对图像噪声和遮挡有更好的抵抗能力。BM和SAD算法在复杂场景下易产生匹配错误,对边缘和纹理丰富的区域匹配效果较好。

  3. 计算复杂度:SGM算法的计算复杂度较高,因为需要对整个图像进行全局优化。BM和SAD算法计算速度较快,适合实时性要求较高的应用。

综上所述,SGM算法在匹配精度和鲁棒性方面优于BM和SAD算法,适合对立体匹配有较高要求的应用场景。而BM和SAD算法则更适合计算简单、实时性要求较高的情况下使用。在实际应用中,可以根据具体需求选择合适的算法。

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

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

相关文章

什么是上网行为审计系统?有哪些功能?一文全搞定!

员工A(好奇地):“嘿,你听说了吗?公司最近要安装上网行为审计系统,说是要监控我们的上网行为。” 员工B(惊讶地):“真的吗?那岂不是很没有隐私?”…

xpeviewer.exe工具查看pe结构

1、下载地址 Releases horsicq/XPEViewer (github.com) 2、效果图

MATLAB R2023b下载安装教程汉化中文版设置

MATLAB R2023b下载安装教程汉化中文版设置 Matlab 是一款功能强大的商业数学软件 Matlab(Matrix Labortory)即矩阵实验室,它在数值计算、数据分析、算法开发、建模与仿真等众多领域都发挥着重要作用。 Matlab 具有以下显著特点和优势&…

力扣第十七题——电话号码的字母组合

内容介绍 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…

关于Centos停更yum无法使用的解决方案

最近在使用Centos7.9系统时候,发现yum仓库无法进行安装软件包了,官方说2024年6月30日进行停更,停更后无法提供对应的软件服务。 我在使用yum安装包的时候发现确实不能使用官方服务了: CentOS停更的影响 CentOS停止更新之后&#…

Python基础——数据容器(超详细版!)

目录 数据容器简介: list(列表) 列表特点: 列表定义: 列表的下标索引: 列表的常用方法: 列表的遍历: tuple(元组) 元组嵌套list: string(字符串) 字符串常用方法: 序列: 集合: 集合特点: 集合常用方法: 前言: 本篇文章主要讲解Python数据容器的基…

Starrocks on hive如何判断Hive表存在数据倾斜

存在数据倾斜时MaxTime和MinTime相差过大: 不存在数据倾斜时MaxTime和MinTime相差不大:

基于词级ngram的词袋模型对twitter数据进行情感分析

按照阿光的项目做出了学习笔记,pytorch深度学习实战项目100例 基于词级ngram的词袋模型对twitter数据进行情感分析 什么是 N 符? N 格是指给定文本或语音样本中 n 个项目的连续序列。这些项目可以是音素、音节、字母、单词或碱基对,具体取…

算法日记day 12(栈实现队列|队列实现栈|有效的括号)

队列是先进先出的,就像排队一样,谁在前谁先获得服务 栈是一种先进后出的数据结构 一、用栈实现队列 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)&#xf…

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页: 品牌管理增加模糊查询: 品牌管理关联分类: 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系,用中间表 涉及的类: 方法都比较简单,就不贴代码了

可解释医学视觉问答的反事实因果干预| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 Counterfactual Causal-Effect Intervention for Interpretable Medical Visual Question Answering 可解释医学视觉问答的反事实因果干预 01 文献速递介绍 深度学习的进步在计算机视觉、自然语言处理和信息检索领域成功地取得了最先进的(SOTA&…

SpringBoot连接PostgreSQL+MybatisPlus入门案例

项目结构 一、Java代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…

基于秒杀系统的企业开发设计思考

一、需求分析 需求描述为实现某商品秒杀活动&#xff0c;结果为商品库存为0&#xff0c;订单数量和商品原有库存数量相等&#xff0c;即保障系统数据一致性同时&#xff0c;保障系统稳定性 二、流程设计 三、数据库设计 本次示例仅涉及商品表、订单表&#xff0c;这里分享数…

2024可信数据库发展大会:TDengine CEO 陶建辉谈“做难而正确的事情”

在当前数字经济快速发展的背景下&#xff0c;可信数据库技术日益成为各行业信息化建设的关键支撑点。金融、电信、能源和政务等领域对数据处理和管理的需求不断增加&#xff0c;推动了数据库技术的创新与进步。与此同时&#xff0c;人工智能与数据库的深度融合、搜索与分析型数…

《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记

《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战&#xff0c;重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …

AI算法18-最小角回归算法Least Angle Regression | LARS

​​​ 最小角回归算法简介 最小角回归&#xff08;Least Angle Regression, LAR&#xff09;是一种用于回归分析的统计方法&#xff0c;它在某些方面类似于最小二乘回归&#xff0c;但提供了一些额外的优点。最小角回归由Bradley Efron等人提出&#xff0c;主要用于处理具有…

【鸿蒙学习笔记】舜和酒店项目开发

这里写目录标题 前期准备1. 环境准备2. 开发工具准备 创建项目1. 使用 deveco-studio 创建 ShunHeHotel 项目2. 把ShunHeHotel 项目使用git进行版本控制3. 提交第1个commit&#xff0c;Alt0 → 输入commit message → 提交4. 查看已经提交的第一个提交5. gitcode 创建同名远程项…

数据库系统概论:关系型数据库系统

引言 如今最为重要的数据模型便是关系模型。关系数据库就是支持关系模型的数据库系统&#xff08;Relational Database Management System, RDBMS&#xff09; 关系模型可以简单理解为二维表格模型&#xff0c;一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。…

1、常用模块讲解(simulink仿真)

1、常用模块讲解&#xff08;simulink仿真&#xff09; Simulate有很多库 进入simulink 命令行simulink再回车 &#xff0c;或点击菜单栏 Export model to 可以将高版本保存为低版本 1&#xff0c;在MATLAB主界面&#xff0c;新建编辑器&#xff0c; a1:100; bsin(a*0.2); pl…

argparse部分用法

文章目录 一、一个简单的示例1.导入模块2.创建解析器3.添加参数4.解析参数5.使用解析的参数6.完整程序7.运行 二、更多用法1.ArgumentParser对象创建时的参数2.add_argument()的参数&#xff08;1&#xff09;name&#xff1a;名称1&#xff09;位置参数2&#xff09;可选参数3…