OpenCV-38 图像金字塔

目录

一、图像金字塔

1. 高斯金字塔

2. 拉普拉斯金字塔 


一、图像金字塔

图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔是同一图像不同分辨率的子图集合

图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

目前有两类常用的图像金字塔

高斯金字塔(Gaussian pyramid):用于向下/降采样(向下不是方向向下,而是指的是分辨率减小),是主要的图像金字塔

拉普拉斯金字塔(Laplacian pyramid):用于从金字塔底层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用

1. 高斯金字塔

高斯金字塔是通过高斯平滑亚采样(subsampling)获得一系列下采样的图像。

原理如下:

GI指图像

原始图像 M * N -> 处理后图像 M/2 * N/2(奇数也可以进行,系统会自动进行类似于四舍五入的操作)

每次处理后,结果图像时原来的1/4 

注意:

向下采样会丢失图像的信息

向上采样与向下采样操作相反

1. 将图像在每个方向扩大为原来的两倍,新增的行和列以0补充。

2. 使用先前同样的内核(乘以4)与放大后的图像卷积。获得近似值。 

pyrDown(img)--- 向下采样

pyrUp(img)--- 向上采样

示例代码如下:

import cv2
import numpy as np
lena = cv2.imread("beautiful women.png")
print(lena.shape)
# 分辨率减小,下采样
new_1 = cv2.pyrDown(lena)
new_2 = cv2.pyrDown(new_1)
print(new_1.shape)
cv2.imshow("img", lena)
cv2.imshow("img1", new_1)
cv2.imshow("img2", new_2)
# 分辨率增大,上采样
new_3 = cv2.pyrUp(lena)
cv2.imshow("img3", new_3)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

2. 拉普拉斯金字塔 

拉普拉斯金字塔没有特定的函数,只是用数学公式进行推导得到的。

将降采样之后的图像在进行上采样操作,与原图进行做差得到残差图。 为还原图像做信息准备。

即拉普拉斯金字塔最终得到的是残差。

拉普拉斯金字塔由高斯金字塔构成,没有专门的函数。

拉普拉斯金字塔图像类似图像边缘,它的大部分元素都是0, 用于图像压缩。

示例代码如下:

import cv2
lena = cv2.imread("beautiful women.png")
# 计算第0层的拉普拉斯金字塔
# 先缩小再放大
dst = cv2.pyrDown(lena)
# 分辨率增大,上采样
dst = cv2.pyrUp(dst)
dst.resize((634, 627, 3))
print(dst.shape)
print(lena.shape)
lap0 = lena - dst
cv2.imshow("img", lap0)
#  计算第1层的拉普拉斯金字塔
dst1 = cv2.pyrDown(dst)
dst1 = cv2.pyrUp(dst1)
dst1.resize((634, 627, 3))
lap1 = dst - dst1
cv2.imshow("img1", lap1)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下: 

第0层拉普拉斯金字塔:

第1层拉普拉斯金字塔:

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

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

相关文章

Qt for android : Qt6.6.2 搭建 环境

环境说明 参考Qt助手: Assistant 6.6.2 (MinGW 11.2.0 64-bit) ***Gradle : Gradle wrapper, version 8.3***JDK11 SDK Tools / NDK 25.1.8937393 参考 Qt For Android : Qt5.13.1 Qt for android: Qt6.4搭建环境遇到的几个问题

前方预警!2024年七大网络安全威胁

新颖创新技术的兴起和迅速采用已极大地改变了各行各业的全球网络安全和合规格局,比如生成式人工智能、无代码应用程序、自动化和物联网等新技术。 网络犯罪分子正转而采用新的技术、工具和软件来发动攻击,并造成更大的破坏。因此,《2023年网…

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…

基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 蓄电池储能原理 4.2 飞轮储能原理 4.3 混合储能系统原理 5.完整工程文件 1.课题概述 基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真。蓄电池和飞轮混合储能,蓄电池可以用SIMULINK…

私立医院患者大数据分析平台建设方案

