SAD法(附python实现)和Siamese神经网络计算图像的视差图

1 视差图

视差图:以左视图视差图为例,在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标

视差图和深度图:
z = f b d z = \frac{fb}{d} z=dfb
其中 d d d 是视差, f f f 是焦距, b b b 是基线长度

image-20240322211454831

所以,视差越大 ——> 深度越小

2 传统方法

原理:是在给定窗口大小的情况下,对左图像和右图像的对应窗口进行比较,计算它们之间的绝对差的总和,从而确定最佳匹配的视差

SAD:Sum of Absolute Differences 即差的绝对值和
S A D ( x , y , d ) = ∣ w L ( x , y ) − w R ( x − d , y ) ∣ SAD(x,y,d) = |w_L(x, y) - w_R(x-d, y)| SAD(x,y,d)=wL(x,y)wR(xd,y)
大致流程:

  1. 对左图像和右图像分别进行零填充以适应窗口的边界

    为在计算这些像素的视差时,窗口可能会超出图像的范围

  2. 对于左图像的每个像素,依次遍历整个图像

  3. 对于每个像素,以其为中心取窗口大小的区域,并在右图像中搜索匹配窗口

    # 一定是减去d,因为右边图像是左边图像向右平移d个像素
    window_right = image_right[y:y + window_size, x - d:x - d + window_size]
    

    设置一个 max_disparity 来限制搜索范围

  4. 计算左图像窗口和右图像匹配窗口的绝对差的总和,即SAD值

    now_sad = np.sum(np.abs(window_left - window_right))
    
  5. 找到最小的SAD值,将对应的视差 d 保存到该像素位置

代码实现:

def sad(image_left, image_right, window_size=3, max_disparity=50):D = np.zeros_like(image_left)height = image_left.shape[0]width = image_left.shape[1]# 零填充padding = window_size // 2image_left = add_padding(image_left, padding).astype(np.float32)image_right = add_padding(image_right, padding).astype(np.float32)for y in range(height):for x in range(width):# 左边图像的窗口window_left = image_left[y:y + window_size, x:x + window_size]best_disparity = 0min_sad = float('inf')for d in range(max_disparity):if x - d < 0:continue# 一定是减去d,因为右边图像是左边图像向右平移d个像素window_right = image_right[y:y + window_size, x - d:x - d + window_size]now_sad = np.sum(np.abs(window_left - window_right))if now_sad < min_sad:min_sad = now_sadbest_disparity = d# 保存SADD[y, x] = best_disparityreturn D # 返回视差图

3 卷积方法

传统方法很慢,卷积方法避免了的嵌套循环,效率比起传统方法高了很多

利用图像卷积的思想,通过对每个候选视差值计算绝对差图像,并将其与一个均值滤波器进行卷积操作来实现视差图的计算

具体步骤如下:

  1. 对于每个候选的视差值,计算两幅图像在水平方向上的绝对差

    img_diff = np.abs(image_left - right_shifted)
    
  2. 将计算得到的绝对差图像与一个均值滤波器进行卷积操作。均值滤波器的大小应与窗口大小相匹配,用于平滑绝对差图像,从而减少噪声和不稳定性

    # 平滑均值滤波卷积核
    kernel = np.ones((window_size, window_size)) / (window_size ** 2)
    # 通过卷积运算,可以计算出每个像素邻域的总差异,也就是SAD值
    img_sad = convolve(img_diff, kernel, mode='same')  
    

    卷积的作用:

    1. 平滑处理:卷积可以用来对图像进行平滑处理,也就是降噪。当卷积核是一个均值滤波器,就可以用于计算图像中每个像素的邻域的平均值。这样可以减少图像中的随机噪声,使图像变得更加平滑
    2. 计算局部差异:在计算左图和右图之间的 SAD 值时,需要对每个像素的邻域进行操作。这可以通过卷积来实现。卷积结果中的每个像素值表示了对应的像素邻域在左图和右图之间的差异程度
  3. 对于每个像素,选择具有最小卷积结果的视差值作为最终的视差值

代码实现:

def sad_convolve(image_left, image_right, window_size=3, max_disparity=50):# 零填充padding = window_size // 2image_left = add_padding(image_left, padding).astype(np.float32)image_right = add_padding(image_right, padding).astype(np.float32)SAD = np.zeros((image_left.shape[0], image_left.shape[1], max_disparity + 1))# 卷积核kernel = np.ones((window_size, window_size)) / (window_size ** 2)# 范围很重要,要覆盖0和max_disparity才行for d in range(0, max_disparity才行 + 1):if d == 0:right_shifted = image_rightelse:right_shifted = np.zeros_like(image_right)right_shifted[:, d:] = image_right[:, :-d]img_diff = np.abs(image_left - right_shifted)# 通过卷积运算,可以计算出每个像素邻域的总差异,也就是SAD值img_sad = convolve(img_diff, kernel, mode='same')SAD[:, :, d] = img_sadD = np.argmin(SAD, axis=2) # 选出算出最小SAD的视差值return D

4 问题

块匹配方法在处理时存在一些限制,主要包括以下几点:

  1. 局部窗口匹配:块匹配方法通常只考虑局部窗口内的像素信息进行匹配,而对于同质区域,局部窗口内的像素可能非常相似,导致匹配困难

  2. 窗口大小选择:选择合适的窗口大小对于块匹配的性能至关重要。

    • 小窗口:在纹理丰富的区域,可以选择较小的窗口;但对于同质区域可能无法捕捉到同质区域的整体特征
    • 大窗口:在纹理稀疏的区域,应选择较大的窗口大小;但可能会将不同物体的特征混合在一起,导致误匹配,但较大的窗口大小会增加计算量
    窗口大小结果
    3image-20240323095500779
    7image-20240323095545339
    15image-20240323095611812

5 Siamese神经网络

Siamese神经网络由两个相同的子网络组成,这两个子网络共享相同的参数(权重和偏置)。无论输入是什么,它们都会通过相同的网络结构进行处理

  1. 特征提取:给定两个输入,它们分别通过两个子网络进行前向传播,从而得到它们的特征表示。这些特征表示捕捉了输入的关键信息
  2. 相似性评估:得到特征表示后,Siamese神经网络通过某种方式比较这两个特征表示,以确定它们之间的相似性。我们使用余弦相似度来操作

其有两种结构:

  1. 余弦相似度 (Cosine Similarity)

    • 原理:计算两个特征向量之间的夹角余弦值,范围在-1到1之间。值越接近1,表示两个向量越相似;值越接近-1,表示两个向量越不相似;值接近0表示两个向量之间没有线性关系
    • 应用:通过计算特征向量之间的余弦相似度,可以衡量它们在特征空间中的方向是否相似,其没有MLP,卷积层后直接标准化进行点乘,速度非常快,且效果也较好
  2. 学习相似性 (Learned Similarity)

    image-20240323152802625
    • 原理:需要训练一个神经网络,该网络将输入的特征向量映射到一个标量值,表示它们之间的相似性得分
    • 应用:神经网络可以学习到更复杂的特征表示,并且可以捕捉输入之间的非线性关系。但是,由于MLP的计算成本较高,会较于前者较慢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789107.shtml

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

相关文章

【漏洞复现】用友NC-Cloud系统queryRuleByDeptId存在SQL注入漏洞

“ 如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的…

vue 实现的h5 页面,如何设置页面中的 title

修改页面中的title 公共修改方式在App.vue 中&#xff1a; created() {document.title "测试标题"; },单个页面修改&#xff0c;就在单个页面编写就ok

提高 API 性能的小技巧

引言 随着数字时代的到来&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为连接不同服务和应用的桥梁&#xff0c;其意义远超技术工具本身。随着大数据、云服务和 5G 技术等领域的进步&#xff0c;API 的作用变得更加重要&#xff0c;它不仅促进了数字转型的发展&…

supersqli-攻防世界

题目 加个报错 1 and 11 #没报错判断为单引号字符注入 爆显位 1 order by 2#回显正常 1 order by 3#报错 说明列数是2 尝试联合查询 -1 union select 1,2# 被过滤了 return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); select|update|d…

时间管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

git上传到本都仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

数据资产盘点七步法:教你为什么盘,盘什么,怎么盘

数据作为企业一种“特殊资产”&#xff0c;已被列入企业的资产负债表。只有对数据资源进行统筹规划&#xff0c;全面梳理&#xff0c;“摸清家底”&#xff0c;才能让数据更好地服务于企业的业务应用。怎样识别数据资产、有效管理和运营数据资产&#xff0c;利用现有的数据资产…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…

node res.end返回json格式数据

使用 Node.js 内置 http 模块的createServer()方法创建一个新的HTTP服务器并返回json数据&#xff0c;代码如下&#xff1a; const http require(http);const hostname 127.0.0.1; const port 3000;const data [{ name: 测试1号, index: 0 },{ name: 测试2号, index: 1 },…

[计算机效率] 格式转换工具:格式工厂

3.14 格式转换工具&#xff1a;格式工厂 格式工厂是一款功能强大的多媒体格式转换软件&#xff0c;可以实现音频、视频、图片等多种格式的转换。它支持几乎所有类型的多媒体格式&#xff0c;包括视频、音频、图片、字幕等&#xff0c;可以轻松实现格式之间的转换&#xff0c;并…

手写红黑树【数据结构】

手写红黑树【数据结构】 前言版权推荐手写红黑树一、理论知识红黑树的特征增加删除 二、手写代码初始-树结点初始-红黑树初始-遍历初始-判断红黑树是否有效查找增加-1.父为黑&#xff0c;直接插入增加-2. 父叔为红&#xff0c;颜色调换增加-3. 父红叔黑&#xff0c;颜色调换&am…

C++ Primer 总结索引 | 第十二章:动态内存

1、到目前为止&#xff0c;我们编写的程序中 所使用的对象 都有着严格定义的生存期。全局对象 在程序启动时分配&#xff0c;在程序结束时 销毁。对于 局部自动对象&#xff0c;当我们进入 其定义所在的程序块时被创建&#xff0c;在 离开块时销毁。局部static对象 在第一次使用…

Qt_Note20_QML_自定义Grid控件与OpacityMask的使用

import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtGraphicalEffects 1.14Window {visible: truewidth: 640height: 480title: qsTr("Hello World")// 自定义Grid控件与OpacityMask的使用Grid {id: gridwidth: 15height: 200co…

在线教育平台项目总结

一、业务流程 1.企业&#xff08;B&#xff09; 内容管理、媒资、缓存、消息、任务调度、搜索 2.个人&#xff08;C&#xff09; 搜索、缓存、订单、支付、学习 二、关键技术 1.缓存三兄弟&#xff1a; 缓存穿透&#xff0c;高并发请求过来之后&#xff0c;查询数据库中存…

升降梯人数识别摄像机

升降梯人数识别摄像机是一种智能监测设备&#xff0c;主要用于实时识别和计算升降梯内乘客的数量。通过搭载先进的图像识别技术和人工智能算法&#xff0c;该设备可以准确监测乘客进出数量&#xff0c;提供重要数据支持和信息反馈&#xff0c;帮助管理人员有效管理升降梯运行&a…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)

深入分析及学习一下上面这一段代码的构成与含义。 首先&#xff0c;这个GPIO_InitTypeDef GPIO_InitStructure;其实与int a 是完全类似的语法格式以及含义。 GPIO_InitStructure就相当于a这样一个变量。不过从这个变量的名字可以知道&#xff0c;这是一个用于GPIO初始化的结构…

界面控件DevExtreme JS ASP.NET Core 2024年度产品规划预览(一)

在本文中我们将介绍今年即将发布的v24.1附带的主要特性&#xff0c;这些特性既适用于DevExtreme JavaScript (Angular、React、Vue、jQuery)&#xff0c;也适用于基于DevExtreme的ASP.NET MVC/Core控件。 注意&#xff1a;本文中列出的功能和特性说明官方当前/预计的发展计划&a…

hcip实验4:gre mgre ppp综合实验

实验拓扑: 实验目的&#xff1a; 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R…

MQ消息队列详解以及MQ重复消费问题

MQ消息队列详解以及MQ重复消费问题 1、解耦2、异步调用3、流量削峰4、MQ重复消费问题&#xff0c;以及怎么解决&#xff1f;4.1、重复消费产生4.2、解决方法&#xff1a; https://blog.csdn.net/qq_44240587/article/details/104630567 核心的就是&#xff1a;解耦、异步、削锋…