《OpenCV计算机视觉》—— 图像金字塔
文章目录
- 什么是图像金字塔?
- 一、定义与基本原理
- 二、主要类型
- 三、构建过程
- 四、应用领域
- 图像金字塔中的下采样和上采样
- 一、下采样(Downsampling)
- 二、上采样(Upsampling)
- 三、总结
- 代码实现
什么是图像金字塔?
一、定义与基本原理
图像金字塔是一种将图像以多分辨率进行表达的结构,通常表现为一系列分辨率逐渐降低的图像集合,这些图像按照金字塔形状(自下而上)排列,因此得名。每一层图像都是对下一层图像进行下采样(或上采样)得到的,层级越高,图像越小,分辨率越低。
二、主要类型
-
常见的图像金字塔有两种类型:
- 高斯金字塔(Gaussian Pyramid):高斯金字塔通过不断地对图像进行高斯滤波和下采样操作来构建。每一层图像都是对下一层图像进行高斯滤波后,再以一定的步长(通常是2)进行抽样得到的。高斯滤波的目的是为了去除图像中的高频信息,保留低频信息,从而在不同尺度上平滑图像。
- 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是在高斯金字塔的基础上构建的。它通过对高斯金字塔的每一层图像进行上采样(与降采样相反的操作),然后使用原高斯金字塔的对应层图像减去上采样后的图像,得到每一层的拉普拉斯图像。拉普拉斯图像包含了高斯金字塔相邻两层之间的差异信息,即图像的高频细节。
三、构建过程
-
以高斯金字塔为例,其构建过程通常包括以下几个步骤:
- 读取原始图像:首先,需要读取待处理的原始图像。
- 高斯滤波:对原始图像进行高斯滤波,以去除图像中的高频噪声和细节。
- 下采样:对滤波后的图像进行降采样操作,即按照一定的步长(如2)选取图像中的像素点,从而得到分辨率较低的图像。
- 重复操作:将上一步得到的低分辨率图像作为新的输入图像,重复进行高斯滤波和降采样操作,直到达到所需的金字塔层数或满足某个终止条件。
-
拉普拉斯金字塔的构建过程则需要在高斯金字塔的基础上,对每一层图像进行上采样和求差操作。
- 可以理解为拉普拉斯金字塔是由高斯金字塔向下采样时丢失的信息构成的
-
可以结合下图来理解:
四、应用领域
-
图像金字塔在图像处理中有着广泛的应用,主要包括以下几个方面:
- 图像压缩:利用图像金字塔可以对图像进行多尺度表达,从而在压缩过程中保留图像的重要信息,同时去除冗余信息,实现高效的图像压缩。
- 图像融合:在图像融合过程中,可以利用图像金字塔将不同分辨率的图像进行融合,从而得到更加清晰、全面的图像信息。
- 图像分割:在图像分割任务中,可以利用图像金字塔对图像进行多尺度分析,从而更加准确地提取出图像中的目标区域。
- 机器视觉:在机器视觉领域,图像金字塔可以用于特征提取、目标识别等任务中,提高算法的鲁棒性和效率。
-
总之,图像金字塔是图像处理中的一种重要技术,它通过多尺度的图像表达方法,为图像处理提供了更加灵活和高效的手段。
图像金字塔中的下采样和上采样
一、下采样(Downsampling)
-
下采样,也称为降采样,是图像金字塔构建过程中的一个重要步骤。它的主要目的是减少图像的分辨率,通常是通过去除图像中的部分数据来实现的。下采样的过程大致可以分为以下两个步骤:
- 滤波:首先,对图像进行滤波处理,以去除图像中的高频成分,减少图像细节,通常使用高斯模糊等方法。
- 子采样:在滤波之后,对图像进行子采样,即按照一定的规则(如每隔一行或一列取一个像素)去除部分像素,从而降低图像的分辨率。
-
在OpenCV中,下采样通常通过 pyrDown() 函数来实现。这个函数会首先对图像进行高斯模糊,然后去除偶数行和列,从而得到分辨率降低的图像。通过多次调用pyrDown()函数,可以构建出完整的图像金字塔。
-
下采样的优点包括降低计算复杂度、去除噪声、减小内存消耗和加速特征检测等。然而,它也会带来信息损失和图像失真的问题。
二、上采样(Upsampling)
-
上采样,也称为放大或插值,是下采样的逆过程,用于增加图像的分辨率。上采样的主要目的是通过某种方式填充图像中的空白区域,从而恢复或提高图像的分辨率。
-
在OpenCV中,上采样通常通过 pyrUp() 函数来实现。这个函数会首先通过插值(如双线性插值或双三次插值)在图像的行列之间插入新的像素值,然后对新生成的图像进行高斯模糊处理,以平滑插值过程中产生的锯齿状边缘。
-
然而,需要注意的是,上采样并不能完全恢复下采样过程中丢失的信息,因此上采样后的图像在细节上可能无法与原始图像完全一致。此外,上采样还可能导致图像模糊和失真。
三、总结
- 向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作是不可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态
代码实现
-
代码如下:
import cv2 """ 下采样 """ MB = cv2.imread('wechat.jpg') # 注意:下采样要求图片的宽高的值必须是偶数,且在第一次下采样后宽高的值任然是偶数 # 这里我们将图片的大小微调一下 MB = cv2.resize(MB, dsize=(1276, 876)) # 第一次下采样 MB_down_1 = cv2.pyrDown(MB) # 第二次下采样 MB_down_2 = cv2.pyrDown(MB_down_1) # 显示图像 cv2.imshow('MB', MB) cv2.imshow('MB_down_1', MB_down_1) cv2.imshow('MB_down_2', MB_down_2) cv2.waitKey(0) """ 上采样 """ # 对下采样后图片进行上采样,图像便模糊,无法复原 MB_down_1_up = cv2.pyrUp(MB_down_1) MB_down_2_up = cv2.pyrUp(MB_down_2) cv2.imshow('MB_down_1_up', MB_down_1_up) cv2.imshow('MB_down_2_up', MB_down_2_up) cv2.waitKey(0) """ 拉普拉斯金字塔 """ # 第一层求差 L0 = MB - MB_down_1_up # 第二层求差 L1 = MB_down_1 - MB_down_2_up # 通过上采样后的结果 + 下采样损失的像素值 来实现复原成原始图像 fuyuan = MB_down_1_up + L0 # 显示图片 cv2.imshow('L0', L0) cv2.imshow('L1', L1) cv2.imshow('fuyuan', fuyuan) cv2.waitKey(0)
-
原图和下采样后的结果图如下:
-
对对下采样后图片进行上采样后的结果图如下:
-
将下采样的图片和将下采样后的图片在进行上采样的图片放在一起对比,如下
-
可以发现上采样后的结果图会比较模糊,这就是因为下采样时一些像素点丢失了
-
下采样丢失的像素值图片如下:
-
复原后的图片
-
原图如下: