基于OpenCv的图像金字塔

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

基于OpenCv的图像金字塔

  • 基于OpenCv的图像金字塔
    • 任务需求
    • 任务目标
      • 1、掌握图像高斯金字塔
      • 2、掌握图像拉普拉斯金字塔
      • 3、掌握图像使用拉普拉斯金字塔进行图像融合
    • 任务环境
      • 1、jupyter开发环境
      • 2、OpenCv
      • 3、python3.6
    • 任务实施过程
      • 一、高斯金字塔
        • 1.高斯金字塔:向下采样方法(缩小)
        • 2.高斯金字塔:向上采样方法(放大)
        • 3.将图像下采样后上采样与原图对比
      • 二、拉普拉斯金字塔
      • 三、图像融合
        • 1.读入两幅图像,苹果和橘子
        • 2.构建苹果和橘子的高斯金字塔(5 层)
        • 3.根据高斯金字塔计算拉普拉斯金字塔
        • 4.在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)
        • 5.根据融合后的图像金字塔重建原始图像。
      • 四、任务小结
  • 说明

基于OpenCv的图像金字塔

任务需求

一般情况下,我们要处理是一幅具有固定分辨率的图像。但是特别情况下我们需要对同一个图像的不同分辨率的子图像进行处理,所以我们需要创建一组图像,这些图像是具有不同分辨率的原始图像。我们把这组图像叫做图像金字塔。

在这里插入图片描述
图像金字塔主要解决图像分析尺度问题的,许多图像分析任务,包括超分辨、目标检测等等都是一种很重要的手段。例如在目标检测领域,图像中的物体通常很可能是远近不一,大小不一的,可以利用金字塔来检测不同尺度下的物体。

在这里插入图片描述

金字塔的另一种应用是图像融合。

在这里插入图片描述

任务目标

1、掌握图像高斯金字塔

2、掌握图像拉普拉斯金字塔

3、掌握图像使用拉普拉斯金字塔进行图像融合

任务环境

1、jupyter开发环境

2、OpenCv

3、python3.6

任务实施过程

一、高斯金字塔

图像金字塔中的向上和向下采样分别通过OpenCV函数 pyrUp 和 pyrDown 实现。

  • 对图像向上采样:cv2.pyrUp(img)
  • 对图像向下采样:pyrDown(img)
1.高斯金字塔:向下采样方法(缩小)
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline 
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,显示图像并查看原始图像尺寸
kenan = cv2.imread(r'./experiment/data/kenan.jpg')
print('原图像尺寸:',kenan.shape)
im_show('原图像',kenan)

在这里插入图片描述

# 高斯金字塔:向下采样
down=cv2.pyrDown(kenan)
print('图像向下采样后尺寸:',down.shape)
im_show('原图像向下采样',down)

在这里插入图片描述

2.高斯金字塔:向上采样方法(放大)
# 高斯金字塔:向上采样
up=cv2.pyrUp(kenan)
print('图像向上采样后尺寸:',up.shape)
im_show('原图像向上采样',up)

在这里插入图片描述

3.将图像下采样后上采样与原图对比
# 先将图像下采样两次
down1=cv2.pyrDown(kenan)
down2=cv2.pyrDown(down1)
# 再将得到的下采样图像上采样两次
up1=cv2.pyrUp(down2)
up2=cv2.pyrUp(up1)
plt.figure(figsize=(10,6))
im_show('原图像与图像下采样、上采样后图像对比',np.hstack((kenan,up2)))

在这里插入图片描述

将图像先下采样(缩小图像)再上采样(放大图像),在这个过程中也因此丢失了一些信息。得到的图像有些失真。

二、拉普拉斯金字塔

拉普拉斯金字塔是通过原图像减去先缩小后再放大的图像的一系列图像构成的。

# 先将图像下采样,再将图像上采样
down3=cv2.pyrDown(kenan)
down_up=cv2.pyrUp(down3)
# 拉普拉斯金字塔图像
l_1=kenan-down_up
plt.figure(figsize=(10,6))
im_show('原图像与拉普拉斯金字塔图像',np.hstack((kenan,l_1)))

在这里插入图片描述

三、图像融合

图像金字塔的一个典型应用是图像融合。
图像融合的目的就是使两幅图像的重叠区域过渡自然且平滑。但是由于连接区域图像像素的不连续性,直接将两幅图像拼接的效果看起来会很差。图像拉普拉斯金字塔可以不同图像的特征与细节融合在一起,实现无缝连接。

1.读入两幅图像,苹果和橘子
apple = cv2.imread(r'./experiment/data/apple.jpg')
orange = cv2.imread(r'./experiment/data/orange.jpg')
plt.figure(figsize=(10,6))
im_show('待融合图片',np.hstack((apple,orange)))

在这里插入图片描述

2.构建苹果和橘子的高斯金字塔(5 层)
# 为苹果生成高斯金字塔
G1 = apple.copy()
gpA = [G1]
plt.figure(figsize=(10,6))
# 创建一个2行3列子图,子图标签分别表示图像金字塔层数
plt.subplot(2,3,1)
im_show('0',apple)
for i in range(5):
    plt.subplot(2,3,i+2)
    G1 = cv2.pyrDown(G1)
    im_show(i+1,G1)
    gpA.append(G1)

在这里插入图片描述

# 为橘子生成高斯金字塔
G2 = orange.copy()
gpB = [G2]
plt.figure(figsize=(10,6))
# 创建一个2行3列子图,子图标签分别表示图像金字塔层数
plt.subplot(2,3,1)
im_show('0',orange)
for i in range(5):
    plt.subplot(2,3,i+2)
    G2 = cv2.pyrDown(G2)
    im_show(i+1,G2)
    gpB.append(G2)

在这里插入图片描述

3.根据高斯金字塔计算拉普拉斯金字塔
# 为苹果生成拉普拉斯金字塔
# lpA/lpB存储的是金字塔一上一下之间的“信息差”
# cv2.subtract(src1, src2)表示图像减法src1-src2
lpA = [gpA[5]]
plt.figure(figsize=(10,6))
plt.subplot(2,3,6)
im_show('5',gpA[5])
for i in range(5,0,-1):
    # 先将其上采样
    GE = cv2.pyrUp(gpA[i])
    # 将高斯上一层的图像减去高斯下一层图像上采样的结果
    L = cv2.subtract(gpA[i-1],GE)
    plt.subplot(2,3,i)
    im_show(i-1,L)
    lpA.append(L)

在这里插入图片描述

# 为橘子生成拉普拉斯金字塔
lpB = [gpB[5]]
plt.figure(figsize=(10,6))
plt.subplot(2,3,6)
im_show('5',gpB[5])
for i in range(5,0,-1):
    GE = cv2.pyrUp(gpB[i])
    L = cv2.subtract(gpB[i-1],GE)
    plt.subplot(2,3,i)
    im_show(i-1,L)
    lpB.append(L)

在这里插入图片描述

拉普拉斯金字塔的每一层的含义是,高斯金字塔每一层缩小后又放大到原尺寸所丢失的信息。

4.在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)
# 现在在每个级别中添加左右一半的图像
# 不补充“信息差”的情况下,直接hstack金字塔每一层
LS = []
i=1
plt.figure(figsize=(10,6))
for la,lb in zip(lpA,lpB):
    # 获得每一层图像的大小
    rows,cols,dpt = la.shape
    # 使用np.hstack()将图像进行水平拼接
    ls = np.hstack((la[:,0:int(cols/2)], lb[:,int(cols/2):]))
    plt.subplot(2,3,7-i)
    im_show(6-i,ls)
    i+=1
    LS.append(ls)

在这里插入图片描述

5.根据融合后的图像金字塔重建原始图像。
# 现在重建
# 逐层补充每一层的“信息差”并Up起来
# LS是融合后的拉普拉斯图像,0-5从小到大
ls_ = LS[0]
plt.figure(figsize=(10,6))
plt.subplot(2,3,6)
im_show('5',ls_)
for i in range(1,6):
    # 由最低分辨率图像向上采样
    ls_ = cv2.pyrUp(ls_) 
    # 将采样后的图片与同层的拉普拉斯金字塔图像相加
    ls_ = cv2.add(ls_, LS[i])
    plt.subplot(2,3,6-i)
    im_show(5-i,ls_)

在这里插入图片描述

融合时的图像ls_的变化过程:第一幅图放大一次后,和对应的拉普拉斯层的图像相加(把丢失的信息加回来),得到第二幅图。第二幅图再放大,和对应拉普拉斯层相加。依次类推。

# 图像金字塔融合和图像直接连接对比
# 图像各半边直接连接
real = np.hstack((apple[:,:int(cols/2)],orange[:,int(cols/2):]))
plt.figure(figsize=(10,6))
im_show('图像金字塔融合与图像直接连接对比',np.hstack((ls_,real)))

在这里插入图片描述

四、任务小结

本次实验主要完成基于拉普拉斯金字塔的图像无缝融合任务,任务首先生成高斯金字塔,然后根据生成的高斯金字塔生成拉普拉斯金字塔,再将拉普拉斯的每一层进行图像融合,根据融合后的图像金字塔重建原始图像。

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

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

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

相关文章

人工智能大模型应用指南

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

【Flask 系统教程 2】路由的使用

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探…

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来&a…

【ARM Cortex-M3指南】3:Cortex-M3基础

文章目录 三、Cortex-M3基础3.1 寄存器3.1.1 通用目的寄存器 R0~R73.1.2 通用目的寄存器 R8~R123.1.3 栈指针 R133.1.4 链接寄存器 R143.1.5 程序计数器 R15 3.2 特殊寄存器3.2.1 程序状态寄存器3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器3.2.3 控制寄存器 3.3 操作模式3.4 异常…

# 在 Windows 命令提示符(cmd)中,可以通过以下方法设置长命令自动换行

在 Windows 命令提示符(cmd)中,可以通过以下方法设置长命令自动换行 1、点击 cmd 窗口左上角标题栏,选择【属性】。 2、在【属性】菜单中,依次点击【选项】,找到【编辑选项】下面的【自动换行】&#xff…

经纬度聚类:聚类算法比较

需求: 将经纬度数据,根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值(K-means)聚类是一种常用的无监督学习算法,用于将数据集中的样本分成K个不同的簇(cluster)。其基本思想是…

OpenCV | 入门

OpenCV | 入门 安装 参考教程 基础知识 V G A 640 480 VGA 640 \times 480 VGA640480 H D 1280 720 HD 1280 \times 720 HD1280720 F H D 1920 1080 FHD 1920 \times 1080 FHD19201080 4 K 3840 2160 4K 3840 \times 2160 4K38402160 这些都表示了固定的像素…

AI-数学-高中52-离散型随机变量概念及其分布列、两点分布

原作者视频:【随机变量】【一数辞典】2离散型随机变量及其分布列_哔哩哔哩_bilibili 离散型随机变量分布列:X表示离散型随机变量可能在取值,P:对应分布在概率,P括号里X1表示事件的名称。 示例:

机器学习的指标评价

之前在学校的小发明制作中,在终期答辩的时候,虽然整个项目的流程都答的很流畅。 在老师提问的过程中,当老师问我recall,precision,accuracy等指标是如何计算的,又能够表示模型的哪方面指标做得好。我听到这个问题的时候&#xff…

使用FPGA实现串-并型乘法器

介绍 其实我们知道,用FPGA实现乘法器并不是一件很简单的事,而且在FPGA中也有乘法器的IP核可以直接调用,我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看,串-并乘法器就是其中一个乘数…

深入学习Redis(1):Redis内存模型

Redis的五个对象类型 字符串,哈希,列表,集合,有序集合 本节有关redis的内存模型 1.估算redis的内存使用情况 目前内存的价格比较的高,如果对于redis的内存使用情况能够进行计算,就可以选用合适的设备进…

初识webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令,最终产生了哪些变更,将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

多级留言/评论的功能实现——SpringBoot3后端篇

目录 功能描述数据库表设计后端接口设计实体类entity 完整实体类dto 封装请求数据dto 封装分页请求数据vo 请求返回数据 Controller控制层Service层接口实现类 Mapper层Mybatis 操作数据库 补充:返回的数据结构自动创建实体类 最近毕设做完了,开始来梳理…

https自签名ssl证书生成流程

准备工作: 0.安装完整版的openssl openssl下载官网 安装到C:\OpenSSL32,也可以安装到其它盘,不要包含空格和中文 打开openssl.exe所在目录如:C:\OpenSSL32\bin,输入cmd.exe打开cmd控制台 1.创建ca文件夹 ,证书文件夹 mkdir …

二维泊松方程(三角形区域)Matlab有限元编程求解|案例源码+说明文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

【Linux 进程】 自定义shell

目录 关于shell 1.打印提示符&&获取用户命令字符​编辑 2.分割字符串 3.检查是否为内建命令 cd命令 export命令 echo命令 1.输出最后一个执行的命令的状态退出码(返回码) 2.输出指定环境变量 4.执行外部命令 关于shell Shell 是计算机操…

C语言数组介绍

文章目录 一、数组的概念二、一维数组1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的使用5.一维数组在内存中的存储6.sizeof计算数组元素个数 三、二维数组1.二维数组的概念2.二维数组的创建3.二维数组的初始化4.二维数组的使用5.二维数组的输入和输出6.二维数组…

【教学类-50-09】20240505“数一数”图片样式09:数一数(几何图案——透明颜色重叠+纯黑边框+黑框粗细)

背景需求: 【教学类-50-03】20240408“数一数”图片样式03:透明图形与边框不相交,透明图形和其他透明图形重叠-CSDN博客文章浏览阅读867次,点赞28次,收藏25次。【教学类-50-03】20240408“数一数”图片样式03&#xf…

银行ETL-监管报送

1104报表 1104报表主要包括:资产负债,表外业务、流动性风险、贷款质量、投向行业和地区、重点客户等。 1104报表分类 普通报表、机构特色类报表。 反洗钱 大额交易、可疑交易。标签分类:疑似犯罪、疑似毒品、疑似传销。 反洗钱—接口报…