数字图像处理(实践篇)十二 基于小波变换的图像降噪

目录

一 基于小波变换的图像降噪

(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.shapeimage = image / 255gauss = np.random.normal(mean, val**0.05, size)image = image + gaussreturn 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] = 0else:result[x, y] = 255return 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角点检测

数字图像处理(实践篇)九 基于边缘的模板匹配

数字图像处理(实践篇)十 图像质量检测

数字图像处理(实践篇)十一 图像中的条形码解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S时代的JAVA_OPTS参数

问题 最近Spring要住到k8s的pod里面去了,导致原来的JAVA_OPTS配置方式,不能那么大开大合了。这里假设使用的Java 8. 原来的JAVA_OPTS参数: JAVA_OPTS"-server -Xms6g -Xmx6g -XX:UseG1GC -XX:MaxGCPauseMillis20 -XX:InitiatingHeapOc…

OpenSSL库名称修改方法

patchelf --set-soname libxxxssl.so.1.1 libssl.so.1.1 //修改动态库soname patchelf --set-soname libxxxcrypto.so.1.1 libcrypto.so.1.1 mv libcrypto.so.1.1 libxxxcrypto.so.1.1 mv libssl.so.1.1 libxxxssl.so.1.1 patchelf --replace-needed libcrypto.so.1.1 libxxxcr…

vsVode C++开发远程虚拟机工程配置

在使用VS Code进行C/C的开发过程中,有三个至关重要的配置文件,分别是 tasks.json, launch.json 和 c_cpp_properties.json 1. tasks.json tasks.json 是在 vscode 中辅助程序编译的模块,可以代你执行类似于在命令行输入 “gcc hello.c -o h…

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确

本文绝对是全网解决这个问题唯一正确的文章,没有之一! 很多人都说开启nginx gzip压缩,这些人完全是胡说八道!你们到底懂不懂叫gzip压缩啊?! 不信你就试试,如果css/js只有gz文件,ng…

排序分析(Ordination analysis)及R实现

在生态学、统计学和生物学等领域,排序分析是一种用于探索和展示数据结构的多元统计技术。这种分析方法通过将多维数据集中的样本或变量映射到低维空间,以便更容易理解和可视化数据之间的关系。排序分析常用于研究物种组成、生态系统结构等生态学和生物学…

中伟视界:AI盒子中的报警预录像功能能解决什么问题?实现原理是怎样的?

现代社会智能安防已成为各行各业的重要一环,而AI盒子中的报警预录像功能更是智能安防的一大利器。这一功能能够解决很多安防方面的难题,其实现原理更是技术创新的体现。 首先,让我们来看看AI盒子中的报警预录像功能能解决哪些问题。在传统的安…

Prosys OPC Client连接OPC DA

Prosys OPC Client连接OPC DA Prosys OPC 客户端将帮助排除 OPC 连接故障并测试 OPC 服务器。 您可以读写数据、浏览服务器以及导出和导入地址空间。 OPC 客户端轻巧、快速且易于使用。 支持 OPC DA 1.0a 和 OPC DA 2.05a 官方地址: https://www.prosysopc.com/products/opc-…

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…

QT(19):QChar和QByteArray

QChar 在Qt中,Unicode字符是没有任何标记或结构的16位实体。QChar表示这样的实体。它是轻量的,因此可以在任何地方使用。大多数编译器将其视为unsigned short。 QChar 提供了构造函数和强制转换运算符与传统的8位字符进行转换。如果定义了QT_NO_CAST_F…

4.7-容器网络之host和none

这一节我们来看一下docker中的另外两种网络,host和none。 docker network inspect none 于是就看到Containers, 里面包含了一个test1 表示这个容器连接到了none。

Python生产者与消费者模型

1、 # coding : UTF-8 import threading, time # 导入相关模块 class Message: # 数据的描述类型 def __init__(self): # 构造方法 self.__title None # 初始化属性 self.__content None # 初始化属性 def set_info(self, title, content): # 进…

陈嘉庚慈善践行与卓顺发的大爱传承

陈嘉庚慈善践行,了解陈嘉庚后人与卓顺发的大爱传承。 2023年11月25日,卓顺发太平绅士以及陈家后人在分享他们对慈善领域见解的过程中,特别强调了慈善在促进社会和谐以及推动社会进步方面的关键作用。同时,他们深入探讨了如何在当今社会中继续传扬和实践家国情怀以及…

清理docker Build Cache缓存文件

使用docker构建镜像,发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源: docker system df 可以看到已经占用了26.7GB,清理这个缓存 docker builder prune 再次查看,已经没有缓存了,清理成功。 …

Linux基础操作二:Linux系统介绍

1、系统启动过程 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 1.1、内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中…

固态继电器的分类:揭秘热门趋势

固态继电器(SSR)已成为现代电子和自动化系统不可或缺的一部分,与传统电磁继电器相比具有众多优势。随着技术的进步,SSR的分类不断发展,催生了令人兴奋的趋势和创新。在本文中,我们将探讨SSR分类的最新趋势,阐明该领域的…

10.索引

一.索引简介 索引用于快速找出在某个列中有一特定值的行。 不使用索引,MySQL必须从第1条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多。 如果表中查询的列有一个索引,MySQL能快速到达某个位置去搜寻…

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

css 字体倾斜

css 字体倾斜 //左右倾斜 transform: skew(40deg, 0deg);//上下倾斜 transform: skew(0deg, 16deg);

【代码】考虑区域多能源系统集群协同优化的联合需求侧响应模型(完美复现)

程序名称:考虑区域多能源系统集群协同优化的联合需求侧响应模型 实现平台:matlab-yalmip-cplex/gurobi 代码简介:风电、光伏发电等波动电源接入比例不断提高,使得区域多能源系统中能量转化和协调能力减弱。基于此,该…

面试:SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程SpringMVC的拦截器和过滤器有什么区别?执行顺序?Spring和SpringMVC为什么需要父子容器? SpringMVC运行流程 • 客户端&#…