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 // 2
    image_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 = 0
            min_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_sad
                    best_disparity = d

            # 保存SAD
            D[y, x] = best_disparity

    return 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 // 2
    image_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_right
        else:
            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_sad

    D = 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的计算成本较高,会较于前者较慢

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

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

相关文章

mysql语句学习

SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; &#xff08;先join在on&#xff09; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&a…

【Entity Framework】EF日志-简单日志记录

【Entity Framework】EF日志-简单日志记录 文章目录 【Entity Framework】EF日志-简单日志记录一、概述二、EF日志分类三、简单的日志记录3.1 配置3.2 日志记录到控制台3.3 记录到凋试窗口3.4 记录到文件3.5 敏感数据处理3.6 详细查询异常3.6 日志级别3.7 消息内容和格式设置 一…

蓝牙耳机推荐哪个品牌好?2024火爆机型推荐,拒绝云测

​音乐和有声读物是许多人放松身心、缓解等待无聊时刻的好伴侣。尽管市面上蓝牙耳机琳琅满目&#xff0c;挑选合适的款式却颇具挑战。作为一个经验丰富的耳机用户&#xff0c;我深知哪些蓝牙耳机值得你的信赖。接下来&#xff0c;我将分享几款我个人认为很不错的蓝牙耳机来给大…

便宜的猫粮给猫吃有什么副作用?

便宜的猫粮&#xff0c;虽然价格诱人&#xff0c;但便宜的猫粮可能会给猫咪的健康带来一些隐患哦。让我们一起来了解一下&#xff0c;便宜的猫粮给猫吃会有什么副作用吧。 1️⃣ 原材料作假&#xff1a;便宜&#xff1d;低质&#xff0c;这是恒古不变的道理&#xff0c;没有那…

HTMLCSS

前端入门 1、HTML&CSS 1、选择器 通配选择器 元素选择器 类选择器 id选择器 复合(组合) 选择器 交集选择器(且) <style> p.class {... } /* 元素选择器需在前面 */.class1.class2 {... } </style>并集选择器(或者) <style> .class1, .class2, …

性能监控工具--sysstat使用

一、sysstat安装 sysstat提供了Linux性能监控工具集&#xff0c;包括sar、sadf、mpstat、iostat、pidstat等&#xff0c;用于监控Linux系统性能和使用情况。 其中sar功能非常强大&#xff0c;能够收集、报告、保存系统活动信息&#xff1a;CPU、内存、磁盘、中断、网络接口…

蓝桥杯刷题第八天(dp专题)

这道题有点像小学奥数题&#xff0c;解题的关键主要是&#xff1a; 有2种走法固走到第i级阶梯&#xff0c;可以通过计算走到第i-1级和第i-2级的走法和&#xff0c;可以初始化走到第1级楼梯和走到第2级楼梯。分别为f[1]1;f[2]1(11)1(2)2.然后就可以循环遍历到后面的状态。 f[i…

ubuntu16如何使用高版本cmake

1.引言 最近在尝试ubuntu16.04下编译开源项目vsome&#xff0c;发现使用apt命令默认安装cmake的的版本太低。如下 最终得知&#xff0c;ubuntu16默认安装确实只能到3.5.1。解决办法只能是源码安装更高版本。 2.源码下载3.20 //定位到opt目录 cd /opt 下载 wget https://cmak…

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计&#xff0c;本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…

【御控物联】JSON结构数据转换在物流调度系统中的应用(场景案例三)

文章目录 一、前言二、场景概述三、解决方案四、在线转换工具五、技术资料 一、前言 物流调度是每个生产厂区必不可少的一个环节&#xff0c;主要包括线边物流和智能仓储。线边物流是指将物料定时、定点、定量配送到生产作业一线的环节&#xff0c;其包括从集中仓库到线边仓、…

14种建模语言(UML)图形

前言 UML 中有四种关系&#xff1a;依赖、关联、泛化和实现。这四种关系是 UML 模型中可以包含的基本关系事物。这里介绍14种UML图形:类图&#xff0c;对象图&#xff0c;包图&#xff0c;构件图&#xff0c;组合结构图&#xff0c;部署图&#xff0c;制品图&#xff0c;用例图…

【Web理论篇】Web应用程序安全与风险

目录 &#x1f332;1.Web应用程序的发展历程 &#x1f342;1.1 Web应用程序的常见功能&#x1f342;1.2 Web应用程序的优点 &#x1f332;2.Web安全 &#x1f342;2.1Web应用程序常见漏洞&#x1f342;2.2未对用户输入做过滤&#x1f342;2.3 造成这些漏洞的原因是什么呢&…

数据安全之认识数据库防火墙

文章目录 一、什么是数据库防火墙二、数据库防火墙的主要功能三、数据库防火墙的工作原理四、数据库防火墙如何防护数据库免受SQL注入攻击五、数据库防火墙的部署方式六、数据库防火墙与网络防火墙的关系与区别七、数据库防火墙的应用场景 随着信息技术的快速发展&#xff0c;数…

数据结构进阶篇 之【选择排序】详细讲解(选择排序,堆排序)

民以食为天&#xff0c;我以乐为先 嘴上来的嘘寒问暖&#xff0c;不如直接打笔巨款 一、选择排序 1.直接选择排序 SelectSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接选择排序的特性总结 2.堆排序 HeapSort 跳转链接&#xff1a;数据结构 之 堆的应用 二、完…

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };

The Google File System [SOSP‘03] 论文阅读笔记

原论文&#xff1a;The Google File System 1. Introduction 组件故障是常态而非例外 因此&#xff0c;我们需要持续监控、错误检测、容错和自动恢复&#xff01; 按照传统标准&#xff0c;文件数量巨大大多数文件都是通过添加新数据而不是覆盖现有数据来改变的&#xff0c;因…

基于springboot实现网上购物商城系统研发系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上购物商城系统研发系统演示 摘要 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上购物商城系统&#xff0c;来满足用户网络购物的需求。 本网上购物商城系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring …

最优算法100例之21-数组的逆序对

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 逆序数: 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一…

如何使用 Windows 文件恢复工具恢复丢失的数据

当您不小心删除了一个文件时&#xff0c;那种可怕的感觉就会席卷您。那种冰冷的感觉&#xff0c;想到失去工作、失去时间或失去记忆而感到的不安。 您会很高兴听到一切并没有立即丢失。如果您行动迅速&#xff0c;您有机会恢复已删除的文件。使用 Windows 文件恢复&#xff0c…

session学习

3次请求均有sessionID session的作用 跟踪用户的行为&#xff0c;方便日后推荐客户端和服务器交互相对安全些session是代表会话&#xff0c;也可理解为客户端和服务端的交互sessionID是服务器生成的唯一字符串&#xff0c;用来跟踪用户行为cookie是浏览器自带的&#xff0c;专…