Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[Python图像识别] 二十二.图像金字塔之图像向下取样和向上取样

[Python图像识别] 二十二.图像金字塔之图像向下取样和向上取样

作者头像
Eastmount
发布于 2024-01-16 06:45:27
发布于 2024-01-16 06:45:27
36500
代码可运行
举报
运行总次数:0
代码可运行

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。

本文将讲解图像金字塔,包括图像向下采样和图像向上采样。基础性文章,希望对你有所帮助,且看且珍惜!

  • 一.图像金字塔
  • 二.图像向下采样
  • 三.图像向上采样
  • 四.总结

该系列在github所有源代码:

  • https://github.com/eastmountyxz/ ImageProcessing-Python

前文回顾(下面的超链接可以点击喔):

学Python近十年,认识了很多大佬和朋友,感恩。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,同时非常感谢参考文献中的大佬们的文章和分享,共勉。 - https://blog.csdn.net/eastmount


一.图像金字塔

前面讲解的图像采样处理可以降低图像的大小,本小节将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数。

图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。如图1所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低。

生成图像金字塔主要包括两种方式——向下取样、向上取样。在上图中,将图像G0转换为G1、G2、G3,图像分辨率不断降低的过程称为向下取样;将G3转换为G2、G1、G0,图像分辨率不断增大的过程称为向上取样。


二.图像向下取样

在图像向下取样中,使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积,并删除原图中所有的偶数行和列,最终缩小图像。其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。常见的3×3和5×5高斯核如下:

高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如图2所示,其中心位置权重最高为0.4。

显而易见,原始图像Gi具有M×N个像素,进行向下取样之后,所得到的图像Gi+1具有M/2×N/2个像素,只有原图的四分之一。通过对输入的原始图像不停迭代以上步骤就会得到整个金字塔。注意,由于每次向下取样会删除偶数行和列,所以它会不停地丢失图像的信息。

在OpenCV中,向下取样使用的函数为pyrDown(),其原型如下所示:

dst = pyrDown(src[, dst[, dstsize[, borderType]]])

  • src表示输入图像,
  • dst表示输出图像,和输入图像具有一样的尺寸和类型
  • dstsize表示输出图像的大小,默认值为Size()
  • borderType表示像素外推方法,详见cv::bordertypes

实现代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('nv.png')

#图像向下取样
r = cv2.pyrDown(img)

#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrDown', r)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如图所示,它将原始图像压缩成原图的四分之一。

多次向下取样的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('nv.png')

#图像向下取样
r1 = cv2.pyrDown(img)
r2 = cv2.pyrDown(r1)
r3 = cv2.pyrDown(r2)

#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrDown1', r1)
cv2.imshow('PyrDown2', r2)
cv2.imshow('PyrDown3', r3)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如图所示:


三.图像向上取样

在图像向上取样是由小图像不断放图像的过程。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。如图所示,它在原始像素45、123、89、149之间各新增了一行和一列值为0的像素。

在OpenCV中,向上取样使用的函数为pyrUp(),其原型如下所示:

dst = pyrUp(src[, dst[, dstsize[, borderType]]])

  • src表示输入图像,
  • dst表示输出图像,和输入图像具有一样的尺寸和类型
  • dstsize表示输出图像的大小,默认值为Size()
  • borderType表示像素外推方法,详见cv::bordertypes

实现代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('lena.png')

#图像向上取样
r = cv2.pyrUp(img)

#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrUp', r)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如图所示,它将原始图像扩大为原图像的四倍。

多次向上取样的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('lena2.png')

#图像向上取样
r1 = cv2.pyrUp(img)
r2 = cv2.pyrUp(r1)
r3 = cv2.pyrUp(r2)

#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrUp1', r1)
cv2.imshow('PyrUp2', r2)
cv2.imshow('PyrUp3', r3)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如图所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。


四.总结

