Python图像处理之图像金字塔的向上和向下取样

 更新时间:2022年09月23日 09:34:24   作者:wadfdhsajd  
图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。本文主要介绍了图像金字塔的图像向下取样和向上取样,感兴趣的可以了解一下

一.图像金字塔

图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。如图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所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。

到此这篇关于Python图像处理之图像金字塔的向上和向下取样的文章就介绍到这了,更多相关Python图像金字塔内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python如何以表格形式打印输出的方法示例

    python如何以表格形式打印输出的方法示例

    这篇文章主要介绍了python如何以表格形式打印输出的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • python实现查找所有程序的安装信息

    python实现查找所有程序的安装信息

    本文给大家分享的是使用python通过注册表信息实现快速查找windows应用程序的安装信息的方法和代码示例,有需要的小伙伴可以参考下
    2020-02-02
  • Python面向对象魔法方法和单例模块代码实例

    Python面向对象魔法方法和单例模块代码实例

    这篇文章主要介绍了Python面向对象魔法方法和单例模块代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 利用Python进行微服务架构的监控与日志分析

    利用Python进行微服务架构的监控与日志分析

    Python作为一种强大的编程语言,提供了丰富的工具和库,可以帮助我们实现对微服务架构的监控和日志分析,本文将介绍如何利用Python编写监控脚本和日志分析程序,以便于更好地管理和维护微服务系统
    2024-03-03
  • Python判断变量是否已经定义的方法

    Python判断变量是否已经定义的方法

    这篇文章主要介绍了Python判断变量是否已经定义的方法,非常实用的方法,需要的朋友可以参考下
    2014-08-08
  • Python深入学习之对象的属性

    Python深入学习之对象的属性

    这篇文章主要介绍了Python深入学习之对象的属性,本文从较深的层次讲解对象属性的内部运行方式,需要的朋友可以参考下
    2014-08-08
  • 一文带你了解Python 四种常见基础爬虫方法介绍

    一文带你了解Python 四种常见基础爬虫方法介绍

    这篇文章主要介绍了一文带你了解Python 四种常见基础爬虫方法介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python使用zip合并相邻列表项的方法示例

    Python使用zip合并相邻列表项的方法示例

    这篇文章主要介绍了Python使用zip合并相邻列表项的方法,涉及zip、iter函数合并相邻列表项、切片等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • 在PyCharm中接入deepseek的API的各种方法

    在PyCharm中接入deepseek的API的各种方法

    本文详细介绍了在PyCharm中接入DeepSeek API的步骤,包括获取API密钥、安装库、编写代码、运行和调试、处理响应以及可选的封装为函数或类,此外,还提供了替代的调用方法,感兴趣的小伙伴跟着小编一起来看看吧
    2025-02-02
  • 解决安装pytorch因网速问题失败的情况

    解决安装pytorch因网速问题失败的情况

    这篇文章主要介绍了解决安装pytorch因网速问题失败的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论