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编写的软件的情况&…

termux 安装 rockylinux

centos已经被“招安”了,取而代之的是rockylinux,本文记录我自己的配置,主要需求是使用termux安装rockylinux文件系统,并使用supervisor自启动code-server 安装termux 从https://github.com/termux/termux-app/releases/获取最新…

常用视觉分类、目标检测模型性能测试

说明 测试常用CV模型在单张图像上的识别速度,不包含图像读取时间,但包含图像预处理。可以在以后的应用中根据硬件配置选取合适的模型,达到最佳效果。其中推理速度为正常推理的速度,加速CPU使用openvino加速,GPU使用te…

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

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

docker运行nginx挂载前端html页面步骤

1.常用docker命令 1.docker ps -a 查看所有容器 2.docker ps查看存活的容器 3.docker rm 删除容器 4.docker stop 停止容器运行 5.docker logs 容器id 查看容器日志 6.docker images 查看镜像 7.docker rmi 删除镜像 8.docker exec nginx nginx -s reload 重新加载conf文件…

H3C MSR2600路由器IPv6地址显示TENTATIVE的故障

有一MSR2600路由器,系统软件版本为5.2 R2516P28,使用电信PON PPPoE拨号上网。 在全局启用IPv6,并在Dialer接口上配置了如下IPv6命令: ipv6 address auto ipv6 address auto link-local 使用display ipv6 interface brief命令查看…

Java中的volatile关键字有什么作用?

Java中的volatile关键字是一种轻量级的同步机制,它主要有两个作用: 保证可见性(Visibility): 当多个线程访问某个类的共享变量时,如果没有适当的同步机制,一个线程对变量的修改可能对其他线程不…

闲来无事,论茴香豆的茴有几种写法

一、引言 以下是几行浅薄而简洁的代码,聊聊add函数有哪几种写法。抛砖引玉,也许在你实际的项目中会带来些许的收益。 二、知识点 知识点比较简单: 左值和右值引用,std::move 的移动语义,模版等 三、代码&#xff0…

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…

C++ PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节

C PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节 flyfish PImpl 全称是 “Pointer to Implementation”,在中文中通常翻译为“指向实现的指针”或者“指向实现”。PImpl 是一种编程技巧,通常用于 C 中,通过这种技术,可…

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

涉案财物管理系统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,分公司设备可以通过…

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

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

python爬虫js逆向入门

js基础 在 JavaScript 逆向工程中,常常会遇到一些复杂的代码结构,这些代码可能包含各种函数定义、对象操作、异步调用等。 ### 1. 函数声明和调用function generateSignature(uri, params) { // 将 uri 和参数对象转换为字符串 var data uri ? Objec…

C++基础入门(上)

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

如何在SpringCloud项目中实现断路器模式?

在Spring Cloud项目中实现断路器(Circuit Breaker)模式可以通过几种不同的库实现,如Netflix Hystrix、Resilience4j或Spring Cloud Circuit Breaker。断路器模式允许您的应用在遇到服务故障时快速失败,防止故障的蔓延和系统过载&a…

ffmpeg 找到编解码器,和编解码器上下文后,是如何初始化具体的编解码器的?aac 初始化流程大致如下

1.当使用 avcodec_find_encoder_by_name找到编码器的时候, const AVCodec * aacencoder avcodec_find_encoder_by_name("libx264"); 编码器 有值的是: id AV_CODEC_ID_H264 (27) long_name libx264 H.264…

read paper and make summer (Image enhancement)

read paper and make summer ==标题==:图像==标题==:低级视觉方法==标题==:颜色直方图==标题==:颜色空间变换==标题==:亮度通道==标题==:色度通道==标题==:图像滤波==标题==:方盒滤波==标题==:均值滤波==标题==:高斯滤波(去噪)==标题==:中值滤波(去噪)==标题==:…

Goland 通道

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