数字图像处理与Python实现笔记之图像小波变换与多分辨率

摘要

  1. 简要介绍数字图像处理涉及的一些基本概念、基本运算、基本类型,以及如何通过Python对数字图像进行读取和简单操作。
  2. 以彩色图像为例对数字图像处理的基本操作进行介绍,熟悉数字图像处理的基本过程,主要包括颜色空间的基本概念、伪彩色图像处理操作,彩色图像处理简单操作。
  3. 瞄准在空间域中对图像进行增强,介绍空间滤波的机理、基本概念以及使用的基本技术。本章内容包括空间滤波基本概念、基于空间滤波的图像平滑处理、基于空间滤波的锐化操作以及混合空间增强。
  4. 从频域角度入手对图像处理及增强方法展开介绍。因为频域滤波所需的数学知识较多,所以本章采取由浅入深的策略,首先介绍一维傅里叶变换,其次介绍二维傅里叶变换和快速傅里叶变换,最后介绍图像频域滤波中出现的各种技术,其大体可分为低通滤波和高通滤波两大类。
  5. 从全局特征提取和局部特征提取两方面入手,分别介绍颜色特征、纹理特征、形状特征、边缘特征、点特征的提取方法。本章内容是目前机器视觉和图像处理领域的学者关注较多的内容,通过穿插较多的实例,帮助读者理解图像特征提取的基本技术。
  6. 瞄准如何减少图像传输及存储数据大小,介绍主要使用的压缩技术,包括有损压缩和无损压缩等,并使用JPEG压缩技术串讲全章知识点。
  7. 介绍图像的小波域表示及多分辨率表示。

绪论

  • 人工智能是引领未来发展的战略性技术,是新一轮科技革命和产业变革的重要驱动力量,将深刻地改变人类社会生活。

  • 促进人工智能和实体经济的深度融合,构建数据驱动、人机协同、跨界融合、共创分享的智能经济形态,更是推动质量变革、效率变革、动力变革的重要途经。

  • 进年来,我国人工智能新技术、新产品、新业态持续涌现,与农业、制造业、服务业等行业的融合步伐明显加快,在技术创新、应用推广、产业发展等方面成效初显。

  • 人工智能技术并不是一个新生事物,它在最近几年引起全球性关注并得到飞速发展的主要原因,在于它的三个基本要素(算法、数据、算力)的迅猛发展,其中又以数据和算力的发展尤为重要。

  • 物联网技术的蓬勃发展使得数据累计的难度越来越低,而芯片算力的不断提升,使得过去只能通过云计算才能完成的人工智能运算,现在可以下沉到最普通的设备上完成。

  • 物联网技术为机器带来感知能力,而人工智能则通过计算算力为机器带来了决策能力,正如感知和大脑对自然生命进化所起到的必然性作用。

1 数字图像处理基础知识

https://hulin.blog.csdn.net/article/details/107570020

2 彩色图像处理初步

https://hulin.blog.csdn.net/article/details/107578369

3 空间滤波

https://hulin.blog.csdn.net/article/details/107589248

4 频域滤波

https://hulin.blog.csdn.net/article/details/107609844

5 图像特征提取

https://hulin.blog.csdn.net/article/details/107639032

6 图像压缩

https://hulin.blog.csdn.net/article/details/107693170

7 图像小波变换与多分辨率

  • 小波变换是近年来图像处理中十分受重视的新技术,面向图像压缩、特征检测、纹理分析等提出了很多新方法,如多分辨率分析、时频域分析、金字塔算法等,都属于小波变换的范畴。
  • 信号分析是为了时间和频率之间的相互关系。傅里叶变换提供了有关频域的信息,但有关时间的局部化信息却基本丢失。与傅里叶变换不同,小波变换是通过缩放母小波(Mother Wavelet)的宽度获得信号的频域特征,通过平移母小波获得信号的时间信息。对母小波的缩放和平移是为了计算小波系数,这些小波系数反映了小波和局部信号之间的相关程度。
  • 像傅里叶分析一样,小波分析就是把一个信号分解为将母小波经过缩放和平移之后的一系列小波,因此小波是小波变换的基函数。小波变换可以理解为用经过缩放和平移的一系列小波函数,代替傅里叶变换的正弦波和余弦波进行傅里叶变换的结果。
  • 小波变换中的是指在时域具有紧支集或近似紧支集,是指具有正负交替的波动性,直流分量为0。小波本质上是定义在有限间隔而且其平均值为0的一种函数。
  • 与傅里叶变换相比,小波变换是空间(时间)和频率的局部变换,通过伸缩平移运算,对信号逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节。
  • 小波变换是基于具有变化的频率和有限持续时间的小型波进行的。

