目录
一 基于小波变换的图像降噪
(1)小波变换基本理论
(2)小波分析在图像处理中的应用
(3)小波变换原理
(4)小波降噪原理
(5)小波降噪算法的实现
(6)小波变换降噪算法中分解层数对效果的影响
(7)小波变换降噪算法中小波基对效果的影响
二 涉及的函数
三 实践
四 结论
一 基于小波变换的图像降噪
(1)小波变换基本理论
小波变换在时频域具有很好的局部性,其变尺度的特性使得小波变换对确定的信号具有一种“集中”的能力。如果一个信号的能量在小波变换域集中于少数系数上,那么,这些系数的取值大于在小波变换域内能量分散在大量系数上的信号或噪声的小波系数值。含有噪声的图像经过小变换后,图像信号和噪声信号表现出不同的特征:信号的能量主要集中在一些亮线上,而大部分系数的值逼近于0;噪声的分布和信号的分布相反,它的系数均匀分布于整个尺度空间,幅度相差不大(在大尺度下会对噪声起到一定的平滑作用)。这一特性为基于小波变换的图像降噪提供了依据。
(2)小波分析在图像处理中的应用
小波分析在图像降噪中有着很好的应用。小波降噪主要是利用噪声与图像信号在频率上分布的不同,图像信号主要分布在低频区域,而噪声主要分布在高频区域,小波降噪使得原始图像的结构信息和细节信息很容易被提取是因为小波具有以下的特点:
①低熵性。小波系数的稀疏分布,使得图像变换后的熵降低;
②多分辨率性。由于采用了多分辨率分析,因此可以非常好地刻画信号的非平稳特征,如边缘、尖峰、断点等;
③去相关性。因为小波变换可以对信号进行去相关,且噪声在变换后有白化趋势,所以小波域比空域更利于去噪;
④选基灵活性。由于小波变换可以灵活选择变换基,从而对不同的应用场合,不同的研究对象,可以选用不同的小波母函数,以获得最佳的效果。
因此,小波变换的种种特性使得小波变换在图像降噪中获得了广泛的应用。
(3)小波变换原理
噪声的能量分布在所有的小波系数上,而信号由于是有限带宽的,其能量只分布在一部分小波系数上。由于信号能量远大于噪声能量,在小波域上表现为含有信号的小波系数具有较大的幅值(数目较少) ,而仅含噪声的小波系数的幅值较小(数目较多) ,这便提供了一种通过小波系数的幅值来甄别信号和噪声的方法:预先设置一个阈值,小于该阈值的小波系数认为是仅由噪声产生,予以去掉;大于该阈值的则认为包含了噪声和信号,予以保留或进行后续处理。由于保留了大部分信号的小波系数,因而可较好地保持图像的细节特征。
- 二维离散小波变换
a为为伸缩尺度; R2为二维图像的定义域。在离散情况下, 通常采用Mallat 塔式算法进行小波的分解和重构。
由式:
通过对其伸缩标度因子a和评议标度因子b的取样而离散化。对a和b取
这样离散小波变换可定义为:
(4)小波降噪原理
- 一维信号小波变换分解与重构
如下图第一层小波变换分解将信号分解为低频部分和高频部分,且信号长度是原信号长度的一半。往下层次的分解都是针对低频部分,而高频细节部分则不再继续分解。且每次分解得到的低频和高频信号的长度减半,相当于在滤波后进行了“二抽一采样”。
如此分解N次,最终得到第N层上的小波分解结果,它包含了原始信号从低到高的频率信息,且每个序列同时含有一定频率上原始信号的全部时间信息,因而小波谱上的每一点既含有时间信息,又含有频率信息,具有时频局部化特征。将信号分解到小波域以后,就可对不同频段内的小波系数进行分析处理,如可对我们感兴趣的某一频段进行重构,对小波系数进行滤波,去噪,数据压缩,奇异性检测以及故障信号的特征提取等。
- 二维图像小波变换分解与重构
经过二维小波变换,可以将原图像逐级分离,分离成具有不同尺度的子图像。原图经小波变换后生成四个分量部分:低频分量LL,保留了原图的大部分信息:高频分量LH(水平方向)、HL(垂直方向)、HH(对角线方向),均包含了边缘、区域轮廓等细节信息。多分辨小波变换还可以把图像分解到更低分辨率水平上,只对LL进行下一级的小波分解,得到由低频的轮廓信息和原信号在水平、垂直和对解线方向高频部分的细节信息组成,每一次分解均使得图像的分辨率变为原信号的一半。
(5)小波降噪算法的实现
由于信号能量远大于噪声能量,在小波域上表现为含有信号的小波系数具有较大的幅值(数目较少),而仅含噪声的小波系数的幅值较小(数目较多),这便提供了一种通过小波系数的幅值来甄别信号和噪声的方法:预先设置一个阈值,小于该阈值的小波系数认为是仅由噪声产生,予以去掉;大于该阈值的则认为包含了噪声和信号,予以保留或进行后续处理。由于保留了大部分信号的小波系数,因而可较好地保持图像的细节特征。
首先,用分解法对原图像进行多分辨率分解,生成小波系数矩阵;然后,对小波系数矩阵进行阈值量化处理,获得一个处理后的小波系数矩阵;最后,对该小波系数矩阵用重构算法进行图像重构,生成降噪图像。
(6)小波变换降噪算法中分解层数对效果的影响
在一定的去噪方法下,小波分解层数也是影响融合图像质量的一个重要因素。在实际的图像降噪过程中不同信号、不同信噪比、不同降噪方法下都存在一个降噪效果最好或接近最好的分解层数。分解层数对于信号降噪效果的影响很大,通常情况下,若分解层数过多,此时对所有的各层小波空间的系数都进行阈值处理时会造成信号信息的严重丢失,这时降噪后的信噪比不但不高反而会下降,同时还会使运算量增大,电脑处理的时间变长,效率低下;若分解层数过少则会使降噪效果不理想,信噪比提高不大。因此在降噪方法一定的情况下,如何确定图像的小波变换的分解层数的问题是图像降噪的一个需要解决的核心问题。
(7)小波变换降噪算法中小波基对效果的影响
基于小波变换的多分辨图像降噪技术中,小波基的选择是影响图像效果的一个重要因素。小波基的选择要注意四个方面的因素:正交性、紧支性、对称性和规则性。
①正交性:用正交小波基、由多尺度分解得到的各子带数据分别落在相互正交的L2(R)的子空间中,使各子带数据相关性减少。但是能准确重建的正交的线性相位有限冲击响应滤波器组是不存在的,此时一般放宽正交性条件为双正交。
②紧支性:这是小波基的时频特性,具有紧支集性的小波基对应的滤波器长度是有限的,是物理可实现的。
③对称性:对称性滤波器组具有两个优点:一是人类的视觉系统对边缘附近对称的量化误差较非对称误差更不敏感;另一是对称滤波器组具有线性相位特性,重构图像边缘部分失真较小,有利于复杂特性的分析。
④规则性:小波基的规则性对最小化量化误差是很重要的,规则度是量化小波函数光滑性的。
因此,在进行基于小波变换的图像降噪时应选用具有紧支集性、正交性和对称性的小波基,才可以更好地提取图像的小波特性,有效降低图像噪声。
二 涉及的函数
实现二维离散小波变换(2D-DWT):Python的pywt库提供了对小波变换的支持。首先,安装pywt库,命令如下:
pip install PyWavelets
◆ 单层变换
pywt.dwt2是pywt库中实现的二维离散小波变换(2D-DWT)函数。
pywt.dwt2(data, wavelet, mode='symmetric', axes=(-2, -1))
- 输入:
①data: 输入的数据。
②wavelet:小波基。
③mode: 默认是对称的。
mode可选的值包括:zero:补零。即在数据较短时,在末尾添加零,与小波函数长度相同;constant:复制边界值;symmetric:对称重复,数据以中心为对称轴,进行左右对称复制。reflect:反射填充信号通过反射采样进行扩展。periodic:周期延拓,信号被视为一个周期信号。smooth:平滑填充,根据边缘(直线)上计算的一阶导数对信号进行扩展。antisymmetric:反对称,反对称填充信号通过镜像和负向采样得到扩展。antireflect:通过对边缘样本的非对称反射来扩展信号。mode参数会影响小波分解的结果。
- 返回:
①(cA, (cH, cV, cD)),分别为低频分量,水平高频、垂直高频、对角线高频。注意高频的值包含在一个tuple里。
近似矩阵(cA):表示原始图像的低频部分,包含图像中的整体结构和大致形状信息。
水平细节(cH):表示图像中水平方向的高频信息,包括边缘和细节的水平变化。
垂直细节(cV):表示图像中垂直方向的高频信息,包括边缘和细节的垂直变化。
对角细节(cD):表示图像中对角方向的高频信息,包括边缘和细节的对角变化。
◆ 单层逆变换
pywt.idwt2(coeffs, wavelet, mode='symmetric', axes=(-2, -1))
- 输入:
①coeffs: 经小波变换后得到的各层的系数。
②wavelet:小波基。
③mode:可选。
- 返回:
逆变换后的结果。重构数据的二维数组。
◆ 多尺度变换
pywt.wavedec2(data, wavelet, mode='symmetric', level=None, axes=(-2, -1))
- 输入:
①data: 输入的数据。
②wavelet:小波基。
③mode:可选。
④level: 尺度。
- 返回:
每一层的高频都是包含在一个tuple里。
level=3的时候,返回为 [cA3, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)]。
◆ 多尺度逆变换
pywt.waverec2(coeffs, wavelet, mode='symmetric', axes=(-2, -1))
- 输入:
①coeffs:list 或者tuple,系数列表[cAn, (cHn, cVn, cDn),…(cH1, cV1, cD1)]。
②wavelet:小波基。
③mode:可选。
- 返回:
重构data的二维数组。
三 实践
(1)实践①
- 代码
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pywt
def add_gaussian_noise(image, mean=0, val=0.01):
size = image.shape
image = image / 255
gauss = np.random.normal(mean, val**0.05, size)
image = image + gauss
return image
def dealImageResult(img_path, threshold):
img = cv2.imread(img_path, 0)
# 添加噪声
noisy_img = add_gaussian_noise(img)
# 小波变换
cA, (cH, cV, cD) = pywt.dwt2(noisy_img, 'haar')
# print(cH)
cH_th = pywt.threshold(cH, threshold * np.max(cH))
# print(cH_th)
cV_th = pywt.threshold(cV, threshold * np.max(cV))
cD_th = pywt.threshold(cD, threshold * np.max(cD))
# 逆变换
coeffs_th = cA, (cH_th, cV_th, cD_th)
img_denoised = pywt.idwt2(coeffs_th, 'haar')
fig = plt.figure(figsize=(8, 8))
titles = ["img", "noisy_img", "result"]
images = [img, noisy_img, img_denoised]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("5.jpg", 0.5)
pass
- 结果图
(2)实践②
- 代码
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pywt
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 测量图片的长和宽
w, h = image.shape[:2]
# 生成n个椒盐噪声
for i in range(n):
x = np.random.randint(1, w)
y = np.random.randint(1, h)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
def dealImageResult(img_path, threshold):
img = cv2.imread(img_path, 0)
noisy_img = add_peppersalt_noise(img) # 添加噪声
coeffs = pywt.wavedec2(data=noisy_img, wavelet='sym4', level=3)
list_coeffs = []
for i in range(1, len(coeffs)):
list_coeffs_ = list(coeffs[i])
list_coeffs.append(list_coeffs_)
for r1 in range(len(list_coeffs)):
for r2 in range(len(list_coeffs[r1])):
list_coeffs[r1][r2] = pywt.threshold(list_coeffs[r1][r2], threshold * np.max(list_coeffs[r1][r2]))
rec_coeffs = [] # 重构系数
rec_coeffs.append(coeffs[0])
for j in range(len(list_coeffs)):
rec_coeffs_ = tuple(list_coeffs[j])
rec_coeffs.append(rec_coeffs_)
img_denoised = pywt.waverec2(rec_coeffs, 'sym4')
fig = plt.figure(figsize=(8, 8))
titles = ["img", "noisy_img", "result"]
images = [img, noisy_img, img_denoised]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("5.jpg", 0.25)
pass
- 结果图
四 结论
小波变换具有一种“ 集中”的能力, 它可以使一个信号的能量在小波变换域集中在少数系数上, 因此这些系数的幅值必然大于在小波变换域内能量分散于大量小波系数上的信号或噪声的幅值。这就意味着对小波系数进行阈值处理可以在小波变换域中去除低幅值的噪声和不期望的信号, 然后运用小波逆变换, 得到降噪后的重建图像,使用小波变换都得到了较好的消噪效果。小波分析由于在时域频域同时具有良好的局部化性质和多分辨率分析的特点,能有效地把信号和噪声区别开来,与传统的去噪方法相比较,有着无可比拟的优点,成为信号分析的一个强有力的工具。
小波变换能够把处于不同频域的信号和噪声很好地区分开来,处理时保留低分辨率(大尺度)下的小波系数,对高分辨率(小尺度)下的小波系数则依据所确定的阈值进行取舍,由于噪声的小波变换主要集中在小尺度的各个层次中,因此经上述处理后,噪声基本滤除,而边缘和细节则可以较好地保留。“小波降噪”能适应信号频率的局域变化,在每一层小波分解上选取各自阈值,可以消除多数噪声。现在小波图像降噪已被视为图像处理中的重要降噪算法。
2D Forward and Inverse Discrete Wavelet Transform
前文回顾
入门篇目录
数字图像处理(入门篇)一 图像的数字化与表示
数字图像处理(入门篇)二 颜色空间
数字图像处理(入门篇)三 灰度化
数字图像处理(入门篇)四 像素关系
数字图像处理(入门篇)五 图像数据预处理之颜色空间转换
数字图像处理(入门篇)六 图像数据预处理之坐标变化
数字图像处理(入门篇)七 图像数据预处理之灰度变化
数字图像处理(入门篇)八 图像数据预处理之直方图
数字图像处理(入门篇)九 图像数据预处理之滤波
数字图像处理(入门篇)十 边缘检测
数字图像处理(入门篇)十一 形态学处理
数字图像处理(入门篇)十二 自适应阈值分割
数字图像处理(入门篇)十三 仿射变换
数字图像处理(入门篇)十四 透视变换
实践篇目录
数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!
数字图像处理(实践篇)二 画出图像中目标的轮廓
数字图像处理(实践篇)三 将两张图像按照指定比例融合
数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法
数字图像处理(实践篇)五 使用Grabcut算法进行物体分割
数字图像处理(实践篇)六 利用hough变换进行直线检测
数字图像处理(实践篇)七 利用霍夫变换进行圆环检测
数字图像处理(实践篇)八 Harris角点检测
数字图像处理(实践篇)九 基于边缘的模板匹配
数字图像处理(实践篇)十 图像质量检测
数字图像处理(实践篇)十一 图像中的条形码解析