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-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.mfbz.cn/a/797983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础语法 005 函数1-2 函数作用域

1 函数续 1.7 函数作用域 1.7.1 全局变量 定义在函数外部的变量全局变量在函数内部和函数外部都可以访问使用 a 100 def run():print("a {}".format(a))print(a) print(run())1.7.2 局部变量 函数是一个黑盒子,外面看不到盒子里面的东西&#xff0…

vue-router history 模式下将所有资源文件js/css/img都存放在oss 利用 cdn 访问整体思路汇总

背景 我们有一个域名https://example.com,但是ssl证书很贵,搞子域名来承接新站点有点费钱,所以我们想用一个目录https://example.com/admin/ 来作为管理后台的站点,这个站点是单页面应用,我又想让其用history router的…

AI为ToB企业节省大量隐性成本

前些天,在向朋友介绍“客户在哪儿AI”时,我着重说了它效果最为显著的两个功能,即,为ToB企业指明在哪儿能准确的找到客户和该场景下的最佳营销策略,以及深入洞察竞争对手并找到最佳竞争策略。 当我说完这两个核心功能的…

各向异性含水层中地下水三维流基本微分方程的推导(二)

各向异性含水层中地下水三维流基本微分方程的推导 参考文献: [1] 刘欣怡,付小莉.论连续性方程的推导及几种形式转换的方法[J].力学与实践,2023,45(02):469-474. 书接上回: 我们能得到三个方向的流入流出平衡方程: ∂ ρ u x ∂ x d x d y d…

YOWOv2(yowov2)动作识别+Fastreid身份识别 详细安装与实现

首先yowov2是一款简单且实时的时空动作检测方案,fastreid是行人重识别(身份识别) yowov2介绍链接直达fastreid链接直达为时空动作检测任务设计实时框架仍然是一个挑战。YOWOv2 提出了一种新颖的实时动作检测框架,利用三维骨干和二…

[web]-sql注入-白云搜索引擎

ctrlu查看源代码&#xff0c;发现前端有js过滤 <script>function myFunction(){var xdocument.getElementById("number").value;var adocument.getElementById("word").value;var ba.replace(/[\ |\~|\|\!|\|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\|\…

如何写论文的讨论和结论部分,提升审稿通过率300%?(附例句模版)

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 关于论文讨论Discussion部分的撰写&#xff0c;娜姐之前写过几篇文章&#xff1a; 1 Discussion讨论部分被3个审稿人说没深度没逻辑&#xff0c;用这个AI工具三步拯救了我&am…

【ingress-nginx】安装配置及Helm工具安装

【ingress-nginx】安装配置及Helm工具安装 安装时候需要用到一个工具——Helm【相当于linux中的yum工具】。 一&#xff0c;Helm安装 官网&#xff1a;https://helm.sh/docs/intro/install # 下载 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz# 解压 tar -zxv…

78. UE5 RPG 创建技能数据并初始化技能ui

在上一篇文章里&#xff0c;我们创建了技能的UI&#xff0c;接下来&#xff0c;我们要考虑如何实现对技能UI的填充&#xff0c;肯定不能直接写死&#xff0c;需要有一些方法去实现技能的更新。我们期望能够创建一个技能数据&#xff0c;然后根据数据通过回调的方式实现数据的更…

免费的ssh工具

1.Quickstart - kitty 2 Download Termius for Windows 3. MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Download

Qt MV架构-视图类

一、基本概念 在MV架构中&#xff0c;视图包含了模型中的数据项&#xff0c;并将它们呈现给用户。数据项的表示方法&#xff0c;可能和数据项在存储时用的数据结构完全不同。 这种内容与表现分离之所以能够实现&#xff0c;是因为使用了 QAbstractItemModel提供的一个标准模…

EasyExcel批量读取Excel文件数据导入到MySQL表中

1、EasyExcel简介 官网&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 2、代码实战 首先引入jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</v…

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

1、什么是以太网? 还记得初学以太网的时候,我就被一大堆专业名词给整懵了:什么以太网,互联网,MAC,IP,局域网,万维网,网络分层模型等等等等。慢着!我学的不是以太网吗?怎么出来这么一大堆东西? 啊!以太网究竟是什么?别急,我接下来就尽量用通俗的大白话来给你解释…

Phpstudy 2018 之xhcms搭建

1、由于直接访问根目录无法进入网站 2、所以采用搭建网站&#xff0c;第一使用系统服务模式、选择php-5.4.45Apache模式 3、网站域名为本地ip地址或者127.0.0.1、端口8085 4、浏览器输入127.0.0.1:8085直接转到系统安装 5、返回输入127.0.0.1:8085&#xff0c;成功进入网站

前端JS特效第36波:jQ多种相册切换效果

jQ多种相册切换效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"h…

Mac安装stable diffusion 工具

文章目录 1.安装 Homebrew2.安装 stable diffusion webui 的依赖3.下载 stable diffusion webui 代码4.启动 stable diffusion webui 本体5.下载模型6.这里可能会遇到一个clip-vit-large-patch14报错 参考&#xff1a;https://brew.idayer.com/install/stable-diffusion-webui/…

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题&#xff1a; 有时在 Postgres 上部署 Rails 应用程序时&#xff0c;可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

数学建模·非线性规划

整型规划 适用于一个变量或多个变量的值只能是整型的情况 整形规划的分类 0-1背包问题 对于一个物品来说&#xff0c;只有选和不选两种情况 表现为单下标&#xff0c;单变量问题 例&#xff1a;建设学校问题 对于每个学校来说只有选和不选两种情况&#xff0c;在数学上我们用…

内网信息收集——MSF信息收集浏览器记录配置文件敏感信息

文章目录 一、配置文件敏感信息收集二、浏览器密码&记录三、MSF信息收集 域控&#xff1a;windows server 2008 域内机器&#xff1a;win7 攻击机&#xff1a;kali 就是红日靶场&#xff08;一&#xff09;的虚拟机。 一、配置文件敏感信息收集 使用searchall64.exe&#…

Windows11终端winget配置

一、工具安装 Windows11是自带该工具的&#xff0c;如果wind10&#xff0c;可以找应用商店和GitHub上进行下载。 安装地址使用 winget 工具安装和管理应用程序 | Microsoft Learn 发布地址 Releases microsoft/terminal GitHub 二、无法使用问题排错 在命令行界面出现以…