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 中,可以通过以下步骤实现这些算法来计算视差图:
-
数据准备:
- 加载左右视图的立体图像数据。
- 确定像素之间的搜索范围。
-
Block Matching (BM) 算法:
- 设定一个固定大小的匹配窗口,在右视图中搜索与左视图中当前像素最相似的像素块。
- 通过计算两个像素块之间的差异度(如均方误差)来确定最匹配的像素块。
- 根据匹配的像素块位置计算视差值,得到视差图。
-
Sum of Absolute Differences (SAD) 算法:
- 对于每个像素,比较左右视图中像素值的绝对差异之和,即 SAD。
- 选择 SAD 最小的像素对应的右视图像素为匹配像素,计算视差值。
-
Semi-Global Matching (SGM) 算法:
- SGM 是一种全局优化算法,通过考虑整幅图像的一致性来提高匹配精度。
- SGM 中会定义能量函数,包含数据项(代表像素匹配的精度)和平滑项(代表视差之间的平滑性)。
- 通过动态规划等方式优化能量函数,得到最终的视差图。
-
实现算法:
- 在 MATLAB 中根据以上算法步骤编写对应的代码实现。
- 使用 MATLAB 中提供的图像处理和计算工具函数进行像素匹配和视差计算。
-
可视化结果:
- 将计算得到的视差图显示出来,以便观察立体匹配的效果和视差分布。
通过以上步骤实现 BM、SAD 和 SGM 算法,在 MATLAB 中可以对立体图像进行立体匹配并得出视差图,进而实现深度信息的获取和立体视觉应用。
立体匹配算法简介
立体匹配算法是计算机视觉中用于解决立体视觉问题的一种重要技术。它的目标是确定左右两幅图像中对应像素之间的视差,从而实现深度信息的获取和三维重建。下面对几种常见的立体匹配算法进行综述:
-
区域匹配算法:
- 基于块匹配(Block Matching):该算法将图像划分为小块,然后在左图像中选择一个块,在右图像中搜索与之最相似的块,最终确定视差值。
- 基于相似性度量的方法:如SAD(Sum of Absolute Differences)、SSD(Sum of Squared Differences)等,通过计算像素值的差异来找到最佳匹配。
-
局部优化算法:
- 基于动态规划的立体匹配算法:如DP(Dynamic Programming)算法,通过计算代价矩阵并进行动态规划来选择最优路径,减少匹配误差。
- Census变换:通过对图像像素进行二进制编码,比较像素之间的相似性来提高匹配准确率。
-
全局优化算法:
- Semi-Global Matching(SGM)算法:使用全局成本聚合来优化立体匹配结果,有效降低复杂图像场景下的匹配误差。
- 图割算法:将匹配问题转化为最小割最大流问题,在全局范围内优化匹配结果。
以上仅列举了几种常见的立体匹配算法,实际应用中还有许多衍生算法和混合算法,如SGM-BM算法、SGM-SAD算法等。不同的算法适用于不同的场景和需求,选择合适的立体匹配算法是提高匹配精度和稳定性的关键。
2、matlab实现SGM立体匹配算法计算视差图
SGM立体匹配算法简介
SGM(Semi-Global Matching)是一种常用的立体匹配算法,通过全局优化来提高立体匹配的准确性。下面是 SGM 立体匹配算法的原理:
-
能量函数定义:
- SGM 算法将立体匹配问题建模为能量最小化问题。定义一个能量函数,包含数据项和平滑项。
- 数据项:表示匹配代价,通常用像素间的灰度差异来衡量。
- 平滑项:表示视差之间的一致性,通常取视差的梯度。
-
能量计算:
- 对于每个像素,计算与其相邻像素的匹配代价,并考虑视差之间的一致性。
- 通过动态规划或其他方法计算各像素处的能量,得到最小的能量值和对应的视差值。
-
聚合过程:
- 在整个图像上进行像素的能量聚合,考虑像素之间的一致性。
- 通过横向、纵向、斜向等方向的聚合,得到全局一致的能量分布。
-
最小路径计算:
- 根据聚合后的能量图,通过动态规划或其他方法计算从每行最左侧到最右侧的最小能量路径,即最优视差图。
-
后处理:
- 对得到的视差图进行后处理,如边缘保护、视差平滑等,以提高匹配的准确性和稳定性。
-
时间复杂度优化:
- 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('左右红外图');
2)BM立体匹配算法视差图计算及效果展示
代码:
DR = [0 48];%视差值范围
DM = disparityBM(L,R,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure();imshow(DM)
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('左右红外图');
2)左右视图灰度化及显示
代码:
LL= rgb2gray(L);%彩图转换为灰度图
RR= rgb2gray(R);
3)BM立体匹配算法视差图计算及效果展示
代码:
DR = [0 48];%视差值范围
DM = disparityBM(LL,RR,'DisparityRange',DR,'UniquenessThreshold',20);%视差图
figure(2);imshow(DM)
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('左右红外图');
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视差图');
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('左右彩色图');
2)左右视图灰度转换及显示
代码:
LI= rgb2gray(L);%彩图转换为灰度图
RI= rgb2gray(R);
figure(2);imshowpair(LI,RI,'montage');title('左右红外图');
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视差图');
5、SGM/BM/SAD立体匹配算法比较
SGM(Semi-Global Matching)是一种基于全局优化的立体匹配算法,与BM(Block Matching)和SAD(Sum of Absolute Differences)算法相比具有更高的匹配精度和鲁棒性。以下是它们之间的比较:
-
精度:SGM算法通过全局优化方法来考虑整个图像区域的一致性,能够更准确地估计视差值,尤其在纹理重复和遮挡情况下效果更好。相比之下,BM和SAD算法局限于局部像素的匹配,容易受到噪声和纹理重复的影响,匹配精度较低。
-
鲁棒性:SGM算法通过全局优化可以提高算法的稳健性,对图像噪声和遮挡有更好的抵抗能力。BM和SAD算法在复杂场景下易产生匹配错误,对边缘和纹理丰富的区域匹配效果较好。
-
计算复杂度:SGM算法的计算复杂度较高,因为需要对整个图像进行全局优化。BM和SAD算法计算速度较快,适合实时性要求较高的应用。
综上所述,SGM算法在匹配精度和鲁棒性方面优于BM和SAD算法,适合对立体匹配有较高要求的应用场景。而BM和SAD算法则更适合计算简单、实时性要求较高的情况下使用。在实际应用中,可以根据具体需求选择合适的算法。
相关文章:

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)的…...

【瑞吉外卖 | day07】移动端菜品展示、购物车、下单
文章目录 瑞吉外卖 — day71. 导入用户地址簿相关功能代码1.1 需求分析1.2 数据模型1.3 代码开发 2. 菜品展示2.1 需求分析2.2 代码开发 3. 购物车3.1 需求分析3.2 数据模型3.3 代码开发 4. 下单4.1 需求分析4.2 数据模型4.3 代码开发 瑞吉外卖 — day7 移动端相关业务功能 —…...

前端Vue项目中腾讯地图SDK集成:经纬度与地址信息解析的实践
在前端开发中,我们经常需要将经纬度信息转化为具体的地址信息,这对于定位、地图展示等功能至关重要。Vue作为现代前端框架的代表,其组件化开发的特性使得我们能够更高效地实现这一功能。本文将介绍如何在Vue项目中集成腾讯地图SDK,…...

鸿蒙开发StableDiffusion绘画应用
Stable Diffusion AI绘画 基于鸿蒙开发的Stable Diffusion应用。 Stable Diffusion Server后端代码 Stable Diffusion 鸿蒙应用代码 AI绘画 使用Axios发送post网络请求访问AI绘画服务器 api ,支持生成图片保存到手机相册。后端服务是基于flaskStable Diffusion …...

华为OD机考题(HJ61 放苹果)
前言 经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。 描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? 注意:如果有7个苹果和3…...

浅谈Visual Studio 2022
Visual Studio 2022(VS2022)提供了众多强大的功能和改进,旨在提高开发者的效率和体验。以下是一些关键功能的概述:12 64位支持:VS2022的64位版本不再受内存限制困扰,主devenv.exe进程不再局限于4GB…...

