本节介绍图像的多分辨率金字塔表示,首先介绍相关的背景知识,包括图像的尺度空间、图像的多分辨率表示等,然后重点介绍图像的金字塔结构表示,包括高斯金字塔和拉普拉斯家金字塔表示。最后,介绍Skimage中所提供的金字塔表示函数的声明和使用。
目录
8.1 背景知识
8.1.1 图像的尺度空间表示
(a)什么是尺度空间
本节讨论什么是图像的尺度空间(Scale Space)。首先要明确一个基本概念,即此处的尺度(Scale)不是指的尺寸(Size),对于图像而言,即有图像分辨率 ≠ 图像尺度。
图像的尺度是指图像内容的粗细程度,尺度的概念是用来模拟观察者距离物体的远近程度。
- 具体来说,观察者距离物体远,看到物体可能只有大概的轮廓;观察者距离物体近,更可能看到物体的细节,比如纹理,表面的粗糙等等。
- 从频域的角度来说,图像的粗细程度代表的频域信息的低频成分和高频成分。 粗质图像代表信息大部分都集中在低频段,主要反映图像的概貌,仅有少量的高频信息。细致图像代表信息成分丰富,高低频段的信息都有。
在数学上,空间(space)是指具有约束条件的集合。而图像的尺度空间是指同一图像的在不同尺度下构成的集合。其中,粗尺度图像是由对应的细尺度图像通过滤波得到。在构建图像尺度空间的过程中,在此文献1与严格的证明,唯一使用的核函数是高斯核,即高斯核是唯一可以产生多尺度空间的核。
综上,图像的尺度空间是一幅图像经过几个不同高斯核后形成的模糊图片的集合,用来模拟人眼看到物体的远近程度以及模糊程度。
如上图,使用具有不同方差值的高斯核对原图进行高斯滤波处理,处理结果图像的分辨率与原图相同,但模糊程度不同,对应着图像尺度不同的。
(b)为什么要引入尺度空间
自然界中的物体呈现出不同的形态,需要不同的尺度来观测,比如,人的身高用“米”测量,而微生物用“微米”测量。
尺度对于图像来说,是一种测度,就像是一种可调节的放大镜。比如,我们在使用相机拍照时,通过调整焦距,可将景物拉近拉远。尺度空间中各尺度图像的模糊程度逐渐变大,模拟了景物由近到远在视网膜成像的过程。
粗尺度图像更能体现物体的轮廓形态,细尺度图像更能体现物体的局部细节特征。在下图中,前面的向日葵看起来比地平线附近的向日葵大10倍。近处小尺度的向日葵,我们能观看到花瓣和花籽等细节信息,而远处的大尺度向日葵,我们只能区分花冠和花籽。
综上,对象的大小(尺度)取决于与相机的距离,在没有先验知识的前提下,视觉系统应准备好以所有可能的尺度“看到”物体,图像应同时在所有尺度级别上进行处理。
所以为什么要讨论尺度空间?因为计算机在进行图像分析时,并不知道图像的真实尺寸大小,需要考虑多尺度以获取感兴趣物体的最佳尺度。同时,在一幅图像的不同尺度下检测出相同的关键点来匹配,即尺度不变性。
8.1.2 图像的多分辨率表示
(a)什么是分辨率
图像的分辨率(Image Resolution)指的是图像在水平和垂直方向的量化程度(离散化),反映了图像能展现的细节程度。图像的分辨率可直观的理解为水平和垂方向上像素点的数量。比如,我们经常提到的高清图像的分辨率是1920*1080,即指的是该图像水平方向有1920个像素点,垂直方向有1080个像素点。
由于量化的过程是模拟信号转变成数字信号的过程,该过程伴有不可逆的信息损失过程。因此,量化级别的越高,表示越接近于原来的模拟信号,但同时所需的数据量也越大。
(b)为什么要引入多分辨率
我们观察图像时,看到的通常是由相似纹理和灰度级连成的区域,它们相结合就形成了物体。如果物体的尺寸较小或对比度较低,那么我们需要以较高的分辨率来研究它们;如果物体的尺寸较大或对比度较高,则以低分辨率进行粗略的观察就已足够。如果较小物体和较大物体(或对比度较低和对比度较高的物体)同时存在,那么以不同分辨率来研究它们将更具优势,这就是多分辨率处理的基本动机。
换言之,图像分辨率越低,伴随的细节就越少。图像的低分辨率级别用于分析较大的结构或图像的整体内容;而高分辨率级别适合于分析物体的细节特性。这种由粗到细的分析策略在模式识别中特别有用。
8.2 图像的金字塔多分辨率表示
金字塔多分辨率分解是图像处理中一种有效多尺度表示方法。类似于人眼视觉系统处理视觉信号,金字塔分解具有多分辨率分析的特性,对信号多分辨率分解时,不同信号空间信号有不同物理意义,使用多分辨率分析在计算时有较好的鲁棒性。
图像金字塔分解方法主要有:
- 高斯金字塔;
- 拉普拉斯金字塔;
- 其他金字塔(FSD金字塔、对比度金字塔、梯度金字塔、小波金字塔、可控金字塔等)。
其中高斯金字塔是各种金字塔分解基础。
8.2.1 高斯金字塔
图像的高斯金字塔(Gaussian pyramid)表示,本质上是一种图像内容的多尺度多分辨率表示,也是唯一一种能提供多尺度表示的金字塔结构。经过高斯金字塔分解后,会得到一系列与原图像相对应的多尺度多分辨率图像。
在此简要介绍图像高斯金字塔的构建方式,尽量多用图示,少用数学公式,更详细的分解过程,可参考相关文献。
构造图像高斯金字塔结构主要用到两种处理,一是高斯平滑滤波,二是下采样。下图所示是一种典型的构造高斯金字塔的流程图。
如图所示,首先将原图像作为最底层的图像 g0(第0层),利用高斯核(比如,用5*5的模板)进行卷积操作,然后对卷积图像进行下采样(去除偶数行和列)得到上一层的图像 g1;重复卷积和下采样操作得到上一层图像,反复迭代,形成一个金字塔形的图像数据结构。如下图所示:
图像经高斯金字塔分解后,会得到一系列不同尺度、不同分辨率的图像,图像分辨率越高,尺度越小;反之,分辨率越低,尺度越大。如下图所示。
8.2.2 拉普拉斯金字塔
拉普拉斯金字塔是在高斯金字塔基础之上构建的。在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。
用高斯金字塔的每一层图像gk,减去其上一层图像gK+1上采样并高斯卷积之后的预测图像(或称复原图像),得到一系列的差值图像lk,即为拉普拉斯金字塔的分解图像。
下图所示为拉普拉斯金字塔的分解结果,由图可见,拉普拉斯金字塔是高斯金字塔的差分图像,保存了高斯金字塔丢失的高频(对应于图像的细节)信息。
拉普拉斯金字塔还可以用于精确地还原图片信息。从最低分辨率图像上采样,然后逐次加上每个尺度的残差信息,就可以还原到原始的高分辨率图。下图所示为基于高斯金字塔和拉普拉斯金字塔的分解和重构流程图。其中,左侧为分解过程,右侧为重构过程。
8.3 Skimage实现及应用举例
8.3.1 Skimage实现
在Skimage中,使用四个函数实现图像的金字塔和拉普拉斯金字塔表示。它们都被划归在Skimage.transform子库中,函数名及功能如下:
- skimage.transform.pyramid_reduce:平滑并下采样图像
- skimage.transform.pyramid_expand:上采样并平滑图像
- skimage.transform.pyramid_gaussian:构建高斯金字塔图像
- skimage.transform.pyramid_laplacian:构建拉普拉斯金字塔图像
其中,pyramid_reduce和pyramid_expand是两个基本函数,在构造两类金字塔图像过程中会调用它们。先看这两个函数的声明:
- skimage.transform.pyramid_expand(image, upscale, sigma, order, mode, cval, preserve_range, channel_axis)
- skimage.transform.pyramid_reduce(image, downscale, sigma, order, mode, cval, preserve_range, channel_axis)
部分参数说明:
- image:输入图像。
- downscale/upscale:下采样/上采样率,默认是为2。
- sigma:用于平滑处理的高斯滤波器的sigma值。
- order:下采样/上采样时插值处理所用样条函数的阶数,默认值为1。
- mode:边界延拓方式,可选方式:‘reflect’(默认值), ‘constant’, ‘edge’, ‘symmetric’, ‘wrap’。
- cval:如果边界延拓方式设置为参数值,则用cval设定数值,默认值为0。
- preserve_range:用于指定是否原图像的范围。
- channel_axis:指定处理的通道序号,默认值为None,表示只处理单通道图像;否则,各个通道都处理。
pyramid_gaussian函数使用函数构造高斯金字塔图像。两个函数的声明如下:
- skimage.transform.pyramid_gaussian(image, max_layer, downscale, sigma, order, mode, cval, preserve_range, channel_axis)
- skimage.transform.pyramid_laplacian(image, max_layer, downscale, sigma, order, mode, cval, preserve_range, channel_axis)
部分参数说明:
- image:输入图像。
- max_layer:金字塔的层数,默认值为-1,即所有可能的层数。
- downscale:下采样率,默认值为2。
- (其他参数的说明,参考前面)
返回值:
- pyramid:图像构造的高斯金字塔。
以下是官方提供的一个构建高斯金字塔的代码:
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.transform import pyramid_gaussian
image = data.astronaut()
rows, cols, dim = image.shape
pyramid = tuple(pyramid_gaussian(image, downscale=2, channel_axis=-1))
# determine the total number of rows and columns for the composite
composite_rows = max(rows, sum(p.shape[0] for p in pyramid[1:]))
composite_cols = cols + pyramid[1].shape[1]
composite_image = np.zeros((composite_rows, composite_cols, 3), dtype=np.double)
# store the original to the left
composite_image[:rows, :cols, :] = pyramid[0]
# stack all downsampled images in a column to the right of the original
i_row = 0
for p in pyramid[1:]:
n_rows, n_cols = p.shape[:2]
composite_image[i_row:i_row + n_rows, cols:cols + n_cols] = p
i_row += n_rows
fig, ax = plt.subplots()
ax.imshow(composite_image)
plt.show()
以下是处理结果。
8.3.2 应用:图像混合
使用图像金字塔表示,完成图像混合。具体内容以后补充。
(本节初稿完成时间:2024-03-18)
参考文献:
1. Lindeberg T. Scale-space theory: a basic tool for analyzing structures at different scales [J]. Journalof AppliedStatistics, 1994, 21(2):225-270
2. Burt, Peter J. , and E. H. Adelson . "The Laplacian Pyramid as a Compact Image Code." Readings in Computer Vision 31.4(1987):671-679.
3. Burt, Peter J. , and E. H. Adelson . "A multiresolution spline with application to image mosaics." Acm Trans on Graphics 2.4(1983):217-236.