《OpenCV计算机视觉》—— 图像金字塔

文章目录

  • 什么是图像金字塔?
    • 一、定义与基本原理
    • 二、主要类型
    • 三、构建过程
    • 四、应用领域
  • 图像金字塔中的下采样和上采样
    • 一、下采样(Downsampling)
    • 二、上采样(Upsampling)
    • 三、总结
  • 代码实现

什么是图像金字塔?

一、定义与基本原理

图像金字塔是一种将图像以多分辨率进行表达的结构,通常表现为一系列分辨率逐渐降低的图像集合,这些图像按照金字塔形状(自下而上)排列,因此得名。每一层图像都是对下一层图像进行下采样(或上采样)得到的,层级越高,图像越小,分辨率越低。

二、主要类型

  • 常见的图像金字塔有两种类型:

    • 高斯金字塔(Gaussian Pyramid):高斯金字塔通过不断地对图像进行高斯滤波下采样操作来构建。每一层图像都是对下一层图像进行高斯滤波后,再以一定的步长(通常是2)进行抽样得到的。高斯滤波的目的是为了去除图像中的高频信息,保留低频信息,从而在不同尺度上平滑图像
    • 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是在高斯金字塔的基础上构建的。它通过对高斯金字塔的每一层图像进行上采样(与降采样相反的操作),然后使用原高斯金字塔的对应层图像减去上采样后的图像,得到每一层的拉普拉斯图像。拉普拉斯图像包含了高斯金字塔相邻两层之间的差异信息,即图像的高频细节。

三、构建过程

  • 以高斯金字塔为例,其构建过程通常包括以下几个步骤:

    • 读取原始图像:首先,需要读取待处理的原始图像。
    • 高斯滤波:对原始图像进行高斯滤波,以去除图像中的高频噪声和细节。
    • 下采样:对滤波后的图像进行降采样操作,即按照一定的步长(如2)选取图像中的像素点,从而得到分辨率较低的图像。
    • 重复操作:将上一步得到的低分辨率图像作为新的输入图像,重复进行高斯滤波和降采样操作,直到达到所需的金字塔层数或满足某个终止条件。
  • 拉普拉斯金字塔的构建过程则需要在高斯金字塔的基础上,对每一层图像进行上采样和求差操作。

    • 可以理解为拉普拉斯金字塔是由高斯金字塔向下采样时丢失的信息构成的
  • 可以结合下图来理解:
    在这里插入图片描述

四、应用领域

  • 图像金字塔在图像处理中有着广泛的应用,主要包括以下几个方面:

    • 图像压缩:利用图像金字塔可以对图像进行多尺度表达,从而在压缩过程中保留图像的重要信息,同时去除冗余信息,实现高效的图像压缩。
    • 图像融合:在图像融合过程中,可以利用图像金字塔将不同分辨率的图像进行融合,从而得到更加清晰、全面的图像信息。
    • 图像分割:在图像分割任务中,可以利用图像金字塔对图像进行多尺度分析,从而更加准确地提取出图像中的目标区域。
    • 机器视觉:在机器视觉领域,图像金字塔可以用于特征提取、目标识别等任务中,提高算法的鲁棒性和效率。
  • 总之,图像金字塔是图像处理中的一种重要技术,它通过多尺度的图像表达方法,为图像处理提供了更加灵活和高效的手段。

图像金字塔中的下采样和上采样

一、下采样(Downsampling)

  • 下采样,也称为降采样,是图像金字塔构建过程中的一个重要步骤。它的主要目的是减少图像的分辨率,通常是通过去除图像中的部分数据来实现的。下采样的过程大致可以分为以下两个步骤:

    • 滤波:首先,对图像进行滤波处理,以去除图像中的高频成分,减少图像细节,通常使用高斯模糊等方法。
    • 子采样:在滤波之后,对图像进行子采样,即按照一定的规则(如每隔一行或一列取一个像素)去除部分像素,从而降低图像的分辨率。
  • 在OpenCV中,下采样通常通过 pyrDown() 函数来实现。这个函数会首先对图像进行高斯模糊,然后去除偶数行和列,从而得到分辨率降低的图像。通过多次调用pyrDown()函数,可以构建出完整的图像金字塔。

  • 下采样的优点包括降低计算复杂度、去除噪声、减小内存消耗和加速特征检测等。然而,它也会带来信息损失和图像失真的问题。

