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

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-wfor 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-wfor 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.mzph.cn/news/871273.shtml

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

相关文章

远程帮客户解决“应用程序无法正常启动0xc000007b,请单击确定关闭应用程序”的问题

今天收到反馈,SmartPipe软件,在客户机器上报错,无法正常运行,采用远程控制软件进入客户电脑,发现电脑报错如下: 因为客户的电脑是win7,而之前发生过win7电脑上无法运行OCC编写的软件的情况&…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括: ❑ 封面; ❑ 文档修订记录表; ❑ 目录; ❑ 引言; ❑ 产品概述:产品结构图 ❑ 详细需求说明:产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…

涉案财物管理系统|八大模块可视化展示

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程,确保涉案财物的安全性、完整性和合法性;可以提高办案效率,减少办案成本,实现资源共享。 涉案财物管理系统DW-S405主要分为 8 大模块数据展示。 1、案件信息&…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的,这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO(命名管道)在以只读模式打开时,如果没有其他进程以写模式打开该 FIFO,open 调用将…

防火墙综合实验二

目录 实验要求 IP地址配置 需求七 需求八 需求九 需求十 需求十一 实验要求 接防火墙综合实验一! 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换)。 8,分公司设备可以通过…

美无定论,娜扎亦菲各自绽放你更爱哪一款?

娜扎亦菲各自绽放你更爱哪一款? 哎呀,这个问题可真是让我头疼呢, 就像让我在两个糖果店里选择最甜的那一颗一样难! 古力娜扎和刘亦菲,两位都是娱乐圈里璀璨的明珠, 美得各有千秋,让人怎么舍得…

C++基础入门(上)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 C基础入门(上) 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. C发展历史 2. C版本…

Goland 通道

channel通道 目录 channel通道 channel介绍 channel基本使用 有缓存通道和无缓存通道的区别 通道的初始化,写入数据到通道,从通道读取数据及基本的注意事项 channel的关闭和遍历 channel的关闭 为什么关闭 如何优雅地关闭通道 channel的遍历 chan…

小众好玩的赛车游戏:环道巨星 CIRCUIT SUPERSTARS中文安装包

《环道巨星》(Circuit Superstars)是一款由赛车迷亲手为其他赛车迷打造的俯视角赛车游戏。荟集史上各类赛车运动,旨在提供刺激好玩的驾驶体验;而游戏自带的高技术难度将促使玩家长时间磨砺技巧,以达成完美的一圈。 游戏…

【系统架构设计师】九、软件工程(面向对象方法|逆向工程)

目录 六、面向对象方法 6.1 基本概念 6.2 面向对象的分析 6.2.1 用例关系 6.2.2 类之间的关系 6.3 面向对象的设计 6.4 面向对象设计原则与设计模式 6.5 面向对象软件的测试 七、逆向工程 历年真题练习 六、面向对象方法 面向对象的分析方法 (Object-Oriented Analys…

【Linux网络】数据链路层【上】{初识数据链路层/以太网/路由表/MAC地址表/ARP表/NAT表}

文章目录 1.初识数据链路层2.认识以太网2.0前导知识以太网帧和MAC帧CMSA/CD以太网的最小帧长限制是64字节IP层和MAC层 2.1以太网帧格式 3.预备知识计算机网络通信以太网和wifi路由表/MAC地址表/ARP表/NAT表/ACL表 用于同一种数据链路节点的两个设备之间进行信息传递。 1.初识数…

Apache AGE 聚合函数

简介 一般来说,聚合函数 aggr(expr) 会处理每个聚合键在传入记录中找到的所有匹配行(键使用等价性进行比较)。 在常规聚合(即形式为 aggr(expr) 的情况下),聚合值列表是候选值列表,其中所有空…

Clion 使用gdbserver调试FreeSWITCH源码

1.准备环境 window安装clion安装好gdb、ssh、已经编译好的freeswitch可执行文件的docker镜像2.配置clion Settings -> Tools ->SSH Configurations Settings-Build, Execution, Deployment-Toolchains(其实设不设置都行,用默认也行的) Settings-Build, Execution, Depl…

DockerCompose拉取DockerHub镜像,并部署OpenMetaData

参考博主:http://t.csdnimg.cn/i49ET 一、DockerCompose拉取DockerHub镜像 方法一(不太行): 在daemon.json文件中添加一些国内还在服务的镜像站(可能某些镜像会没有) ([ -f /etc/docker/daemon.json ] ||…

人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像

摘要 商品工业属性画像是电商产品经理在进行商品管理、推荐、搜索、广告等业务时的重要依据。通过对商品的工业属性(如品类、品牌、规格、功能、风格等)的准确识别和标注,可以提高商品的展示效果、匹配度、转化率和用户满意度。然而&#xf…

从概念到完成:Midjourney——设计思维与AI技术的完美结合

文章目录 本文来自 Python学研大本营 作者 学研君 去年 AI 爆火的时候,学研君也赶时髦用上了 Midjourney。平时用它生成图片,感觉生成的图片好看,比上网四处找图更省时省事,更合心意,还不用担心版权问题。 给大家看一下…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件,支持跨qt版本,兼容qt5,qt6! 截图如下所示: 黑色风格如下所示: 视频演示入口:Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

【单片机毕业设计选题24061】-基于蓝牙的单片机通信系统

系统功能: 1、本系统硬件由两块STM32单片机,DHT11,光敏传感器,12864oled和HC-05蓝牙模块组成。 2、单片机1HC-05蓝牙模块做为主机,单片机2HC-05蓝牙模块做为从机。 3、单片机从机将采集到温湿度,光照强度等信息通过…

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类 面试题&#xff1a; 2.实现 解析Sql时引入JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 <dependency><groupId>com.github.jsqlparser</groupId><artifac…