Python图像处理:图像金字塔的向上与向下取样详解

Oliver
Oliver
发布时间:2026-10-16 | 5人浏览过
原创

本文深入解析Python OpenCV中的图像金字塔技术,重点讲解向下取样(pyrDown)与向上取样(pyrUp)的原理及实现。通过高斯核卷积与降采样算法,阐述图像分辨率降低导致的信息丢失机制;同时说明放大过程中零填充与卷积重建对清晰度的影响。附带完整代码示例,展示单次及多次取样的具体效果与参数配置。

一.图像金字塔

图像金字塔是由一组具有不同分辨率的子图构成的集合,属于图像多尺度表达的一种方法。它通过多分辨率视角来解析图像结构,主要应用于图像分割或压缩场景。一幅图像的金字塔呈现为一系列按金字塔形状排列、分辨率逐级降低的图像,且均源自同一张原始图片。如图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 相关产品和应用

全部下载

专题列表