7.1 从傅里叶变换到小波变换

7.1.1 小波

1. 小波的概念
  • 小波是在有限时间范围内变化且其平均值为0的数学函数。具有两个特点。
    (1)具有有限的持续时间和突变的频率和振幅。
    (2)在有限的时间范围内,它的平均值为0
  • 小波变换的结果为各种小波系数,这些系数由尺度和位移函数组成。
2. 小波变换
  • 通过小波对一个信号在空间和时间上进行局部化的一种数学变换,通过平移母小波,捕获到信号信息。通过缩放母小波的宽度捕获到信号的频域特性。对母小波的平移和缩放操作是为计算小波分量的系数,这些系数代表局部信号和小波之间的相互关系,这些参数反映了信号的时间属性和频率属性。

7.1.2 感性认识小波变换

  • 傅里叶变换一直是信号处理领域应用最广泛、效果最好的一种分析手段,是时域到频域互相转化的工具。从物理意义上,傅里叶变换的实质是把对原函数的研究转化为对其傅里叶变换的研究。但是,傅里叶变换只能提供信号在整个时域上的频率,不能提供信号在某个局部时间段上的频率信息。
  • 傅里叶变换:在时域的常量函数,在频域将表现为冲击函数,表明具有很好的频域局部化性质。
    在这里插入图片描述
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft


# 中文显示工具函数
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False


set_ch()
t = np.linspace(0, 1, 400, endpoint=False)
cond = [t < 0.25, (t >= 0.25) & (t < 0.5), t >= 0.5]
f1 = lambda t: np.cos(2 * np.pi * 10 * t)
f2 = lambda t: np.cos(2 * np.pi * 50 * t)
f3 = lambda t: np.cos(2 * np.pi * 100 * t)
y1 = np.piecewise(t, cond, [f1, f2, f3])
y2 = np.piecewise(t, cond, [f2, f1, f3])
Y1 = abs(fft(y1))
Y2 = abs(fft(y2))

plt.figure(figsize=(12, 9))

plt.subplot(221)
plt.plot(t, y1)
plt.title('信号1 时间域')
plt.xlabel('时间/s')

plt.subplot(222)
plt.plot(range(400), Y1)
plt.title('信号1 频率域')
plt.xlabel('频率/Hz')

plt.subplot(223)
plt.plot(t, y2)
plt.title('信号2 时间域')
plt.xlabel('时间/s')

plt.subplot(224)
plt.plot(range(400), Y2)
plt.title('信号2 频率域')
plt.xlabel('频率/Hz')

plt.show()

  • 从时域上看,相差很大的两个信号,在频域上却非常相近。一个很自然的方法是加窗(短时距傅里叶变换),将长时间信号分成数个较短的等长信号,然后再分别对每个窗进行傅里叶变换,从而得到频率随时间的变化,这就是短时距傅里叶变换
    在这里插入图片描述
  • 小波变换可以解决这个问题。
import numpy as np
import matplotlib.pyplot as plt
import pywt


# 中文显示工具函数
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False


set_ch()
t = np.linspace(0, 1, 400, endpoint=False)
cond = [t < 0.25, (t >= 0.25) & (t < 0.5), t >= 0.5]

f1 = lambda t: np.cos(2 * np.pi * 10 * t)
f2 = lambda t: np.cos(2 * np.pi * 50 * t)
f3 = lambda t: np.cos(2 * np.pi * 100 * t)

y1 = np.piecewise(t, cond, [f1, f2, f3])
y2 = np.piecewise(t, cond, [f2, f1, f3])

cwtmatr1, freqs1 = pywt.cwt(y1, np.arange(1, 200), 'cgau8', 1 / 400)
cwtmatr2, freqs2 = pywt.cwt(y2, np.arange(1, 200), 'cgau8', 1 / 400)

