OpenCV(8):快速了解图像金字塔的概念以及代码实践

引言:

当我们处理数字图像时,通常需要考虑不同尺度下的图像特征,如图像细节、形状和纹理等。

尺度是指图像中所包含的目标的大小。当我们使用相同的算法分析不同尺度的图像时,可能会出现分析结果不尽相同的情况。因此,在进行图像处理和分析时,通常需要考虑不同尺度下的图像特征。

有些人用过Arcgis,在使用Arcgis进行栅格图像处理的时候也会碰到是否构建图像金字塔这个选项。那么图像金字塔究竟是什么呢?

在图像金字塔中,通过对原始图像进行多次降采样或升采样操作,生成一系列具有不同尺度的图像,其中每个尺度都对应着一张缩小或放大了的图像。这些图像被看作是在不同尺度下对原始图像的分解,因此可以被用来分析不同尺度下的图像特征。

在计算机视觉领域中,尺度对于图像处理和分析非常关键。例如,在目标检测和物体识别等任务中,目标的大小和规模是一个重要的因素,因此需要在不同尺度下分析图像特征,以获取更加准确的分析结果。

在ArcGIS中,图像金字塔是一种用于改善大型栅格数据集处理效率的技术。构建图像金字塔就是将原始的栅格数据切割成多个图像层级,每个层级都是原始数据分辨率的不同比例,通常比原始数据分辨率低。栅格数据就是平时我们说的图像数据,由像素矩阵构成,不同的是栅格数据的像素点的值往往包含地理数据,例如高程数据或者光谱数据等地理数据。

总之,构建图像金字塔是一种重要的栅格数据预处理技术,能够提高数据处理效率和数据共享能力。

图像金字塔的理论基础:

图像金字塔主要涉及两个概念,一个是向上采样,一个是向下采样。

 上图是一张图像金字塔,它由不同尺度的图像构成。

 通俗易懂地来说,将图片放大就是向上采样,将图片尺寸缩小就是向下采样。假设原本图片是16*16像素的,那么向上采样一次就变成32*32,向下采样一次就变成8*8像素的,每次放大或缩小一半。准确来讲图像金字塔应该是一个倒金字塔。

图像金字塔的作用:

图像金字塔主要用于以下几个方面:

  1. 特征提取:对于一些需要对图像进行特征提取的算法,如目标检测、人脸识别、图像匹配等,使用图像金字塔可以加速特征提取过程。

  2. 尺度空间分析:在图像处理过程中,往往需要考虑不同尺度下的图像特征。通过使用图像金字塔,可以将图像中的细节信息逐渐放大,同时保留图像的整体结构,从而更好地分析图像特征。

  3. 图像配准:在进行图像配准的时候,需要考虑图像之间的尺度差异和旋转角度等问题。通过使用图像金字塔,可以将不同尺度的图像进行调整和匹配,从而达到更好的配准效果。

  4. 图像压缩:在进行图像压缩时,为了保证压缩后的图像质量,往往需要对原始图像进行预处理。通过使用图像金字塔,可以将图像中的细节信息逐渐简化,同时保留图像的主要结构,从而实现更好的压缩效果。

高斯金字塔:

在图像处理领域,常见的图像金字塔有以下三种:

  1. 高斯金字塔(Gaussian Pyramid):高斯金字塔是一种最常用的图像金字塔,它通过对原始图像进行多次高斯模糊和降采样操作,得到一系列缩小的图像。在降采样的过程中,图像的尺寸减半,同时每个像素的值也被计算为其周围像素的平均值。

  2. 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是一种基于高斯金字塔的图像分解方式,通常用于图像增强和压缩等应用中。它通过在高斯金字塔相邻层之间取差分来生成,每个层级的图像表示当前尺度下的高频特征。

  3. 小波金字塔(Wavelet Pyramid):小波金字塔是一种结合了高斯金字塔和离散小波变换的多尺度分析方法。它通过对原始图像进行多层小波变换,得到一个由低频成分和高频成分构成的多分辨率表示,其中低频成分代表图像的粗略信息,高频成分代表图像中的细节信息。

本章主要介绍最容易理解的高斯金字塔:

高斯金字塔向上采样

高斯金字塔向上采样的方式是

(1)先将原始图像的size扩大一倍,扩大的部分用0进行填充。

(2)对于高斯金字塔而言,他是利用高斯函数的卷积核核对扩充后的矩阵逐项元卷积

 在OpenCV中,高斯金字塔向上采样的方法为cv2.pyrUp()

import cv2
#import numpy as np
import matplotlib.pyplot as plt

# def cv_show(title,img):
#     cv2.imshow(title,img)
#     cv2.waitKey(0) 
#     cv2.destroyAllWindows()
#     return

img = cv2.imread('bird.jpg')

up = cv2.pyrUp(img)
plt.subplot(1,2,1),plt.imshow(img),plt.title('origin')
plt.subplot(1,2,2),plt.imshow(up),plt.title('up')

运行结果: 

 虽然看上去两个图像一样大,但是看一下其横轴和纵轴的标注发现其实已经放大了一倍。这就是向上采样。

高斯金字塔向下采样:

向下采样是将图像缩小的采样方式,首先利用高斯卷积核重算图像,接着去除新图像中的偶数行和偶数列来缩小图像。

代码实现:

import cv2
# import numpy as np
# import matplotlib.pyplot as plt

#写一个方法用于展示图像,展示后按任意键继续下行代码
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('bird.jpg')

down = cv2.pyrDown(img)

cv_show('img',img)
cv_show('down',down)

和resize的区别:

很多人在看这一张的时候都会有疑问,前文讲过了图像的resize方法可以改变图像的尺寸,为什么还要多此一举去构建图像金字塔?

图像金字塔和resize都可以用于图像的缩放处理,但它们的实现方式、目的和应用场景有所不同

从实现方式来说,图像金字塔是通过多次降采样或上采样得到一系列具有不同分辨率的图像,以获取不同尺度下的图像特征。而resize则是通过对原始图像进行插值或卷积操作来直接改变图像的大小。

而从目的出发,图像金字塔常常用于多尺度图像处理、物体检测等任务中,以提取不同尺度下的图像特征。而resize通常用于将图像缩放到适合特定应用的大小,如调整图像大小以适应屏幕大小、网页布局等。

对于其应用场景,图像金字塔可以用于多种图像处理任务,如图像去噪、全景拼接、匹配等。而resize主要用于简单的图像缩放处理,如缩放图像大小以适应显示器分辨率、裁剪图像等。

总之,图像金字塔和resize都是用于图像缩放处理的方法,但它们的实现方式、目的和应用场景不同。对于不同的任务,需要选择合适的方法以达到更好的处理效果。

后话:

本文主讲对于图像金字塔的理解,以及举了一个高斯图像金字塔的例子,实际上图像金字塔还有很多,都是用于对图像进行缩放的,但是他们计算的原理各不相同。

高斯金字塔是利用卷积进行计算的,同样的有拉普拉斯金字塔(Laplacian Pyramid),差分金字塔(Difference Pyramid)。还有用插值进行计算的插值金字塔(Interpolation Pyramid)小波金字塔(Wavelet Pyramid)等等,计算方法太多了,包括之后我会讲傅里叶变换,他也可以用于构建图像金字塔,这些金字塔应用场景也各不相同。有兴趣可以了解一下。

猜你喜欢

转载自blog.csdn.net/m0_50317149/article/details/129996609