当前位置: 首页 > news >正文

day15 - 使用图像金字塔进行图像拼接

在我们之前的学习过程中,使用的都是恒定大小的图像,但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象,这些具有不同分辨率的图像集称为“图像金字塔”。

本期我们来实现使用图像金字塔将两张图片融合到一张图片。

完成本期内容,你可以:

  • 了解图像金字塔的原理和应用

  • 掌握上采样和下采样对应的原理和函数

  • 掌握高斯金字塔的实现和应用

  • 掌握拉普拉斯金字塔的实现和应用

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


下采样

OpenCV将下采样封装成了cv2.pyrDown()方法。

函数原型:dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst为输出图像。

参数描述如下:

  • dst:目标图像。
  • src: 原始图像。
  • dstsize:目标图像的大小。
  • borderType:边界类型。

上采样

OpenCV将下采样封装成了cv2.pyrDown()方法。

函数原型:dst = cv2.pyrDown( src[, dstsize[, borderType]] )
dst为输出图像。

参数描述如下:

  • dst:目标图像。
  • src: 原始图像。
  • dstsize:目标图像的大小。
  • borderType:边界类型。

高斯金字塔

高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。高斯金字塔的向下采样过程是:对于给定的图像先做一次高斯平滑处理,也就是使用一个大小为的卷积核对图像进行卷积操作,然后再对图像采样,去除图像中的偶数行和偶数列,然后就得到一张图片,对这张图片再进行上述操作就可以得到高斯金字塔。

请添加图片描述

拉普拉斯金字塔

拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。拉普拉金字塔的图像看起来就像边界图,其中很多像素都是0。他们经常被用在图像压缩中。将降采样之后的图像再进行上采样操作,然后与之前还没降采样的原图进行做差得到残差图。为还原图像做信息的准备。

请添加图片描述

图像融合

图像金字塔的重要应用就是图像融合,它的具体操作是首先对两张图片分别进行降采样,或者采用高斯金字塔法,当降采样到一定程度后,将两张图片合并,这时候由于在降采样时丢失了一部分边缘信息,因此边缘处不匹配的现象就消失了。之后对合并的图像进行上采样,或者采用拉普拉斯金字塔法,使图像回到原来的大小。此时,边缘处的不匹配现象就会明显降低甚至消失。


具体步骤

使用图像金字塔将下列两张图片进行融合。

请添加图片描述
请添加图片描述

步骤一:创建项目工具

创建项目名为使用图像金字塔进行图像融合,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用图像金字塔进行图像融合                  # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

步骤二:加载苹果和橙子的两个图像

  1. 导入所需模块:OpenCV、NumPy ;
  2. 读取dataset文件夹下的apple.pngorange.png图片;
  3. 将两张图像均修改为 515*512 的尺寸;

代码实现

# 导入OpenCV、numpy
import cv2
import numpy as np# 读取图片
img = cv2.imread("../dataset/apple.png")
img1 = cv2.imread("../dataset/orange.png")# resize到2的幂次,方便降采样处理
img = cv2.resize(img, (512, 512))
img1 = cv2.resize(img1, (512, 512))

步骤三:定义构建高斯金字塔的函数

  1. 将原图像复制,作为第一张图像;
  2. 高斯平滑处理;
  3. 下采样操作;
  4. 循环上面两步操作,并将得到的图像储存至列表中。

代码实现

# 定义构建高斯金字塔的函数
def gaussian(ori_image, down_times=2):# 1:添加第一个图像为原始图像temp_gau = ori_image.copy()gaussian_pyramid = [temp_gau]for i in range(down_times):# 高斯平滑gaussian_img = cv2.GaussianBlur(temp_gau, (5, 5), 0, 0)# 2:连续存储2次下采样,这样高斯金字塔就有3层temp_gau = cv2.pyrDown(gaussian_img)gaussian_pyramid.append(temp_gau)return gaussian_pyramid

步骤四:定义构建拉普拉斯金字塔的函数

  1. 将高斯金字塔图像列表中的最后一张图像作为第一张图像;
  2. 上采样操作
  3. 与之前还没降采样的原图进行做差得到残差图;
  4. 循环上面两步操作,并将得到的图像储存至列表中。

