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].shape
    merge = 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()

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

点击下载源码

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

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

相关文章

【高级语言程序设计(一)】第 10 章:文件

目录 一、文件概述 (1)文件定义 (2)文件命名 (3)文件分类 ① 按照文件的内容划分 ② 按照文件的组织形式划分 ③ 按照文件的存储形式划分 ④ 按照文件的存储介质划分 (4)文…

系统集成项目管理工程师 下午 真题 及考点(2019年上半年)

文章目录 一:第10章 项目质量管理,规划质量管理输出,质量成本法(一致性成本【预防、评价】 和 非一致性成本【内部失败、外部失败】),七种工具二:第8章 项目进度管理,总浮动时间&…

26 VueComponent 其他属性的更新

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 比如这里看一下 class 的更新 测试用例如下, 增加 topClazz …

4、js - 闭包

1、闭包的概念 闭包:函数嵌套函数,内层函数访问了外层函数的局部变量。 // 闭包 function func1() {let a 9;let b 8;function func2() {console.log("a", a); // a 9}func2(); } func1(); 分析: 需要访问的变量会被放到闭包…

语义分割实战项目(从原理到代码环境配置)

MMsegmentation是一个基于PyTorch的图像分割工具库,它提供了多种分割算法的实现,包括语义分割、实例分割、轮廓分割等。MMsegmentation的目标是提供一个易于使用、高效、灵活且可扩展的平台,以便开发者可以轻松地使用最先进的分割算法进行研究和开发。 看下结果 MMsegmenta…

day13 网络编程Tomcat服务器

c/s架构和b/s架构的区别 c/s架构:客户端软件,直观,体验好,界面美观,安全性高 b/s架构:浏览器–>服务器,可移植性好,开发和维护性好 网络访问的三要素:ip,端口,协议 udp协议和tcp协议的区别 udp协议:只管发送,不管发送到哪里,是否能不能接收,一对多,无连接通信协议 ​ …

《元宇宙之声》:Meta MCDH

为下一代建造未来就绪的校园。 在本期节目中,我们访问了香港路德会马锦明慈善基金马陈端喜纪念中学(MCDH)的陈婉玲校长,讨论了 MCDH 改革教育的愿景,通过培养年轻的创作者,让他们迈出进入 The Sandbox 的第…

模拟strcpy函数,assert,const修饰指针与凉皮男孩的故事

那么好了好了,宝子们,今天给大家介绍一下strcpy函数及其模拟,还有assert,const与凉皮男孩间的爱恨情仇,来吧,开始整活!⛳️(今天的内容和故事非常的有趣,希望大家一键三连…

基于51单片机的两路数字电压表Protues仿真设计

目录 一、设计背景 1.1、数字电压表的发展历程 1.2、课题的意义和目的 二、实现功能 三、仿真演示 四、部分程序展示 一、设计背景 1.1、数字电压表的发展历程 数字电压表简称DVM,它是采用数字化测量技术设计的电压表。从性能来看:数字电压表的发展从…

Go完整即时通讯项目及Go的生态介绍

Go完整即时通讯项目 项目架构: 1 编写基本服务端-Server server.go package mainimport ("fmt""net" )// 定义服务端 type Server struct {ip stringport int }// 创建一个Server func NewServer(ip string, port int) *Server {return …

Vue电商项目--分页器制作

分页器静态组件 分页这个组件&#xff0c;不单单是一个页面用到了。多个页面同时用它,因此我们可以封装成一个全局组件 需要将这个分页结构拆分到components 通用的分页组件Pagination <template><div class"pagination"><button>1</butto…

公司只有1个测试,领导却让我测试10个项目,这不是为难我....

读者提问&#xff1a;公司只有 1个测试&#xff0c;领导让我同时测试 10个项目&#xff0c;我该怎么办&#xff1f;回答&#xff1a;如果我是那个测试&#xff0c;我会做这三件事 1、向上申请资源2、任务分配到人3、执行测试任务 一、向上申请资源 1个测试同时对接 10个项目&a…

python 自动化学习(三) 句柄获取、模拟按键、opencv安装

一、什么是句柄 句柄是在操作系统中的一种标识符&#xff0c;相当于我们每个人的身份证一样&#xff0c;句柄在电脑中也是有唯一性的&#xff0c;我们启动的每一个程序都有自己的句柄号&#xff0c;表示自己的身份 为什么要说句柄&#xff0c;我们如果想做自动化操作时&#xf…

分布式项目 11 在项目中使用jsonp发送请求并且处理

在项目中使用jsonp技术 01.相关子系统的搭建 第一步&#xff1a;创建一个新的子系统&#xff0c;叫做jt-sso 选中jt父级项目&#xff0c;然后鼠标右键进行new&#xff0c;然后选中maven Model&#xff0c;进行项目的创建&#xff0c;具体操 作如下图所示&#xff1a; 第二步…

空气中的声压级、声功率级、声强级的区别

空气中的声压级、声功率级、的区别 在学习声学理论时&#xff0c;经常听到&#xff0c;声压级、声强级、声功率级的名称&#xff0c;经常也听到它们的单位为dB.但是它们是怎样的区别呢&#xff1f;下面介绍这几个名词 一、定义和计算 1.声压级 声压级以 L p {L_p} Lp​表示&am…

解决weekofyear跨年问题

目录 前言跨年问题计算当年第几周前言 前段时间,做了一个日期维度表的需求,发现 计算当年第几周 有误,发现 Hive 中 weekofyear 函数存在跨年问题! 跨年问题 这一周算上一年还是下一年,取决于这一周的大多数日期(4天及以上)在哪一年。算在前一年,就是前一年的最后一…

算法修炼之练气篇——练气十二层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…

【2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价】完整思路分析+完整代码

1.问题背景与描述 这道题整体还是相对简单的&#xff0c;比较适合新手&#xff0c;选的人多对应获奖数量也会多&#xff0c;所以不要纠结于选题&#xff0c;就选你看上去能做的就好 2.问题分析 2.1 问题一的分析 对附件2中所给数据进行分析和数值化处理&#xff0c;并给出处…

SpringMVC一站式学习,分分钟钟让你上手

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…