希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵! 最近继续备考博士,接下来还有两个学校,一方面耐心等待之前的结果;另一方面继续复习,周末女神陪着来书店看书,岁月静好,砥砺前行!在这期间,自己经历了很多酸甜苦辣的事情,希望陌生的你也学会享受生活,共勉。

(By:Eastmount 2024-01-12 夜于贵阳)


参考如下文献:

  • eastmount - [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
  • 《数字图像处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
  • 《数字图像处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
  • 《OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015,北京.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CV学习笔记(十二):图像金字塔
尺度,顾名思义就是说图像的尺寸和分辨率。在我们进行图像处理的时候,会经常对源图像的尺寸进行放大或者缩小的变换,进而转换为我们指定尺寸的目标图像。在对图像进行放大和缩小的变换的这个过程,我们称为尺度调整。
云时之间
2020/03/09
1.2K0
上下采样
算法:图像向上采样后,尺寸变为原来的4倍;向下采样后,尺寸变为原来的1/4,一幅图像在先后经过向下采样和向上采样或者先后经过向上采样和向下采样,所得到的图像尺寸大小和原始图像一致。图像金字塔是同一幅图像不同分辨率的子图集合。
裴来凡
2022/05/28
7820
上下采样
【从零学习OpenCV 4】图像金字塔
构建图像的高斯金字塔是解决尺度不确定性的一种常用方法。高斯金字塔是指通过下采样不断的将图像的尺寸缩小,进而在金字塔中包含多个尺度的图像,高斯金字塔的形式如图3-30所示,一般情况下,高斯金字塔的最底层为图像的原图,每上一层就会通过下采样缩小一次图像的尺寸,通常情况尺寸会缩小为原来的一半,但是如果有特殊需求,缩小的尺寸也可以根据实际情况进行调整。由于每次图像的尺寸都缩小为原来的一半,图像尺缩小的速度非常快,因此常见高斯金字塔的层数为3到6层。OpenCV 4中提供了pyrDown()函数专门用于图像的下采样计算,便于构建图像的高斯金字塔,该函数的函数原型在代码清单3-51中给出。
小白学视觉
2019/12/13
8150
CV学习笔记(十二):图像金字塔
尺度,顾名思义就是说图像的尺寸和分辨率。在我们进行图像处理的时候,会经常对源图像的尺寸进行放大或者缩小的变换,进而转换为我们指定尺寸的目标图像。在对图像进行放大和缩小的变换的这个过程,我们称为尺度调整。
云时之间
2020/03/19
7350
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2022/05/09
6960
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2020/09/17
1.2K0
Python opencv图像处理基础总结(五)  图像金字塔  图像梯度  Canny算法边缘提取
【python-opencv】图像金字塔
通常,我们过去使用的是恒定大小的图像。但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。
西西嘛呦
2020/08/26
1.5K0
【python-opencv】图像金字塔
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
HSV 的色相范围为 [0,179],饱和度范围为 [0,255],值范围为 [0,255]。不同的软件使用不同的规模。
机器视觉CV
2019/07/15
3.1K0
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
Android OpenCV(十三):图像金字塔
参数二:dst,输出下采样后的图像,图像尺寸可以指定,但是数据类型和通道数与src相同,
Vaccae
2021/01/06
1.1K0
Android OpenCV(十三):图像金字塔
构建图像金字塔:探索 OpenCV 的尺度变换技术
在计算机视觉领域,图像金字塔是一种强大的技术,可用于在不同尺度下对图像进行分析和处理。金字塔的概念借鉴了古埃及的金字塔形状,其中每一级都是前一级的缩小版本。本篇博客将深入探讨如何构建图像金字塔,以及如何在实际应用中利用金字塔来解决各种计算机视觉问题。我们将使用 OpenCV 库和 Python 编程语言进行实际演示。
小蓝枣
2023/10/19
5520
构建图像金字塔:探索 OpenCV 的尺度变换技术
【走进OpenCV】图片缩放和图像金字塔
要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。
小白学视觉
2019/10/24
1.1K0
拉普拉斯金字塔
算法:拉普拉斯金字塔是对原图像进行低通滤波和降采样得到一个粗尺度的近似图像,即分解得到的低通近似图像,把这个近似图像经过插值,滤波,再计算它和原图像的插值,就得到分解的带通分量,下一级分解是在得到的低通近似图像上进行,迭代完成多尺度分解。
裴来凡
2022/05/28
5970
拉普拉斯金字塔
高斯金字塔
算法:高斯金字塔是信号的多尺度表示法,亦即将同一信号或图片多次的进行高斯模糊,并且向下取样,方向向上,逐渐丢失图像的信息,藉以产生不同尺度下的多组信号或图片以进行后续的处理。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
裴来凡
2022/05/28
7780
高斯金字塔
"大脑"生长系列(六)
上一讲是如何改变图像的分辨率和对比度,这一讲介绍一个听起来高大上的功能,图像金字塔,个人理解图像金字塔本质上也是图像大小的改变,只是改变的方式和算法有所不同。OpenCV实现了两种图像金字塔的功能,一种高斯金字塔,一种拉普拉斯金字塔。
视界音你而不同
2020/04/10
3610
"大脑"生长系列(六)
OpenCV金字塔图像分辨率重建与融合
图像金字塔是对一张输入图像先模糊再下采样为原来宽高的1/2(宽高缩小一半)、不断重复模糊与下采样的过程就得到了不同分辨率的输出图像,叠加在一起就形成了图像金字塔、所以图像金字塔是图像的空间多分辨率存在形式。这里的模糊是指高斯模糊,所以这个方式生成的金字塔图像又称为高斯金字塔图像。高斯金字塔图像有两个基本操作 reduce 是从原图生成高斯金字塔图像、生成一系列低分辨图像,OpenCV对应的相关API为:
OpenCV学堂
2018/11/06
1.6K0
opencv学习笔记python实现 图像金字塔(高斯金字塔与拉普拉斯金字塔)
使用拉普拉斯金字塔时,图像必须是2^n*2*m 使用拉普拉斯金字塔先要知道高斯金字塔 这两种过程是图片缩小与放大 缩小   reduce =  高斯模糊 + 降采样(pyrDown) 放大    ex
用户2965768
2018/09/29
3.1K0
opencv学习笔记python实现 图像金字塔(高斯金字塔与拉普拉斯金字塔)
OpenCV 图像变换之 —— 拉伸、收缩、扭曲和旋转
图像变换最直接的应用就是改变图像的形状、大小、方向等等,这些在OpenCV 中有部分现成的实现。
为为为什么
2022/08/09
11.3K0
OpenCV 图像变换之 —— 拉伸、收缩、扭曲和旋转
图像动态融合
算法:图像动态融合是以第一张图为主图,保留主图部分颜色信息和边缘信息,以第二张图为融入源,保留融入源部分颜色信息,动态调整融入比例。
裴来凡
2022/05/29
3830
图像动态融合
opencv(4.5.3)-python(十七)--图像金字塔
通常情况下,我们习惯于使用一个恒定大小的图像。但在某些情况下,我们需要处理不同分辨率的(相同)图像。例如,当我们在图像中搜索某个东西时,比如人脸,我们不确定该物体会以何种尺寸出现在所述图像中。在这种情况下,我们需要创建一组具有不同分辨率的相同图像,并在所有这些图像中搜索物体。这些具有不同分辨率的图像集被称为图像金字塔(因为当它们被保存在一个堆栈中,最高分辨率的图像在底部,最低分辨率的图像在顶部,它看起来像一个金字塔)。
用户9875047
2022/12/07
4130
opencv(4.5.3)-python(十七)--图像金字塔
C++ OpenCV图像上采样和降采样
图像金字塔是一种以多分辨率来解释图像的有效但概念简单的结构。应用于图像分割,机器视觉和图像压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
Vaccae
2019/07/24
2K0
相关推荐
CV学习笔记(十二):图像金字塔
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验