plt.figure(figsize=(12, 9))

plt.subplot(221)
plt.plot(t, y1)
plt.title('信号1 时间域')
plt.xlabel('时间/s')

plt.subplot(222)
plt.contourf(t, freqs1, abs(cwtmatr1))
plt.title('信号1 时间频率关系')
plt.xlabel('时间/s')
plt.ylabel('频率/Hz')

plt.subplot(223)
plt.plot(t, y2)
plt.title('信号2 时间域')
plt.xlabel('时间/s')

plt.subplot(224)
plt.contourf(t, freqs2, abs(cwtmatr2))
plt.title('信号2 时间频率关系')
plt.xlabel('时间/s')
plt.ylabel('频率/Hz')

plt.tight_layout()
plt.show()

  • 图中不仅可以看到信号中有哪些频率,还可以看到不同的频率成分在什么时间出现。傅里叶变换类似棱镜,可以将不同的信号分解。小波变换类似于显微镜,不仅知道信号中有哪些成分,还可以知道各种成分在什么位置出现。
    在这里插入图片描述
  • 经典的傅里叶变换把信号按正弦、余弦展开,将任意函数表示为具有不同频率的谐波函数的线性叠加,能较好的刻画信号的频率特性。但在时空域上无任何分辨,不能做局部分析。
  • 小波分析优于傅里叶分析之处在于:小波分析在时域和频域同时具有良好的局部化性质,因为小波函数是紧支集,而正弦、余弦的区间是无穷区间,所以小波变换可以对高频成分采用逐渐精细的时域或空域取代步长。,从而可以聚焦到对象的任意细节。

7.2 简单小波示例

7.2.1 哈尔小波构建

  • 哈尔基函数可以捕捉到信号的尺度信息,而哈尔小波函数信号的细节信息。哈尔小波变换要做的就是将信号分解到不同的基函数及小波函数上,并求每个函数对应分量的值。
  • 哈尔小波具有如下特点:
    (1)哈尔小波在时域是紧支撑的,即其非零区间为[0,1)
    (2)哈尔小波属于正交小波。
    (3)哈尔小波是对称的。系统的单位冲击响应若具有对称性,则该系统具有线性相位,这对于去除相位失真是非常有利的,哈尔小波是目前唯一一个具有对称性,又是有限支撑的正交小波。
    (4)哈尔小波仅取+1和-1,计算简单。
    (5)哈尔小波是不连续小波,在实际的信号分析与处理中受到了限制。

7.3 图像多分辨率

7.3.1 小波多分辨率

  • 多分辨分析是小波分析中最重要的概念之一,将一个函数表示为一个低频成分与不同分辨率下的高频成分,并且多分辨分析能提供一种构造小波的统一框架,提供函数分解与重构的快速算法。
  • 单调性。
  • 伸缩性。
  • 平移不变性。
  • Riesz基。

7.3.2 图像金字塔

  • 当观察图象时,通常看到是相连接的纹理与灰度级相似的区域,它们相互结合形成物体。如果物体的尺寸较小或者对比度不高,通常采用较高的分辨率观察;如果物体的尺寸很大或者对比度很强,只需要较低的分辨率。
  • 如果物体的尺寸有大有小,或者对比度有强有弱的情况同时发生,那么,以若干个分辨率对他们进行研究将具有优势。
  • 以多分辨率解释图像的一种有效但概念简单的结构是图像金字塔,图像金字塔最初用于机器视觉或者图像压缩,将图像表示为一系列分辨率逐渐降低的集合。
  • 多分辨率分析:将信号或图像用多种分辨率层次表示。在某个分辨率层次上难以检测到的特征,可能很容易在其他分辨率特征上检测出来,每层中包含一个近似图像和一个残差图像,多种分辨率层次联合起来可以称为图像金字塔。
    在这里插入图片描述

7.3.3 图像子带编码

  • 在子带编码中,一幅图像被分解成一系列频带受限的分量,称为子带。子带可以重组在一起,无失真的重建原始图像。每个子带通过对输入图像进行带通滤波而得到。

7.4 图像小波变换

