SAD法(附python实现)和Siamese神经网络计算图像的视差图
1 视差图
视差图:以左视图视差图为例,在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标
视差图和深度图:
z = f b d z = \frac{fb}{d} z=dfb
其中 d d d 是视差, f f f 是焦距, b b b 是基线长度

所以,视差越大 ——> 深度越小
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(x−d,y)∣
大致流程:
-
对左图像和右图像分别进行零填充以适应窗口的边界
为在计算这些像素的视差时,窗口可能会超出图像的范围
-
对于左图像的每个像素,依次遍历整个图像
-
对于每个像素,以其为中心取窗口大小的区域,并在右图像中搜索匹配窗口
# 一定是减去d,因为右边图像是左边图像向右平移d个像素 window_right = image_right[y:y + window_size, x - d:x - d + window_size]
设置一个
max_disparity
来限制搜索范围 -
计算左图像窗口和右图像匹配窗口的绝对差的总和,即SAD值
now_sad = np.sum(np.abs(window_left - window_right))
-
找到最小的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 卷积方法
传统方法很慢,卷积方法避免了的嵌套循环,效率比起传统方法高了很多
利用图像卷积的思想,通过对每个候选视差值计算绝对差图像,并将其与一个均值滤波器进行卷积操作来实现视差图的计算
具体步骤如下:
-
对于每个候选的视差值,计算两幅图像在水平方向上的绝对差
img_diff = np.abs(image_left - right_shifted)
-
将计算得到的绝对差图像与一个均值滤波器进行卷积操作。均值滤波器的大小应与窗口大小相匹配,用于平滑绝对差图像,从而减少噪声和不稳定性
# 平滑均值滤波卷积核 kernel = np.ones((window_size, window_size)) / (window_size ** 2) # 通过卷积运算,可以计算出每个像素邻域的总差异,也就是SAD值 img_sad = convolve(img_diff, kernel, mode='same')
卷积的作用:
- 平滑处理:卷积可以用来对图像进行平滑处理,也就是降噪。当卷积核是一个均值滤波器,就可以用于计算图像中每个像素的邻域的平均值。这样可以减少图像中的随机噪声,使图像变得更加平滑
- 计算局部差异:在计算左图和右图之间的 SAD 值时,需要对每个像素的邻域进行操作。这可以通过卷积来实现。卷积结果中的每个像素值表示了对应的像素邻域在左图和右图之间的差异程度
-
对于每个像素,选择具有最小卷积结果的视差值作为最终的视差值
代码实现:
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 问题
块匹配方法在处理时存在一些限制,主要包括以下几点:
-
局部窗口匹配:块匹配方法通常只考虑局部窗口内的像素信息进行匹配,而对于同质区域,局部窗口内的像素可能非常相似,导致匹配困难
-
窗口大小选择:选择合适的窗口大小对于块匹配的性能至关重要。
- 小窗口:在纹理丰富的区域,可以选择较小的窗口;但对于同质区域可能无法捕捉到同质区域的整体特征
- 大窗口:在纹理稀疏的区域,应选择较大的窗口大小;但可能会将不同物体的特征混合在一起,导致误匹配,但较大的窗口大小会增加计算量
窗口大小 结果 3 7 15
5 Siamese神经网络
Siamese神经网络由两个相同的子网络组成,这两个子网络共享相同的参数(权重和偏置)。无论输入是什么,它们都会通过相同的网络结构进行处理
- 特征提取:给定两个输入,它们分别通过两个子网络进行前向传播,从而得到它们的特征表示。这些特征表示捕捉了输入的关键信息
- 相似性评估:得到特征表示后,Siamese神经网络通过某种方式比较这两个特征表示,以确定它们之间的相似性。我们使用余弦相似度来操作
其有两种结构:
-
余弦相似度 (Cosine Similarity):
- 原理:计算两个特征向量之间的夹角余弦值,范围在-1到1之间。值越接近1,表示两个向量越相似;值越接近-1,表示两个向量越不相似;值接近0表示两个向量之间没有线性关系
- 应用:通过计算特征向量之间的余弦相似度,可以衡量它们在特征空间中的方向是否相似,其没有MLP,卷积层后直接标准化进行点乘,速度非常快,且效果也较好
-
学习相似性 (Learned Similarity):
- 原理:需要训练一个神经网络,该网络将输入的特征向量映射到一个标量值,表示它们之间的相似性得分
- 应用:神经网络可以学习到更复杂的特征表示,并且可以捕捉输入之间的非线性关系。但是,由于MLP的计算成本较高,会较于前者较慢
相关文章:

SAD法(附python实现)和Siamese神经网络计算图像的视差图
1 视差图 视差图:以左视图视差图为例,在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标 视差图和深度图: z f b d z \frac{fb}{d} zdfb 其中 d d d 是视差, f f f 是焦距, b b…...

