3.4、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/pingmian/46196.shtml

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

相关文章

Contact Form联系表单自动发送邮件(超级简单)

前几天发现了aoksend推出的这个联系表单的组件,非常好用,只有一个php文件,把php文件放到网站主目录里面。然后去aoksend注册和配置好域名和发信邮箱,可以得到发送密钥:app_key,然后配置好邮件模板&#xff…

数据库内核研发学习之路(二)postgres编译安装

我们在前面安装配置好环境之后,接下来就是去安装编译postgres,不是以前我们常用的一键化安装,而是根据源码进行编译安装。 1、获取postgres的15.2版本的源码 我这里获取的是15.2版本的源码,当然大家也可以获取其他版本的源码&am…

百度安全大模型智能体实践入选信通院“安全守卫者计划”优秀案例

7月3日,由全球数字经济大会组委会主办,中国信息通信研究院(以下简称中国信通院)与中国通信标准化协会联合承办的2024全球数字经济大会“云和软件安全论坛暨第二届SecGo云和软件安全大会”在北京召开。本届论坛聚焦云和软件安全最新…

RISC-V在线反汇编工具

RISC-V在线反汇编工具: https://luplab.gitlab.io/rvcodecjs/#q34179073&abifalse&isaAUTO 不过,似乎,只支持RV32I、RV64I、RV128I指令集:

ControlNet作者新作Paints-Undo:一键模拟人类绘画过程,再也没人敢说你的图是生成的了!

ControlNet作者敏神又有新项目了。 Paints-Undo 可以生成模拟人类绘画过程的动画。支持输入单图倒推出绘制这个图片某一步的过程,也可以给两张图,生成一个绘制过程动画。 再有人说你的图是生成的就把这个拿给他看,哈哈。下面先看一下展示的…

【JUC】使用CompletableFuture执行异步任务

文章目录 Future接口介绍Future接口常用实现类FutureTaskFuture接口能干什么Future接口相关架构FutureTask初步使用Future编码实战和优缺点分析优点缺点获取结果的方式不优雅结论 完成一些复杂的任务 CompletableFuture对Future的改进CompletableFuture为什么会出现Completable…

解决nginx代理静态资源刷新后404问题

背景 在公司的项目中,有一个管理系统,大致的逻辑是通过nginx代理的静态资源, 正常页面跳转是没有问题的,有的时候我们会使用回车或者F5进行 页面刷新的时候都会出现404问题。 解决 这种我怀疑是nginx的配置不到位的问题。 我在本…

数据库管理-第218期 服务器内存(20240711)

数据库管理218期 2024-07-11 数据库管理-第218期 服务器内存(20240711)1 内存2 ECC内存3 原理3.1 多副本传输3.2 纠错码3.3 汉明码 总结 数据库管理-第218期 服务器内存(20240711) 作者:胖头鱼的鱼缸(尹海文…

数据库第六次

视图 salary decimal(10,2) not null default 0 comment ‘工资’, address varchar(200) not null default ‘’ comment ‘通讯地址’, dept_id int comment ‘部门编号’ ); create index idx_name on emp(emp_name); create index idx_birth on emp(birth); create index…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥删除(ArkTS)】

密钥删除(ArkTS) 为保证数据安全性,当不需要使用该密钥时,应该删除密钥。 开发步骤 以删除HKDF256密钥为例。 确定密钥别名keyAlias,密钥别名最大长度为64字节。初始化密钥属性集。用于删除时指定密钥的属性TAG,比如删除的密钥…

【java】力扣 合并k个升序链表

文章目录 题目链接题目描述思路代码 题目链接 23.合并k个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表 思路 我在这个题里面用到了PriorityQueue(优先队列) 的知识 Prio…

顶顶通呼叫中心中间件实现随时启动和停止质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们拨号方案启动停止ASR执行FreeSWITCH 命令接口启动ASR接口停止ASR接口 通知配置cti.json配置质检结果写入数据库 前言 顶顶通呼叫中心中间件的实时质检功能是由两个模块组成:mod_asr 和 mod_qc。 mod_asr:负责调用ASR将用户们在通…

进程通信(1):无名管道(pipe)

无名管道(pipe)用来具有亲缘关系的进程之间进行单向通信。半双工的通信方式,数据只能单向流动。 管道以字节流的方式通信,数据格式由用户自行定义。 无名管道多用于父子进程间通信,也可用于其他亲缘关系进程间通信。 因为父进程调用fork函…

开发个人Ollama-Chat--10 绑定域名

开发个人Ollama-Chat–10 绑定域名 域名购买最好找正规的渠道购买,不要因贪图小便宜而多走很多的弯路。我就是第一次购买域名,到了一个坑壁的平台"西部数码",SSL证书申请了2个月,没下来,客服也贼不专业&…

猫头虎:什么是内耗?

猫头虎 🐯 建联猫头虎,商务合作,产品评测,产品推广,个人自媒体创作,超级个体,涨粉秘籍,一起探索编程世界的无限可能! 摘要 内耗是指在工作或学习过程中,个…

leetcode日记(37)旋转图像

方法是看评论区想出来的&#xff1a;先将矩阵转置&#xff0c;再将每一行逆转 class Solution { public: int n,m,l,k; struct bian{int u;int v;int d; }; void digui(int loc,int c[],vector<bian> bi,int now,int q,bool colour[],int& maxx,bool jg[]){if(q>…

网络协议 — Keepalived 高可用方案

目录 文章目录 目录Keepalived 是实现了 VRRP 协议的软件Keepalived 的软件架构VRRP StackCheckersKeepalived 的配置Global configurationvrrp_scriptVRRP Configurationvrrp synchroization groupvrrp instancevirtual ip addressesvirtual routesLVS Configurationvirtual_s…

偶数位的数c++

题目描述 给你两个整数 l,r&#xff0c;求 l∼r 范围内有多少个位数为偶数的数。 输入 一行两个整数 l,r。 输出 输出位数为偶数的数的数量。 样例输入 5 15样例输出 6 提示 样例解释 10,11,12,13,14,15 位数为偶数&#xff0c;都是两位数。 数据规模与约定 对于 1…

数据结构之线性表表示集合详解与示例(C,C#,C++)

文章目录 基本特征线性表的特点&#xff1a;线性表的表示方法&#xff1a;C、C#和C语言如何实现一个线性表表示集合1. C实现2. C#实现3. C实现 总结 线性表是计算机数据结构中的一个基本概念&#xff0c;它是一种最简单的抽象数据类型。在线性表中&#xff0c;数据元素之间的关…

Qt进阶版五子棋

五子棋是一种两人对弈的棋类游戏&#xff0c;目标是在横、竖、斜任意方向上连成五个子。在Qt中实现五子棋程序&#xff0c;你需要设计棋盘界面、处理下棋逻辑、判断胜负等。以下是实现一个基本五子棋程序的步骤&#xff1a; 创建项目和界面 使用Qt Creator创建一个新的Qt Widge…