7.4.1 二维小波变换基础

  • 通过小波变换得到N个小波系数,而二维离散小波变换输入的是二维矩阵,每个步骤输出的是近似图像,水平细节,垂直细节和对角细节
import numpy as np
import matplotlib.pyplot as plt
import pywt.data


# 中文显示工具函数
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False


set_ch()
original = pywt.data.camera()
# Wavelet transform of image, and plot approximation and details
titles = ['近似图像', '水平细节', '垂直细节', '对角线细节']
coeffs2 = pywt.dwt2(original, 'haar')
LL, (LH, HL, HH) = coeffs2
fig = plt.figure(figsize=(12, 3))
for i, a in enumerate([LL, LH, HL, HH]):
    ax = fig.add_subplot(1, 4, i + 1)
    ax.imshow(a, interpolation="nearest", cmap=plt.cm.gray)
    ax.set_title(titles[i], fontsize=10)
    ax.set_xticks([])
    ax.set_yticks([])
fig.tight_layout()
plt.show()

  • 基于哈尔小波对图像进行二维小波变换结果
    在这里插入图片描述

7.4.2 小波变换在图像处理中的应用

  • 小波变换在图像处理中的应用与傅里叶变换类似,基本方法是:
    (1)计算一幅图像的二维小波变换,并得到小波系数
    (2)对小波系数进行修改,保留有效成分,过滤不必要成分
    (3)使用修改后的小波系数进行图像重建

  • 基于小波变换的图像去噪步骤
    (1)图像小波变换。选择一个小波,计算噪声图像的小波系数。
    (2)对细节系数通过阈值进行过滤。选择一个细节系数阈值,并对所有细节系数进行阈值化操作。
    (3)基于阈值化过滤后的细节系数及原始近似系数,使用小波变换对图像进行重建。

import numpy as np
import matplotlib.pyplot as plt
import pywt
from skimage.restoration import denoise_wavelet


# 中文显示工具函数
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False


set_ch()
x = pywt.data.ecg().astype(float) / 256

sigma = .05
x_noisy = x + sigma * np.random.randn(x.size)
x_denoise = denoise_wavelet(x_noisy, sigma=sigma, wavelet='sym4', multichannel=False)

plt.subplot(311)
plt.title('原始信号')
plt.plot(x)

plt.subplot(312)
plt.title('加噪图像')
plt.plot(x_noisy)

plt.subplot(313)
plt.title('去噪图像')
plt.plot(x_denoise)

plt.show()
  • 小波对一维信号去噪
    在这里插入图片描述
import matplotlib.pyplot as plt
from skimage.restoration import (denoise_wavelet, estimate_sigma)
from skimage import data, img_as_float
from skimage.util import random_noise


# 中文显示工具函数
def set_ch():
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong']
    mpl.rcParams['axes.unicode_minus'] = False


set_ch()
original = img_as_float(data.coffee())

plt.subplot(221)
plt.axis('off')
plt.title('原始图像')
plt.imshow(original)

sigma = 0.2
noisy = random_noise(original, var=sigma ** 2)

plt.subplot(222)
plt.axis('off')
plt.title('加噪图像')
plt.imshow(noisy)

im_haar = denoise_wavelet(noisy, wavelet='db2', multichannel=True, convert2ycbcr=True)
plt.subplot(223)
plt.axis('off')
plt.title('使用haar去噪后')
plt.imshow(im_haar)

# 不同颜色通道的噪声平均标准差
sigma_est = estimate_sigma(noisy, multichannel=True, average_sigmas=True)
im_haar_sigma = denoise_wavelet(noisy, wavelet='db2', multichannel=True, convert2ycbcr=True, sigma=sigma_est)
plt.subplot(224)
plt.axis('off')
plt.title('使用haar with sigma去噪后')
plt.imshow(im_haar_sigma)
plt.show()

  • 二维小波图像去噪
    在这里插入图片描述

7.5 小结

  • 本章主要介绍小波相关内容。首先介绍了小波变换和傅里叶变换的区别,并从感性认识介绍了小波的优点,其次介绍了小波信号处理过程,包括小波构建、小波变换、小波逆变换,然后介绍了图像多分辨率,最后介绍了小波变换在图像处理中的应用。

参考资料

  1. 岳亚伟《数字图像处理与Python实现》人民邮电出版社