Python OpenCV图像金字塔:向上与向下采样详解
本文深入解析Python OpenCV中的图像金字塔技术,详细阐述向上采样(pyrUp)与向下采样(pyrDown)的原理及实现。通过高斯核卷积与偶数行列删除机制,展示图像分辨率的缩放过程。文章提供完整代码示例,分析多次采样对图像清晰度的影响,并指出两种操作非互逆的特性,适用于图像分割与压缩场景。
一、图像金字塔原理
前文已介绍图像采样处理可缩小图像尺寸,本文将补充图像金字塔相关知识,重点介绍专门用于图像向上和向下采样的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所示,每次向下取样的结果均为上一次图像的四分之一,且图像的清晰度会逐渐降低。

四、总结
本文主要讲解图像金字塔处理技术,涵盖图像向上取样和向下取样两个核心部分。需要特别注意,向上取样放大后的图像相比原始图像更为模糊,而每次向下取样会删除偶数行和列,导致图像信息不断丢失。此外,向上采样和向下采样并非互逆操作,经过这两种操作后,无法完全恢复原始图像。
以上就是Python图像处理之图像金字塔详解的详细内容,更多关于Python图像金字塔的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









