• 跟我学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所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。

    希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵!

    感恩能与大家在华为云遇见!

    参考文献:

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    常用类面试题总结(一)
    VMware 三种网络连接模式
    write tcp 127.0.0.1:53226->127.0.0.1:6379: use of closed network connection
    POJ2676数独游戏题解
    全网最牛的pytest从0到1全套教程-pytest(2)-pytest-html测试报告
    推荐一个 Web 端自动化神器 - Automa
    UDS入门至精通系列Service 3D
    Linux设置yum源为阿里云镜像源
    主数据操作文档
    《真象还原》读书笔记——第八章 内存管理系统(字符串操作、位图定义与实现)
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/16707705.html