首页 > 其他分享 >机器学习:opencv--图像金字塔

机器学习:opencv--图像金字塔

时间:2024-09-11 22:51:45浏览次数:14  
标签:采样 -- cv2 face down opencv 图像 金字塔

目录

一、图像金字塔

1.图像金字塔是什么?

2.有哪些常见类型

3.金字塔的构建过程

4.图像金字塔的作用

二、图像金字塔中的操作

1.向下采样

2.向上采样

3.注意--无法复原

三、代码实现

1.高斯金字塔向下采样

2.高斯金字塔向上采样

3.无法复原

4.拉普拉斯金字塔


一、图像金字塔

1.图像金字塔是什么?

  1. 是由一幅图像的多个不同分辨率的子图构成的图像集合
  2. 是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点。
  3. 图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低分辨率近似图像

 

2.有哪些常见类型?

<1> 高斯金字塔

        通过逐层应用高斯滤波下采样,生成不同分辨率的图像以表示多尺度信息。        

<2> 拉普拉斯金字塔

        拉普拉斯金字塔是由高斯金字塔向下采样丢失信息构成

 

3.金字塔的构建过程

<1> 高斯金字塔

  1. 初始图像:导入原始图像。
  2. 高斯滤波:对图像应用高斯滤波。
  3. 下采样:将图像尺寸减半,生成下一级图像。
  4. 重复:重复高斯滤波和下采样步骤,直到达到所需的层数或图像尺寸过小。

<2> 拉普拉斯金字塔

  1. 生成高斯金字塔:先创建高斯金字塔。
  2. 上采样:将高斯金字塔的每层图像上采样到前一层的尺寸。
  3. 计算细节:用前一层的高斯图像减去上采样后的图像,得到拉普拉斯细节图像。
  4. 最后一层:拉普拉斯金字塔的最后一层即为高斯金字塔的最后一层。

 

4.图像金字塔的作用

<1> 特征点提取

  • 图像金字塔允许在不同尺度下检测特征点,提高特征点检测的尺度不变性

<2> 模板匹配

  • 图像金字塔帮助处理不同尺度的模板匹配问题,提高匹配的准确性

<3> 光流跟踪

  • 通过在不同尺度层中估计光流,图像金字塔帮助处理大范围的运动,提高光流估计的精度

 

二、图像金字塔中的操作

1.向下采样

        向金字塔顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下,每向上移动一级,图像的宽和高都降低为原来的1/2

<1> 步骤

  1. 高斯滤波(减少高频噪声)         
  2. 删除其偶数行和偶数列(所以所用图像一般高宽都是偶数)

<2> 图示

 

2.向上采样

        通常将图像的宽度和高度都变为原来的2倍。这意味着,向上采样的结果图像的大小是原始图像的4倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为插值

<1> 步骤

  1. 插值         
  2. 高斯滤波(减少由于插值产生的人工边界和不自然的过渡)

<2> 图示

 

3.注意--无法复原

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

 

三、代码实现

1.高斯金字塔向下采样

  • 使用cv2.pyrDown()函数实现向下采样
import cv2  # opencv读取的格式是BGR2

# 高斯金字塔操作中的向下采样
# 下采样 是一种减小图像尺寸的方法,它通常涉及到降低图像的分辨率,即减少图像中像素的数量,从而使图像看起来更小
# 上釆样 是一种增大图像尺寸的方法,它通过插值和滤波技术来恢复图像的分辨率和细节,通常用于图像放大或者与下采样后的图像进行比较。
# resize函数 是一种通用的图像尺寸调整方法,它可以按照指定的目标尺寸来缩放图像,不涉及金字塔结构或者特定的滤波操作。
# dst = cv2.pyrDown(src [,dst, dstsize [, borderType] ])
# dst:目标图像
# src:原始图像
# dstsize:目标图像的大小
face = cv2.imread('face.jpg')  # G0
face = cv2.resize(face, (400, 400))
cv2.imshow('face', face)
cv2.waitKey(0)

# 向下采样
face_down_1 = cv2.pyrDown(face)  # 下采样G1
cv2.imshow('face_down_1', face_down_1)
cv2.waitKey(0)
face_down_2 = cv2.pyrDown(face_down_1)  # G2
cv2.imshow('face_down_2', face_down_2)
cv2.waitKey(0)

输出:

  • 可以看出来图像的宽高逐层减半

 

2.高斯金字塔向上采样

  • 使用cv2.pyrUp()函数实现向上采样
import cv2  # opencv读取的格式是BGR2