二、上采样(Upsampling)

  • 上采样,也称为放大或插值,是下采样的逆过程,用于增加图像的分辨率。上采样的主要目的是通过某种方式填充图像中的空白区域,从而恢复或提高图像的分辨率

  • 在OpenCV中,上采样通常通过 pyrUp() 函数来实现。这个函数会首先通过插值(如双线性插值或双三次插值)在图像的行列之间插入新的像素值,然后对新生成的图像进行高斯模糊处理,以平滑插值过程中产生的锯齿状边缘。

  • 然而,需要注意的是,上采样并不能完全恢复下采样过程中丢失的信息,因此上采样后的图像在细节上可能无法与原始图像完全一致。此外,上采样还可能导致图像模糊和失真。

三、总结

  • 向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作是不可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态

代码实现

  • 代码如下:

    import cv2""" 下采样 """
    MB = cv2.imread('wechat.jpg')
    # 注意:下采样要求图片的宽高的值必须是偶数,且在第一次下采样后宽高的值任然是偶数
    # 这里我们将图片的大小微调一下
    MB = cv2.resize(MB, dsize=(1276, 876))
    # 第一次下采样
    MB_down_1 = cv2.pyrDown(MB)
    # 第二次下采样
    MB_down_2 = cv2.pyrDown(MB_down_1)# 显示图像
    cv2.imshow('MB', MB)
    cv2.imshow('MB_down_1', MB_down_1)
    cv2.imshow('MB_down_2', MB_down_2)
    cv2.waitKey(0)""" 上采样 """
    # 对下采样后图片进行上采样,图像便模糊,无法复原
    MB_down_1_up = cv2.pyrUp(MB_down_1)
    MB_down_2_up = cv2.pyrUp(MB_down_2)cv2.imshow('MB_down_1_up', MB_down_1_up)
    cv2.imshow('MB_down_2_up', MB_down_2_up)
    cv2.waitKey(0)""" 拉普拉斯金字塔 """# 第一层求差
    L0 = MB - MB_down_1_up
    # 第二层求差
    L1 = MB_down_1 - MB_down_2_up# 通过上采样后的结果 + 下采样损失的像素值 来实现复原成原始图像
    fuyuan = MB_down_1_up + L0# 显示图片
    cv2.imshow('L0', L0)
    cv2.imshow('L1', L1)
    cv2.imshow('fuyuan', fuyuan)
    cv2.waitKey(0)
    
  • 原图和下采样后的结果图如下:
    在这里插入图片描述

  • 对对下采样后图片进行上采样后的结果图如下:
    在这里插入图片描述

  • 将下采样的图片和将下采样后的图片在进行上采样的图片放在一起对比,如下

  • 可以发现上采样后的结果图会比较模糊,这就是因为下采样时一些像素点丢失了
    在这里插入图片描述

  • 下采样丢失的像素值图片如下:
    在这里插入图片描述

  • 复原后的图片
    在这里插入图片描述

  • 原图如下:
    在这里插入图片描述

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

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

相关文章

YOLOv8目标检测模型——遥感小目标检测经验分享

小目标检测——YOLOV8 一、引言 背景介绍 (1)目标检测的重要性 目标检测在许多领域都具有极其重要的作用。在自动驾驶中,目标检测能够识别道路上的障碍物和行人,确保行车安全。在视频监控中,目标检测能够实时发现异…

从登录到免登录:JSP与Servlet结合Cookie的基本实现

前言 JSP中应用Cookie解析: 用户登录成功后,将用户信息保存到Cookie中,在页面读取Cookie并显示,不需要再次登录可以直接进入页面 第一步:创建JavaWeb项目,配置pom.xml文件 创建maven项目,项目名…

DB-GPT部署和试用

前言 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。 目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mu…

Element UI入门笔记(个人向)

Element UI入门笔记 将页面分割为一级菜单、二级菜单、导航栏三个部分;使用npm下载安装,使用语句npm i element-ui -s; 布局组件 el-form 用于创建和管理表单;从属性上看: :model:用于双向数据绑定,将表单…

打造古风炫酷个人网页:用HTML和CSS3传递笔墨韵味

需要用到的背景大家可以自己找喜欢的风格!!! 当然俺把俺用的背景放到文章最后了哦!!!!! 感谢关注和支持 长期更新哦~~~ 1. 简洁的页面布局:保持优雅和对称 在古风设计中,布局的对称性非常重要…

Linux - 探秘/proc/sys/net/ipv4/ip_local_port_range