spark 动态资源分配dynamicAllocation
动态资源分配,主要是spark在运行中可以相对合理的分配资源。 初始申请的资源远超实际需要,减少executor初始申请的资源比实际需要少很多,增多executorSpark运行多个job,这些job所需资源有的多有的少,动态调整executor…...
【C语言ffmpeg】打开第一个视频
文章目录 前言须知ffmpeg打开文件基本流程图ffmpeg打开媒体文件AVFormatContext *avformat_alloc_context(void);AVFormatContext 成员变量及其作用AVInputFormat *iformatAVOutputFormat *oformatvoid *priv_dataAVIOContext *pbunsigned int nb_streamsAVStream **streamscha…...

【Langchain大语言模型开发教程】模型、提示和解析
🔗 LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、使用Langchain实例化一个LLM的接口 2、 使用Langchain的模板功能,将需要改动的部分抽象成变量,在具体的情况下替换成需要的内容,来达到模板复用效…...
Flutter 中的基本数据类型:num、int 和 double
在 Dart 编程语言中,数值类型的基础是 num,而 int 和 double 则是 num 的子类型。在开发 Flutter 应用时,理解这三者的区别和使用场景是非常重要的。本文将详细介绍 num、int 和 double 的定义及其使用区别。 num num 是 Dart 中的数值类型…...

基于Python+Django,开发的一个在线教育系统
一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统! 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…...
密码学原理精解【9】
这里写目录标题 迭代密码概述SPN具体算法过程SPN算法基本步骤举例说明注意 轮换-置换网络一、定义与概述二、核心组件三、加密过程四、应用实例五、总结 轮函数理论定义与作用特点与性质应用实例总结 迭代密码理论定义与原理特点与优势应用场景示例发展趋势 AES特点概述一、算法…...

【Nacos】Nacos服务注册与发现 心跳检测机制源码解析
在前两篇文章,介绍了springboot的自动配置原理,而nacos的服务注册就依赖自动配置原理。 Nacos Nacos核心功能点 服务注册 :Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端…...
python 66 个冷知识 0720
66个有趣的Python冷知识 一行反转列表 使用切片一行反转列表:reversed_list my_list[::-1] 统计文件单词数量 使用 collections.Counter 统计文件中每个单词的数量:from collections import Counter; with open(file.txt) as f: word_count Counter(f…...

利用PyTorch进行模型量化
利用PyTorch进行模型量化 目录 利用PyTorch进行模型量化 一、模型量化概述 1.为什么需要模型量化? 2.模型量化的挑战 二、使用PyTorch进行模型量化 1.PyTorch的量化优势 2.准备工作 3.选择要量化的模型 4.量化前的准备工作 三、PyTorch的量化工具包 1.介…...

Android 小白菜鸟从入门到精通教程
前言 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l’Isle-Adam)在1886年发表的科幻小说《未来的夏娃》(L’ve future)中。他将外表像人的机器起名为Android。从初学者的角度出发,通过通俗易懂的语言…...

php相关
php相关 借鉴了小迪安全以及各位大佬的博客,如果一切顺利,会不定期更新。 如果感觉不妥,可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…...

uniapp上传功能用uni-file-picker实现
文章目录 html代码功能实现css样式代码 html代码 <uni-file-pickerselect"onFileSelected"cancel"onFilePickerCancel"limit"1"class"weightPage-upload-but"file-mediatype"image"></uni-file-picker><imag…...

【PPT笔记】1-3节 | 默认设置/快捷键/合并形状
文章目录 说明笔记1 默认设置1.1 OFFICE版本选择1.1.1 Office某某数字专属系列1.1.2 Office3651.1.3 产品信息怎么看 1.2 默认设置1.2.1 暗夜模式1.2.2 无限撤回1.2.3 自动保存(Office2013版本及以上)1.2.4 图片压缩1.2.5 字体嵌入1.2.6 多格式导出1.2.7…...

Qt中的高分辨率及缩放处理
写在前面 使用Qt开发界面客户端,需要考虑不同分辨率及缩放对UI界面的影响,否则会影响整体的交互使用。 问题 高分辨率/缩放设备上图片/图标模糊 若不考虑高分辨及缩放处理,在高分辨率/缩放设备上,软件中的图片、图标可能会出现…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...

性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...