一、项目目标 1、数据质量,统计数字不仅是真实可信,而且要及时,便于及时判断企业经营情况,同时通过内外部数据的对标,发现企业经营问题。 2、提供指标的监控预警,为决策提供支持,减少杂乱无用报表的生产。 3、提升数据处理效率,提高报表的可用性,让数据标准化,提高…

寒假 6

1.现有无序序列数组为{23,24,12,5,33,5,34,7}&#xff0c;请使用以下排序实现编程。 函数1:请使用冒泡排序实现升序排序 函数2︰请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4∶请使用插入排序实现升序排序 #include <stdio.h> #inclu…

代码随想录 Leetcode860. 柠檬水找零

题目&#xff1a; 代码(首刷自解 2024年2月15日&#xff09;&#xff1a; class Solution { public:bool lemonadeChange(vector<int>& bills) {vector<int> leftchange(2,0);//leftchange[0]代表5元数量&#xff0c;1代表10for (int i 0; i < bills.size…

多线程面试题汇总

多线程面试题汇总 一、多线程1、线程的生命周期2、线程的创建&#xff08;函数创建&#xff09;3、线程的创建&#xff08;使用类&#xff09;4、守护线程 二、全局解释器锁1、使用单线程实现累加到5000000002、使用多线程实现累加到5000000003、总结 三、线程安全1、多线程之数…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

蓝桥杯真题:扑克牌移动

import java.util.*; public class Main {public static List moveCard(List src){if(srcnull) return null;List dst new Vector();for(;;){if(src.size()0) break; // 填空src.add(src.remove(0));//remove(0) 是一个 List 接口中的方法调用&#xff0c;它表示移除列表中指…

163基于matlab的不同目标函数的盲源信号分离基于负熵的

基于matlab的不同目标函数的盲源信号分离基于负熵的&#xff1b;基于负熵的改进算法&#xff1b; 基于峭度的&#xff1b;基于互信息的&#xff1b;基于非线性PCA的。输出解混前后信号结果。程序已调通&#xff0c;可直接运行。 163 负熵、峭度、互信息、PCA 信号处理 (xiaohon…

面试突击1

1.当线程没有拿到资源时&#xff0c;用户态和内核态的一个切换 在操作系统中&#xff0c;进程和线程是执行程序的基本单位。为了管理这些单位&#xff0c;操作系统使用了一种称为“进程状态”的机制&#xff0c;其中包括用户态和内核态两种状态。这两种状态代表了进程或线程在…

通过玩游戏学会AWS

游戏名字&#xff1a; Cloud Quest 类型&#xff1a;亚马逊云科技官方出了一款 3D 角色扮演、虚拟城市建造形式的游戏实验课 进入方法&#xff1a;浏览器搜索 Cloud Quest&#xff08;或扫描下方二维码&#xff09;进入 Cloud Quest 课程页。 选择以下的链接 点击进行注册 进…

Java Web 中forward 和 redirect 的区别

前言 在Java Web开发中&#xff0c;页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward&#xff08;转发&#xff09;和Redirect&#xff08;重定向&#xff09;是两种常见的跳转方式&#xff0c;它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式…

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址&#xff0c;指针变量&#xff0c;解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

C++数据结构与算法——字符串

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

在已有代码基础上创建Git仓库

在已有代码基础上创建Git仓库 背景方法处理问题 背景 先进行了代码编写&#xff0c;后续想放入仓库方便大家一起合作开发&#xff0c;此时需要在已有代码的基础上建立仓库。 方法 首先在Gitee或者GitHub上创建仓库&#xff0c;这里以Gitee为例。创建完后&#xff0c;我们可以…

java8-用optional取代nu11

本章内容口nu11引用引发的问题&#xff0c;以及为什么要避免nu11引用从nu11到optiona1:以nu11安全的方式重写你的域模型让optiona1发光发热:去除代码中对nu11的检查 读取optiona1中可能值的几种方法口对可能缺失值的再思考 如果你作为Java程序员曾经遭遇过Nu11PointerException…

Excel导入预览与下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Excel导入预览与下载 preview Controller PostMapping("preview")ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWa…

猫头虎分享已解决Bug ‍ || Java Error: Could not find or load main class com.example.Main

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …