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

《OpenCV计算机视觉》—— 图像金字塔

文章目录

  • 什么是图像金字塔?
    • 一、定义与基本原理
    • 二、主要类型
    • 三、构建过程
    • 四、应用领域
  • 图像金字塔中的下采样和上采样
    • 一、下采样(Downsampling)
    • 二、上采样(Upsampling)
    • 三、总结
  • 代码实现

什么是图像金字塔?

一、定义与基本原理

图像金字塔是一种将图像以多分辨率进行表达的结构,通常表现为一系列分辨率逐渐降低的图像集合,这些图像按照金字塔形状(自下而上)排列,因此得名。每一层图像都是对下一层图像进行下采样(或上采样)得到的,层级越高,图像越小,分辨率越低。

二、主要类型

  • 常见的图像金字塔有两种类型:

    • 高斯金字塔(Gaussian Pyramid):高斯金字塔通过不断地对图像进行高斯滤波下采样操作来构建。每一层图像都是对下一层图像进行高斯滤波后,再以一定的步长(通常是2)进行抽样得到的。高斯滤波的目的是为了去除图像中的高频信息,保留低频信息,从而在不同尺度上平滑图像
    • 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是在高斯金字塔的基础上构建的。它通过对高斯金字塔的每一层图像进行上采样(与降采样相反的操作),然后使用原高斯金字塔的对应层图像减去上采样后的图像,得到每一层的拉普拉斯图像。拉普拉斯图像包含了高斯金字塔相邻两层之间的差异信息,即图像的高频细节。

三、构建过程

  • 以高斯金字塔为例,其构建过程通常包括以下几个步骤:

    • 读取原始图像:首先,需要读取待处理的原始图像。
    • 高斯滤波:对原始图像进行高斯滤波,以去除图像中的高频噪声和细节。
    • 下采样:对滤波后的图像进行降采样操作,即按照一定的步长(如2)选取图像中的像素点,从而得到分辨率较低的图像。
    • 重复操作:将上一步得到的低分辨率图像作为新的输入图像,重复进行高斯滤波和降采样操作,直到达到所需的金字塔层数或满足某个终止条件。
  • 拉普拉斯金字塔的构建过程则需要在高斯金字塔的基础上,对每一层图像进行上采样和求差操作。

    • 可以理解为拉普拉斯金字塔是由高斯金字塔向下采样时丢失的信息构成的
  • 可以结合下图来理解:
    在这里插入图片描述

四、应用领域

  • 图像金字塔在图像处理中有着广泛的应用,主要包括以下几个方面:

    • 图像压缩:利用图像金字塔可以对图像进行多尺度表达,从而在压缩过程中保留图像的重要信息,同时去除冗余信息,实现高效的图像压缩。
    • 图像融合:在图像融合过程中,可以利用图像金字塔将不同分辨率的图像进行融合,从而得到更加清晰、全面的图像信息。
    • 图像分割:在图像分割任务中,可以利用图像金字塔对图像进行多尺度分析,从而更加准确地提取出图像中的目标区域。
    • 机器视觉:在机器视觉领域,图像金字塔可以用于特征提取、目标识别等任务中,提高算法的鲁棒性和效率。
  • 总之,图像金字塔是图像处理中的一种重要技术,它通过多尺度的图像表达方法,为图像处理提供了更加灵活和高效的手段。

图像金字塔中的下采样和上采样

一、下采样(Downsampling)

  • 下采样,也称为降采样,是图像金字塔构建过程中的一个重要步骤。它的主要目的是减少图像的分辨率,通常是通过去除图像中的部分数据来实现的。下采样的过程大致可以分为以下两个步骤:

    • 滤波:首先,对图像进行滤波处理,以去除图像中的高频成分,减少图像细节,通常使用高斯模糊等方法。
    • 子采样:在滤波之后,对图像进行子采样,即按照一定的规则(如每隔一行或一列取一个像素)去除部分像素,从而降低图像的分辨率。
  • 在OpenCV中,下采样通常通过 pyrDown() 函数来实现。这个函数会首先对图像进行高斯模糊,然后去除偶数行和列,从而得到分辨率降低的图像。通过多次调用pyrDown()函数,可以构建出完整的图像金字塔。

  • 下采样的优点包括降低计算复杂度、去除噪声、减小内存消耗和加速特征检测等。然而,它也会带来信息损失和图像失真的问题。

二、上采样(Upsampling)

  • 上采样,也称为放大或插值,是下采样的逆过程,用于增加图像的分辨率。上采样的主要目的是通过某种方式填充图像中的空白区域,从而恢复或提高图像的分辨率

  • 在OpenCV中,上采样通常通过 pyrUp() 函数来实现。这个函数会首先通过插值(如双线性插值或双三次插值)在图像的行列之间插入新的像素值,然后对新生成的图像进行高斯模糊处理,以平滑插值过程中产生的锯齿状边缘。

  • 然而,需要注意的是,上采样并不能完全恢复下采样过程中丢失的信息,因此上采样后的图像在细节上可能无法与原始图像完全一致。此外,上采样还可能导致图像模糊和失真。

三、总结

  • 向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作是不可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态

代码实现

  • 代码如下:

    import cv2""" 下采样 """
    MB = cv2.imread('wechat.jpg')
    # 注意:下采样要求图片的宽高的值必须是偶数,且在第一次下采样后宽高的值任然是偶数
    # 这里我们将图片的大小微调一下
    MB = cv2.resize(MB, dsize=(1276, 876))
    # 第一次下采样
    MB_down_1 = cv2.pyrDown(MB)
    # 第二次下采样
    MB_down_2 = cv2.pyrDown(MB_down_1)# 显示图像
    cv2.imshow('MB', MB)
    cv2.imshow('MB_down_1', MB_down_1)
    cv2.imshow('MB_down_2', MB_down_2)
    cv2.waitKey(0)""" 上采样 """
    # 对下采样后图片进行上采样,图像便模糊,无法复原
    MB_down_1_up = cv2.pyrUp(MB_down_1)
    MB_down_2_up = cv2.pyrUp(MB_down_2)cv2.imshow('MB_down_1_up', MB_down_1_up)
    cv2.imshow('MB_down_2_up', MB_down_2_up)
    cv2.waitKey(0)""" 拉普拉斯金字塔 """# 第一层求差
    L0 = MB - MB_down_1_up
    # 第二层求差
    L1 = MB_down_1 - MB_down_2_up# 通过上采样后的结果 + 下采样损失的像素值 来实现复原成原始图像
    fuyuan = MB_down_1_up + L0# 显示图片
    cv2.imshow('L0', L0)
    cv2.imshow('L1', L1)
    cv2.imshow('fuyuan', fuyuan)
    cv2.waitKey(0)
    
  • 原图和下采样后的结果图如下:
    在这里插入图片描述

  • 对对下采样后图片进行上采样后的结果图如下:
    在这里插入图片描述

  • 将下采样的图片和将下采样后的图片在进行上采样的图片放在一起对比,如下

  • 可以发现上采样后的结果图会比较模糊,这就是因为下采样时一些像素点丢失了
    在这里插入图片描述

  • 下采样丢失的像素值图片如下:
    在这里插入图片描述

  • 复原后的图片
    在这里插入图片描述

  • 原图如下:
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity的Button组件进行扩展
  • C++:模板开端
  • Python 全栈系列271 微服务踩坑记
  • 什么是 SMB 服务器以及它如何工作?
  • AI论文精读笔记-Generative Adversarial Nets(GAN)
  • YOLOv5改进 | 模块缝合 | C3 融合RFAConv和CBAM注意力机制 【二次融合 小白必备】
  • GANs-生成对抗网络
  • 第二期: 第二节 , 裸机编程 , gpio
  • 基于python+django+vue的鲜花商城系统
  • kafka mirror maker之实现两个kafka集群之间的数据同步
  • freeRTOS 任务的创建、挂起、恢复
  • 使用PyTorch进行图像风格迁移:基于VGG19实现
  • 多目标优化算法求解LSMOP(Large-Scale Multi-Objective Optimization Problem)测试集,MATLAB代码
  • Windows和Mac命令窗快速打开文件夹
  • vue 项目自适应 配置 px转rem 的插件postcss-pxtorem
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [译] React v16.8: 含有Hooks的版本
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Travix是如何部署应用程序到Kubernetes上的
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 用简单代码看卷积组块发展
  • 最简单的无缝轮播
  • ionic入门之数据绑定显示-1
  • ​iOS安全加固方法及实现
  • #if和#ifdef区别
  • #Java第九次作业--输入输出流和文件操作
  • (10)ATF MMU转换表
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)pulsar安装在独立的docker中,python测试
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)c52学习之旅-流水LED灯
  • (四)js前端开发中设计模式之工厂方法模式
  • (正则)提取页面里的img标签
  • (转)Linux下编译安装log4cxx
  • (转)为C# Windows服务添加安装程序
  • *** 2003
  • ***利用Ms05002溢出找“肉鸡
  • .java 9 找不到符号_java找不到符号
  • .md即markdown文件的基本常用编写语法
  • .NET/C# 的字符串暂存池
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net生成的类,跨工程调用显示注释
  • .net网站发布-允许更新此预编译站点
  • .Net小白的大学四年,内含面经
  • /etc/fstab和/etc/mtab的区别
  • @synthesize和@dynamic分别有什么作用?
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]