Python图像处理之图像金字塔详解
作者:Eastmount 发布时间:2022-03-11 10:35:04
一.图像金字塔原理
上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数。
图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。如图10-1所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低[1-2]。
生成图像金字塔主要包括两种方式:
向下取样
向上取样
在图中,将图像G0转换为G1、G2、G3,图像分辨率不断降低的过程称为向下取样;将G3转换为G2、G1、G0,图像分辨率不断增大的过程称为向上取样。
二.图像向上取样
在图像向上取样是由小图像不断放图像的过程。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。如图10-2所示,它在原始像素45、123、89、149之间各新增了一行和一列值为0的像素。
在OpenCV中,向上取样使用的函数为pyrUp(),其原型如下所示:
dst = pyrUp(src[, dst[, dstsize[, borderType]]])
– src表示输入图像,
– dst表示输出图像,和输入图像具有一样的尺寸和类型
– dstsize表示输出图像的大小,默认值为Size()
– borderType表示像素外推方法,详见cv::bordertypes
向上取样的代码如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena-small.png')
#图像向上取样
r = cv2.pyrUp(img)
#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrUp', r)
cv2.waitKey()
cv2.destroyAllWindows()
输出结果如图10-3所示,它将原始图像扩大为原图像的四倍。
多次向上取样的代码如下。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena-small.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()
输出结果如图10-4所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。
三.图像向下取样
在图像向下取样中,使用最多的是高斯金字塔。它将对图像Gi进行高斯核卷积,并删除原图中所有的偶数行和列,最终缩小图像。其中,高斯核卷积运算就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。常见的3×3和5×5高斯核如下:
高斯核卷积让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如图10-5所示,其中心位置权重最高为0.4。
在OpenCV中,向下取样使用的函数为pyrDown(),其原型如下所示:
dst = pyrDown(src[, dst[, dstsize[, borderType]]])
– src表示输入图像,
– dst表示输出图像,和输入图像具有一样的尺寸和类型
– dstsize表示输出图像的大小,默认值为Size()
– borderType表示像素外推方法,详见cv::bordertypes
向下取样的代码如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
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()
输出结果如图10-6所示,它将原始图像压缩成原图的四分之一。
多次向下取样的代码如下。
# -*- coding: utf-8 -*-
# By:Eastmount
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()
输出结果如图10-7所示,每次向下取样均为上次的四分之一,并且图像的清晰度会降低。
四.总结
本文主要讲解图像金字塔处理,包括图像向上取样和向下取样。需要注意,向上取样放大后的图像比原始图像要模糊,而每次向下取样会删除偶数行和列,它会不停地丢失图像的信息。此外,向上采样和向下采样不是互逆的操作,经过两种操作后,是无法恢复原始图像的。
来源:https://blog.csdn.net/Eastmount/article/details/122868296
猜你喜欢
- N久没有开始写博客了,总觉得要随便记点东西,岁月蹉跎,曾经搞得一些东西、技术、工具,说丢也就丢了,点点滴滴还是要记录一下吧。。。在windo
- 运行代码框<SCRIPT>var oPopup = window.createPopup();var popTop=50;fun
- 框架介绍在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net、NLog、CommonLogging使用起
- 一、使用ImageFolder读取数据集时忽略特定文件如果事先知道需要忽略哪些文件,当然直接从数据集里删除就行了。但如果需要在程序运行时动态
- 这篇文章主要介绍了python文字和unicode/ascll相互转换函数及简单加密解密实现代码,下面我们来了解一下。import reim
- 1.什么是接口接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接。为什
- ResNet沿用VGG完整的KaTeX parse error: Undefined control sequence: \time at
- 前言现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息。可是招聘信息有一些是错综复杂的。而且不能把全部的信息全部罗
- google 的设计原则中文1.易用性-聚焦在人,方便他们的生活,工作,梦想。2.速度-分秒必争3.简单-简单而强有力4.关联性- 对初学者
- 使用环境:Win10 x64 Python:3.6.4 SqlServer:2008R2 因为
- 现在大家学习python掌握内容了解太多太多,但是最重要的不是掌握了解算法的使用,而是了解算法原理远比使用算法命令更重要,现在大家了解算法应
- 导言如我们在之前的教程里讨论的那样,分页可以通过两种方法来实现:1.默认分页– 你仅仅只用选中data Web control的 智能标签的
- #HelloWorld是文件名称,Hello是类from HelloWorld import Hello调用,Hello类的方法:>&
- pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:class torch.nn.Conv2d(in_channels, o
- 我们在使用pycharm的时候总是很喜欢其强大的代码提示功能,只需ctrl+左键就可以查看源码,"."也能显示所含的函数
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 图像轮廓概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大.
- %有哪几种含义?查找手册翻看《The Python Libary Reference》python库指南中附录index部分(P1899):
- 有些朋友看到这个标题可能会有疑问,难道在视图中使用*符号还有何要注意的地方吗?对于这个问题,我们先不必回答,先看一下例子吧。 我这里,使用的
- 前言每一个孩子都像星空中的一颗星星,散发着自己所特有的光芒照亮着整个夜空。今天就带大家用27行Python代码绘制一幅满天星吧。全局设置在绘
- python中zip函数返回一个以元组为元素的列表,其中第 i 个元组包含每个参数序列的第 i 个元素。返回的列表长度被截断为最短的参数序列