跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样
摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数。
本文分享自华为云社区《[Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样》,作者:eastmount。
一.图像金字塔
图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。如图6-11所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低。

生成图像金字塔主要包括两种方式——向下取样、向上取样。在图6-11中,将图像G0转换为G1、G2、G3,图像分辨率不断降低的过程称为向下取样;将G3转换为G2、G1、G0,图像分辨率不断增大的过程称为向上取样。
二.图像向下取样
在图像向下取样中,使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积,并删除原图中所有的偶数行和列,最终缩小图像。其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。常见的3×3和5×5高斯核如下:


高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如图6-12所示,其中心位置权重最高为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
实现代码如下所示:
# -*- 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()
输出结果如图6-13所示,它将原始图像压缩成原图的四分之一。

多次向下取样的代码如下:
# -*- 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,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。如图6-15所示,它在原始像素45、123、89、149之间各新增了一行和一列值为0的像素。

在OpenCV中,向上取样使用的函数为pyrUp(),其原型如下所示:
dst = pyrUp(src[, dst[, dstsize[, borderType]]])
- src表示输入图像,
- dst表示输出图像,和输入图像具有一样的尺寸和类型
- dstsize表示输出图像的大小,默认值为Size()
- borderType表示像素外推方法,详见cv::bordertypes
实现代码如下所示:
# -*- 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()
输出结果如图6-16所示,它将原始图像扩大为原图像的四倍。

多次向上取样的代码如下:
# -*- 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()
输出结果如图6-17所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。

希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵!
感恩能与大家在华为云遇见!
参考文献:
- eastmount - [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
- 《数字图像处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
- 《数字图像处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
- 《OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015,北京.
跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样的更多相关文章
- 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...
- 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现
摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (5):图像的几何变换
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (6):图像的阈值处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
随机推荐
- ShardingSphere-proxy-5.0.0企业级分库分表、读写分离、负载均衡、雪花算法、取模算法整合(八)
一.简要说明 以下配置实现了: 1.分库分表 2.每一个分库的读写分离 3.读库负载均衡算法 4.雪花算法,生成唯一id 5.字段取模 二.配置项 # # Licensed to the Apache ...
- 学习C4C的视频分享
- 【UR #2】猪猪侠再战括号序列 题解
题目链接 前言 是的没脑子选手只会做签到题. 思路分析 一开始把题目看成反转括号的状态,直接浪费 \(40\ mins\) . 我们考虑把不确定的"正确括号"转换成一个固定的括号序 ...
- resultMap自定义映射(多对一)
自定义resultMap,处理复杂的表关系,实现高级结果集映射 1) id :用于完成主键值的映射 2) result :用于完成普通列的映射 3) association :一个复杂的类型关联;许多 ...
- html和css的常用语法代码详解
前端html html 超文本标记语言.文本,图片,视频,音频. 网页基本信息 一个基础的网页具有的一些信息. <!-- 这是注释--> <!--!DOCTYPE网页约束规范--&g ...
- HBase学习(一) 基本概念和安装基本命令
HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...
- 分享一个基于Abp Vnext开发的API网关项目
这个项目起源于去年公司相要尝试用微服务构建项目,在网关的技术选型中,我们原本确认了ApiSix 网关,如果需要写网关插件需要基于Lua脚本去写,我和另外一个同事当时基于这个写了一个简单的插件,但是开发 ...
- 发布Android库至MavenCentral详解
Sonatype 账号 MavenCentral 和 Sonatype 的关系 库平台 运营商 管理后台 MavenCentral Sonatype oss.sonatype.org 因此我们要发布L ...
- 利用 SonarScanner 静态扫描 Rainbond 上的 Maven 项目
对代码进行静态扫描是一种非常常见的代码质量保证手段,这种扫描不仅仅可以检查到代码中的缺陷,应用各种业界最佳实践,也可以检查出安全方面的漏洞,给予项目代码全方位的提升.在各种代码扫描方案之中,Sonar ...
- 就在明天,Apache DolphinScheduler Meetup 2021 如约而至!
点击上方 蓝字关注我们 社区的小伙伴们,Apache DolphinScheduler Meetup 2021 如约而至,就在明天,等你来玩! 在此次 Meetup 线上直播中,不仅将有来自 Bigo ...