基于DWT(离散小波变换)的图像加密水印算法,Matlab实现
博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…...

【威胁情报综述阅读3】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense
【威胁情报综述阅读1】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense: A Survey and New Perspectives 写在最前面一、介绍二、网络威胁情报挖掘方法和分类A. 研究方法1) 第 1 步 - 网络场景分析:2) 第 2 步 - 数据…...

在编程中使用中文到底该不该??
看到知乎上有个热门问题,为什么很多人反对中文在编程中的使用? 这个问题有几百万的浏览热度,其中排名第一的回答非常简洁,我深以为然: 在国内做开发,用中文写注释、写文档,是非常好的习惯&…...
PyQt6从入门到放弃
PyQt6从入门到放弃 安装PyQt6 pip install PyQt6# 查看QT和PyQT的版本 from PyQt6.QtCore import QT_VERSION_STR from PyQt6.QtCore import PYQT_VERSION_STR print(QT_VERSION_STR) print(PYQT_VERSION_STR)PyQt6模块 PyQt6类由一系列模块组成包括QtCore、QtGui、QtWidgets…...
PhpWord导入试卷
规定word导入格式 1、[单选题][2024][一般]题目1 A.选项1 B.选项2 C.选项3 D.选项4 答案:D 试题图片(上传多媒体图片): 分数:2 答案解析: 2、[多选题][2024][困难]题目2 A.选项1 B.选项2 C.选项3 D.选项4 E…...
C# 运算符重载 之前的小总结
C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样&…...

XenCenter 2024 创建一个虚拟机
前言 实现,创建一个虚拟机,内存,cpu,磁盘,名称,网卡,配置 Xen Center 2024 download 创建虚拟机 选择系统类型 定义虚拟机名称 选择ISO镜像库 选择主服务器 分配虚拟机内存,cpu资源…...
tomcat 知多少
Tomcat的缺省端口: 默认端口为8080,可以通过在tomcat安装包conf目录下,service.xml中的Connector元素的port属性来修改端口。 tomcat 常见 Connector 运行模式(优化): 这三种模式的不同之处如下: BIO : 一…...

【详细讲解语言模型的原理、实战与评估】
🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…...

Predict the Next “X” ,第四范式发布先知AIOS 5.0
今天,第四范式发布了先知AIOS 5.0,一款全新的行业大模型平台。 大语言模型的原理是根据历史单词去不断预测下一个单词,换一句常见的话:Predict the Next “Word”。 当前对于行业大模型的普遍认知就是沿用这种逻辑,用大…...
PCL使用4PCS配准
一、代码 C++ #include <pcl/registration/ia_fpcs.h> // 4PCS算法 #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <boost/thread/thread.hpp> #include…...

【六 (2)机器学习-机器学习建模步骤/kaggle房价回归实战】
一、确定问题和目标: 1、业务需求分析: 与业务团队或相关利益方进行深入沟通,了解他们的需求和期望。 分析业务流程,找出可能的瓶颈、机会或挑战。 思考机器学习如何帮助解决这些问题或实现业务目标。 2、问题定义:…...

vue源码解析——vue如何将template转换为render函数
Vue 将模板(template)转换为渲染函数(render function)是 Vue 编译器的核心功能,它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中,模板(template)是开发者编写的类似 HTML 的代…...
深入理解zookeeper
如果是zookeeper的初学者,可以看: zookeeper快速入门(合集)-CSDN博客 如果想要深入理解zookeeper,并在面试中取得更好的表现,可以看下面的文章,都是偏面试向的角度写的。 三分钟明白zookeeper…...

【漏洞复现】WordPress Plugin LearnDash LMS 敏感信息暴漏
漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin LearnDash LMS 4.10.2及之前版本存在安全漏洞&#x…...

phpmyadmin页面getshell
0x00 前言 来到phpmyadmin页面后如何getshell呢?下面介绍两种方法 0x01 select into outfile直接写入 1、利用条件 对web目录需要有写权限能够使用单引号(root) 知道网站绝对路径(phpinfo/php探针/通过报错等) secure_file_priv没有具体值 2、查看secure_file…...
题目:学习static定义静态变量的用法
题目:学习static定义静态变量的用法 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheate…...
【C++】编程规范之函数规则
对所有函数入参进行合法性检查 在编写函数时,应该始终对所有传入的参数进行合法性检查,以防止出现意外的错误或异常情况。这包括但不限于检查指针是否为空、整数是否在有效范围内、数组是否越界等等。通过对参数进行严格的合法性检查,可以避免…...

HTML常用的图片标签和超链接标签
目录 一.常用的图片标签和超链接标签: 1.超链接标签: 前言: 超链接的使用: target属性: 1)鼠标样式: 2)颜色及下划线: 总结: 2.图片标签: 前言: img的使用: 设置图片: 1.设置宽度和高度: 2.HTM…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...