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

news2025/1/10 23:51:34

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

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

完成本期内容,你可以:

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

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

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

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

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

  • 操作系统: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()

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

点击下载源码

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

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

相关文章

vim各模式下常见指令集

vim简介 vim其实就是一款写代码的软件或者编辑器。vs2019能够编写编译调试运行代码,它的功能非常的集成,因此它被称为集成开发环境。但是vim只是编辑,他的核心工作就是文本编写,就是单纯写代码,因此它的功能是不集成的…

chatgpt赋能python:Python概览:了解Python的优势和应用领域

Python概览:了解Python的优势和应用领域 介绍Python Python是一门高级编程语言,由Guido van Rossum在1989年创建,旨在提高开发人员的开发效率和代码质量。Python有着良好的代码可读性和简洁性,因此它已成为全球最受欢迎的编程语…

如何在 IDEA 中生成 Maven 依赖关系图?

文章目录 1、查看依赖关系图2、保存至本地查看3、exclude IDEA提供了查看依赖关系的方式,如下: 1、查看依赖关系图 点击IDEA右侧的maven工具栏,展开maven操作界面。 进入maven操作界面,点击查看maven之间的依赖关系按钮 然后就可…

代码随想录算法训练营day51 | 309. 最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票问题总结

代码随想录算法训练营day51 | 309. 最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票问题总结 309. 最佳买卖股票时机含冷冻期解法一:动态规划 714.买卖股票的最佳时机含手续费解法一:动态规划 股票问题总结 309. 最…

矿井水除总氮工艺详解

一、项目概述 项目背景: 1、水资源浪费长期以来,采煤对地下水造成了严重破坏。绝大部分矿井水,被以直排方式,流入河道、田野,这不仅造成水资源的白白浪费,也污染了环境。社会对此反响强烈的同时,煤矿企业也…

BT131-ASEMI代理KY原装双向可控硅BT131

编辑:ll BT131-ASEMI代理KY原装双向可控硅BT131 型号:BT131 品牌:韩景元\KY 封装:TO-92 特性:可控硅 正向电流:1A 反向耐压:600V 触发电压: 0.62~0.8 V 引脚数量…

ES(Elasticsearch)的docker安装部署教程

0、 服务器版本信息 Red Hat 4.8.5-44 CentOS Linux release 7.9.2009 (Core) 1、ES部署 1.1 拉取docker镜像 docker pull elasticsearch:7.10.1拉取成功的镜像,可以使用如下命令查看: docker images 上图2年之前表示该elasticsearch的7.10.1镜像版…

从传统 IT 容灾转向“全栈云容灾”|什么是更适合政企的云

凌晨 3 点,在某医院的自助缴费机前,一位医患家属正愁眉紧锁,手中的医保卡已经刷了无数遍,可次次都提示缴费失败,至亲的手术已经迫在眉睫… 早上 8 点,是上班族在通勤途中打开新闻 app 刷新闻的高峰&#x…

vue3+vite 中使用百度地图【两种方式】

vue3vite项目中使用百度地图 方式一:直接使用百度地图的ak方式二:使用vue-baidu-map-3x插件 方式一:直接使用百度地图的ak 提前准备: 创建一个vite项目申请好的百度地图ak值 百度地图使用: 在创建好的vite项目的入…

python 编译安装与脚本安装

编译安装的一般步骤: 安装依赖,安装依赖的第三方的工具,yum可以解决 编译安装的包中都有:configure 文件 进行预编译:检查你的环境是否合格 ./configure --prefixxxx 生成编译的文件:MakeFile python安装&…

Taobao.item_search-淘宝商品列表接口、关键词搜索淘宝商品列表接口

淘宝商品列表接口是淘宝开放平台提供的一个接口,可以返回符合指定条件的商品列表,开发者可以根据自己的需要在自己的应用中使用。 请求方式 淘宝商品列表接口使用 HTTP GET 请求方式。 请求 URL 请求URL如下:http://o0b.cn/opandy 请求参…

一文读懂循环队列的实现细节

循环队列最早出现在计算机系统设计中,它的出现主要是为了满足实际需求:在存储机制上,传统的队列存储方式难以满足一些实际应用中需要存储大量数据的场景。在有限的数组空间内,传统的队列存储方式可能会出现存储空间浪费过多、存储…

使用 StarCoder 创建一个编程助手

如果你是一个软件开发者,你可能已经使用过 ChatGPT 或 GitHub 的 Copilot 去解决一些写代码过程中遇到的问题,比如将代码从一种语言翻译到另一种语言,或者通过自然语言,诸如“写一个计算斐波那契数列第 N 个元素的 Python 程序”&…

[分享] 冒险岛079私服搭建

文章目录 前言目录介绍环境介绍过程第一步启动phpStudy.exe第二步 启动服务端.bat第三步 启动登录器.bat 总结常见问题 前言 好几年前找一个079版本冒险岛私服版本,本地玩了一下,感觉不错还研究了一下自带的GM工具。 现在朋友需要,记录一下踩…

交直流电流钳的用途和使用

电流钳是一种非侵入式检测设备,并不要求把采集端接入电路。一旦接入电路,就后会有阻抗的问题。霍尔线圈能够感应交流电流,但是无法感应直流信号。市售的电流钳,仍然是非接触测量,但交直流电流都能采,并且配…

Java的URI类

文章目录 1. 简介2. 构造一个URI3. URI的各个部分4. 解析相对URI5. 相等性和比较6. 字符串表示 1. 简介 URI是对URL的抽象,不仅包含统一资源定位符,还包括统一资源名(URN)。实际使用的URI大多是URL,但大多数规范和标准…

spring高频面试题

什么是IOC Spring框架提供的一种容器,用于控制对象的创建和对象之间的调用,通过IOC容器把对象的创建和调用过程交给Spring进行管理,省去了使用 new的方式创建对象。 所谓依赖注入(DI),就是由IOC容器在运行期间,动态地将某种依赖关…

生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、无人机遥感、ArcGIS Pro模型等

基于R语言APSIM模型高级应用及批量模拟实践技术 CMIP6 数据处理方法与典型案例分析实践技术 Python 与 Noah-MP 陆面过程模型融合技术及在站点、区域模拟实践应用 双碳目标下基于“遥感”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用 基于Citespace和vosvi…

扩展定时器功能说明

计数和定时 ⚫ 16bit upcounter ⚫ 上升沿或下降沿计数 ⚫ 计数初值和终值可配置 ⚫ 计数值大于等于比较值时触发中断 ⚫ 计数溢出后自动重载 ⚫ 计数周期中可以通过改写重载寄存器修改下一周期长度 支持16bit计数或级联的32bit计数。当CNTSEL0,计数器为16bit&#…

快手新财报:曙光就在冲刺路上?

自短视频爆火以来,短视频行业的头部玩家——抖音和快手就迎来了飞速发展,甚至一度成为了国民“杀时间利器”。然而,随着互联网红利逐渐见顶,短视频行业竞争加剧,哪怕作为头部玩家,快手的日子也并不好过。 …