# 高斯金字塔操作中的向上采样
# dst = cv2.pyrUp(src [,dst, dstsize [, borderType] ])
# dst:目标图像
# #src:原始图像
# dstsize:目标图像的大小
face = cv2.imread('face.jpg')  # G0
face = cv2.resize(face, (400, 400))
cv2.imshow('face', face)
cv2.waitKey(0)
face_up_1 = cv2.pyrUp(face)
cv2.imshow('face_up_1', face_up_1)  # G1
cv2.waitKey(0)
face_up_2 = cv2.pyrUp(face_up_1)
cv2.imshow('face_up_2', face_up_2)  # G2
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

  • 可以看到向上采样之后的图像宽高逐层变成2倍

 

3.无法复原

# 对下采样后图像进行上采样,图像变模糊,无法复原
# 对上采样后图像进行下采样,图像变模糊,无法复原
face_down_1_up = cv2.pyrUp(face_down_1)  # 下采样G1
face_up_1_down = cv2.pyrDown(face_up_1)  # 上采样G1
cv2.imshow('yuantu', face)
cv2.imshow('down_1_up', face_down_1_up)
cv2.imshow('up_1_down', face_up_1_down)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

  • 可以看到两种操作之后的图像大小与原图一样
  • 但是清晰度却比原图差了不少

 

4.拉普拉斯金字塔

# 拉普拉斯金字塔
face_down_2_up = cv2.pyrUp(face_down_2) 
L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_up
fuyuan = face_down_1_up + L0
cv2.imshow('L0', L0)
cv2.imshow('L1', L1)
cv2.imshow('fuyuan', fuyuan)
cv2.waitKey(0)

输出:

  • 可以看到拉普拉斯金字塔的复原效果还是不错的
  • 我这里使用的是彩色图片,所以拉普拉斯图像是彩色的
  • 如果使用的图片是灰度图,那么就是黑白的

标签:采样,--,cv2,face,down,opencv,图像,金字塔
From: https://blog.csdn.net/weixin_65047977/article/details/142151119

相关文章

  • c++primer第五章循环和关系表达式学习笔记
    for循环简单for循环#include<iostream>usingnamespacestd;intmain(){//5.1inti;for(i=0;i<5;i++)cout<<"C++knowsloops.\n";cout<<"C++knowswhentostop.\n";return0;}for循环组成部分#......
  • 【万字文档+PPT+源码】基于springboot+vue的航空票务管理系统-可用于毕设-课程设计-练
    博主简介:......
  • C++primer 第十章对象和类学习笔记
    OPP特性:抽象封装和数据隐藏多态继承代码的可重用性过程性和面向对象的编程从用户的角度考虑对象抽象和类基本类型完成的工作:决定数据对象需要的内存单元决定如何解释内存中的位决定可使用数据对象执行的操作或方法 c++中的类类规范类声明:以数据成员的方式描述数......
  • 基于STM32C8T6的CubeMX:HAL库点亮LED
    三个可能的问题和解决方法:大家完成之后回来看,每一种改错误都是一种成长,不要畏惧,要快乐,积极面对,要耐心对待STMCuBeMX新建项目的两种匪夷所思的问题https://mp.csdn.net/mp_blog/creation/editor/142151511STMCubeMX文件下载后会出现其他项目无法下载的问题https://mp.csdn.ne......
  • 【重学 MySQL】二十五、等值连接vs非等值连接、自连接vs非自连接
    【重学MySQL】二十五、等值连接vs非等值连接、自连接vs非自连接等值连接(Equijoin)vs非等值连接(Non-equijoin)等值连接(Equijoin)非等值连接(Non-equijoin)自连接(Self-join)vs非自连接(Non-self-join)自连接(Self-join)非自连接(Non-self-join)总结在MySQL中,连接(J......
  • 【重学 MySQL】二十四、笛卡尔积的错误和正确的多表查询
    【重学MySQL】二十四、笛卡尔积的错误和正确的多表查询笛卡尔积的理解和错误笛卡尔积的理解定义例子在数据库中的应用总结笛卡尔积的错误正确的多表查询使用INNERJOIN使用WHERE子句(隐式内连接)总结在数据库查询中,特别是涉及到多表查询时,理解笛卡尔......
  • 五、树和二叉树
    文章目录一、树的引入二、树的术语三、二叉树3.1二叉树的概念3.2二叉树的遍历3.3二叉树-查找指定结点3.3二叉树-删除结点3.4顺序存储二叉树3.5线索化二叉树3.5.1线索化二叉树应用案例3.5.2遍历线索化二叉树3.6二叉树的应用3.6.1堆排序(见`2022.4.5三、排序算......
  • 五、STM32标准库硬件SPI驱动OLED(基于SSD1106)
    1、驱动芯片及MCU介绍        SSD1106是一款常用于嵌入式设备中的小型屏幕OLED(有机发光二极管)显示器驱动芯片,被广泛应用于各种嵌入式设备中,本示例程序基于SSD1106驱动芯片的OLED显示屏。        本次示例采用STM32F103系列MCU,使用标准库硬件SPI驱动OLED......