文章目录 Pre概述默认值及其意义评估需求如何调整临时修改永久修改测试和验证 修改的潜在影响 Pre Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置 计划: 简要解释 /proc/sys/net/ipv4/ip_local_port_range 文件的功能和作用。介绍该文件的默认值及其影响。说明…

螺丝、螺母、垫片等紧固件常用类型详细介绍

螺钉、螺母、垫片等紧固件介绍 螺钉 杯头内六角 首先介绍一下杯头内六角,杯头内六角是我们用的最常见的一种螺钉,如果你对选择螺钉没有什么想法,可以直接无脑选杯头内六角去使用。 比如说我们有一个零件加工了通孔,另一个零件加…

Vue3.0组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能,它是一组附加的、基于函数的 API,可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此,使用组合式 API 可以将组件代码编写为多个函…

CPU 和 GPU:为什么GPU更适合深度学习?

目录 什么是 CPU ? 什么是 GPU ? GPU vs CPU 差异性对比分析 GPU 是如何工作的 ? GPU 与 CPU 是如何协同工作的 ? GPU vs CPU 类型解析 GPU 应用于深度学习 什么是 CPU ? CPU(中央处理器)…

git push : RPC failed; HTTP 400 curl 22 The requested URL returned error: 400

git push 出现RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 问题 git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. error: RPC …

对中文进行文本分类的常用方法

一:关键词分类和基于规则的分类 关键词分类和基于规则的分类是两种常见的文本分类方法,它们可以应用于中文文本的分类。下面我将详细介绍这两种方法: 关键词分类 原理:这种方法通过识别文本中出现的特定关键词或短语来确定文本的…

STM32常用数据采集滤波算法

例如,STM32进行滤波处理时,主要目的是处理数据采集过程中可能产生的噪声和尖刺信号。这些噪声可能来自电源干扰、传感器自身的不稳定性或其他外部因素。 1.一阶互补滤波 方法:取a0~1,本次滤波结果(1-a)本次采样值a上…

基于 jenkins 的持续集成、持续部署方案

工具介绍 python3.12 fastapi 0.92.0 uvicorn 开发部署web项目;git gitee 实现代码版本管理;jenkins docker 实现持续集成、持续部署;centos7 作为jenkins服务器 & 部署服务器;有条件的可以再启动一台服务器作为部署测试…

学习笔记(一)

前言 一、对象 1、由类建模而成,是消息、数据和行为的组合 2、可以接收和发送消息,并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化:把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

RabbitMQ Spring客户端使用

注解声明式队列和交换机 java自带序列化工具类,将java对象序列化为字节数组,用于网络传输。 jdk序列号存在缺陷,(不安全,占用空间大等) 推荐使用JSON的序列化: springboot扫描包使配置生效&…

windows下自启springboot项目(jar+nginx)

1、将springboot项目打包为jar 2、新建文本文档 test.txt,并输入 java -jar D:\test\test.jar(修改为自己的jar包位置) 保存 然后修将后缀名改为 .bat 3、在同一目录再新建 文本文档test.txt,输入以下内容,&…

图数据库的力量:深入理解与应用 Neo4j

图数据库的力量:深入理解与应用 Neo4j 文章目录 图数据库的力量:深入理解与应用 Neo4j1、什么是 Neo4j?版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…

【数据结构篇】~排序(1)之插入排序

排序~插入排序 前言插入排序1.直接插入排序(时间复杂度:O(N^2))1.思想2.代码 2.希尔排序(时间复杂度:O(N∙))1.思路简易证明希尔排序的复杂度 2.代码 前言 四大排序,今天解决插入排序 堆排序和冒泡排序已经写过了&am…

从安装ffmpeg开始,把一个视频按照每秒30帧fps剪切为图片

ffmpeg -i demo.mp4 -vf fps1 -start_number 0 %5d.jpg没有ffmpeg 的去官网下载, ffmpeg.org/download.html 下载好之后,解压进入bin文件夹 复制当前路径,下一步 配置环境 进入本机环境变量,把地址添加到path中 之后进入anacond…

IO模型---BIO、NIO、IO多路复用、AIO详解

本篇将想给详细解释一下什么是BIO、NIO、IO多路复用以及AIO~ 同步的阻塞(BIO)和非阻塞(NIO)的区别 BIO:线程发来IO请求后,一直阻塞着IO线程,需要缓冲区这边数据准备好之后,才会进行下一步的操作。 举个🌰&#xff1…