代码实现

# 定义构建拉普拉斯金字塔的函数
def laplacian(gaussian_pyramid, up_times=2):laplacian_pyramid = [gaussian_pyramid[-1]]for i in range(up_times,0, -1):# i的取值为2,1,0也就是拉普拉斯金字塔有3层temp_pyrUp = cv2.pyrUp(gaussian_pyramid[i])temp_lap = cv2.subtract(gaussian_pyramid[i-1], temp_pyrUp)laplacian_pyramid.append(temp_lap)return laplacian_pyramid

步骤五:对两张图像分别进行高斯金字塔和拉普拉斯金字塔操作

代码实现

# 第一张图进行高斯金字塔计算
gp1 = gaussian(img, down_times=5)# 第二张图进行高斯金字塔计算
gp2 = gaussian(img1,down_times=5)# 第一张图进行拉普拉斯金字塔计算
lp1 = laplacian(gp1,up_times=5)# # 第二张图进行拉普拉斯金字塔计算
lp2 = laplacian(gp2,up_times=5)

步骤六:图像融合

  1. 在每个级别中添加第一张图像的左边和第二张图像的右边,组成新的图像;
  2. 重建图像;
  3. 展示图像。
# 现在在每个级别中添加左右两半图像
merges = []
for i in range(step + 1):w, h, d = lp1[i].shapemerge = np.hstack((lp1[i][:, 0:w // 2 - 10 // 2 ** i], lp2[i][:, w // 2 - 10 // 2 ** i:]))merges.append(merge)
# 现在重建
ls_ = merges[0]
for i in range(1,6):ls_ = cv2.pyrUp(ls_)ls_ = cv2.add(ls_, merges[i])cv2.imshow('Pyramid_blending2.jpg',ls_)cv2.waitKey()
cv2.destroyAllWindows()

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

点击下载源码

相关文章:

day15 - 使用图像金字塔进行图像拼接

在我们之前的学习过程中,使用的都是恒定大小的图像,但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将…...

算法修炼之筑基篇——筑基一层初期(解决01背包问题)

✨博主:命运之光 ✨专栏:算法修炼之练气篇​​​​​ ✨博主的其他文章:点击进入博主的主页 前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…...

JVM的空间结构

目录 一、概述 二、分类 1.程序计数器区域(Program Counter Register): 2.Java虚拟机栈(Stack): 3.堆区(Heap): 4.方法区(Method Area): 5.本地方法栈(Native Method Stack): 一、概述 JVM分为5个主要区域&…...

图像分割的常用算法

图像分割是指将一幅图像划分成多个子区域或像素集合的过程,其中每个子区域或像素集合具有一定的统计特征或语义信息。图像分割是图像处理中的基础任务,其应用涵盖了医学影像、计算机视觉、机器人技术等多个领域。常用的图像分割算法包括: 1.…...

AI歌手真的可以吗

你听过AI歌手吗?近日,“AI孙燕姿”火遍全网,AI孙燕姿翻唱林俊杰的《她说》、周董的《爱在西元前》、赵雷的《成都》等等歌曲让网友听了直呼:“听了一晚上,出不去了。”你认为AI歌手会取代流行歌手成为主流吗&#xff1…...

Kubernetes高级存储

Kubernetes高级存储 PV PVC k8s支持的存储系统很多,全部掌握不现实。为了屏蔽底层存储实现的细节,方便用户使用,k8s引入PV和PVC两种资源对象。 PV(Persistent Volume)持久化卷,对底层共享存储的抽象,一般由k8s管理员进…...

云原生之使用Docker部署docker-compose-ui工具

云原生之使用Docker部署docker-compose-ui工具 一、Docker Compose UI介绍二、检查本地docker环境1.检查系统版本2.检查docker状态 三、下载Docker Compose UI镜像四、部署Docker Compose UI服务1.新建安装目录2.创建Docker Compose UI容器3.检查Docker Compose UI容器状态4.查…...

文心一言 vs GPT4

本周真是科技爱好者的狂欢节。GPT4和文心一言接连发布,AI工具已经开始走进千家万户。 拿文心一言发布会上的几个问题调戏了 GPT4 一下,看看表现如何。 第一个为文心的回答,第二个为GPT4 的回答。 1. 可以总结一下三体的核心内容吗&#xf…...

Tcl-5. format 命令

format 命令和 C 语言中的 printf 和 sprintf 命令类似。它根据一组格式说明来格式化字符 串。此命令不会改变被操作字符串的内容。 [语法]:format spec value1 value2 ... spec 变元包含了格式说明关键词和附加文字。使用%来引入一个关键词,后跟 0 个…...

BloombergGPT: 首个金融垂直领域大语言模型

BloombergGPT: 首个金融垂直领域大语言模型 Bloomberg 刚刚发布了一篇研究论文,详细介绍了他们最新的突破性技术 BloombergGPT。BloombergGPT是一个大型生成式人工智能模型,专门使用大量金融数据进行了训练,以支持金融行业自然语言处理 (NLP…...

CMake深度解析:掌握add_custom_command,精通Makefile生成规则

CMake深度解析:掌握add_custom_command,精通Makefile生成规则 1. CMake简介与基础知识1.1 CMake的基本概念(CMake Basic Concepts)1.1.1 项目(Project)1.1.2 目标(Target)1.1.3 命令…...

基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换

刚开始跟着网上的教程做,把环境安装错了,后来直接用GitHub的官方教程来安装环境。 地址是yolov5官方团队代码及教程,看readme文件就可以。 系列文章: 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集…...

Office project 2019安装

哈喽,大家好。今天一起学习的是project 2019的安装,Microsoft Office project项目管理工具软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…...

【leetcode-mysql】1251. 平均售价

题目: Table: Prices ---------------------- | Column Name | Type | ---------------------- | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------------- (product_id,start_date,end_dat…...

Razor代码复用

1.布局&#xff08;Layout&#xff09;复用 Layout的使用&#xff0c;就像WebForm的模板页一样&#xff0c;甚至会更加简单&#xff0c;更加方便和明了。 要使用Layout&#xff0c;首先要在模板页相应的位置添加RenderBody()方法&#xff1a; <!DOCTYPE html><html la…...

PRL:上海交大张文涛团队实现量子材料相关突破

来源&#xff1a;上海交通大学 近期&#xff0c;上海交通大学物理与天文学院张文涛研究组利用自行研制的高能量和高时间分辨率角分辨光电子能谱系统对量子材料1T-TiSe₂电子结构进行了超快激光操控研究。利用超快光激发与电荷密度波相有关的相干声子&#xff0c;引起晶格内原子…...

impala中group_concat()函数无法对内容进行order by

描述&#xff1a; 使用的是impala数据库&#xff0c;假设有四笔数据&#xff0c;是无序的&#xff0c;业务上要求将其行转列成一行数据&#xff0c;并且里面的数据要按从小到大排序。 过程&#xff1a; 猜测&#xff1a; 数据库Oracle、Mysql、MSsql等支持group_concat中使…...

MySQL 数据库全局变量中文解释

NameValueauto_increment_incrementAUTO_INCREMENT 字段值的自增长步长值。auto_increment_offsetAUTO_INCREMENT 字段值的初始值。autocommit指示新连接的默认提交模式是否启用。automatic_sp_privileges控制是否在存储过程上创建或更改时自动分配特定权限。back_log在开始拒绝…...

设计模式之~状态模式

状态模式&#xff08;State&#xff09;&#xff0c;当一个对象的内部状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 能够让程序根据不同的外部情况来做出不同的响应&#xff0c;最直接的方法就是在程序中将这些 可能发生的外部情况全部考虑到&#xff…...

【21JavaScript break 和 continue 语句】JavaScript中的break和continue语句:控制循环流程的关键技巧

JavaScript break 和 continue 语句 在JavaScript中&#xff0c;break和continue是两个关键字&#xff0c;用于控制循环结构的执行流程。 break语句 break语句用于中断循环并跳出循环体&#xff0c;使程序执行流程继续到循环之后的下一行代码。 在for循环中使用break for (…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...