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

目录

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

(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角点检测

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统IIS服务配置与网站搭建,结合内网穿透实现公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助&#xf…

python文件路径读取提示can‘t open/read file: check file path/integrity

它的意思是“不能打开/读取文件”,让我们检查路径,在查看下路径前是否忘记加r了 python文件路径读取,如果不加r,上述文件路径在代码运行时会报错,因为其会先将双引号”“去掉,然后系统看到了文件路径中有\r…

应用场景丨智慧社区怎么有效预警内涝积水灾害

在繁华的社区中,一场突如其来的暴雨可能会让整个社区陷入“水深火热”。面对这样的困境,社区内涝积水监测系统应运而生,成为社区生命线的重要守护者。 社区内涝积水监测系统是一套高科技预警机制,它运用传感器、数据采集器、通信网…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

卓越进行时 | 市人大常委组织深入赛宁网安考察调研

11月28日,市人大常委会党组书记、主任龙翔来到基层一线,督导江宁区主题教育工作。市委第五巡回督导组组长鲍陈,区领导赵洪斌、任宁等参加。 督导期间,龙翔在网络安全卓越中心听取赛宁网安研发情况汇报,了解公司产品在…

常见的回归测试策略有哪几种?

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

NVM管理多个nodejs安装步骤

文章目录 NVM安装步骤**二、nvm下载****三、nvm安装**版本安装与切换命令使用 NVM安装步骤 一、nvm说明 nvm 主要是用来管理 nodejs 和 npm 版本的工具,可以用来切换不同版本的 nodejs。 安装nvm之前先卸载node 二、nvm下载 https://github.com/coreybutler/nvm-w…

关于前端学习的思考-内边距、边框和外边距

从最简单的盒子开始思考 先把实际应用摆出来: margin:居中,控制边距。 padding:控制边距。 border:制作三角形。 盒子分为内容盒子,内边距盒子,边框和外边距。 如果想让块级元素居中&#…

MySQL图书管理系统(49-94)源码

-- 九、 子查询 -- 无关子查询 -- 比较子查询&#xff1a;能确切知道子查询返回的是单值时&#xff0c;可以用>&#xff0c;<&#xff0c;&#xff0c;>&#xff0c;<&#xff0c;!或<>等比较运算符。 -- 49、 查询与“俞心怡”在同一个部门的读者的借…

【Docker】安装RabbitMQ

1.拉取镜像 docker pull rabbitmq 2.运行容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq 3.安装管理页面的插件 进入容器内部 dock…

mac安装homebrew/brew遇到443报错

文章目录 问题描述解决方法方法一方法二 参考文献 问题描述 brew 全称Homebrew 是Mac OSX上的软件包管理工具 想在mac终端安装&#xff0c;运行网上提供的指令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quo…

【Android Jetpack】Lifecycle 感知生命周期

文章目录 背景示例LifeCycle的原理LifecycleOwner自定义LifecycleOwnerLifecycleObserver 示例改进使用LifecycleService解耦Service与组件整个应用进程的生命周期ProcessLifecycleOwner 背景 在Android应用程序开发中&#xff0c;解耦很大程度上表现为系统组件的生命周期与普…

Linux学习笔记09、Shell命令之历史命令和自动补全

上一篇&#xff1a;Linux学习笔记08、Shell命令之常用命令缩写及全称 目录 1、历史命令&#xff1a; 1.1、查看所有历史命令列表&#xff1a; 1.2、查看指定历史命令&#xff1a; 1.3、清除历史命令&#xff1a; 2、自动补全 2.1、当字符串唯一时&#xff1a; 2.2、当有多个…

在编程中遇到的问题总结

IDEA空包粘黏问题 创建好目录以后会发现idea自动将空包合并在一起了&#xff0c;而且点击设置里面也没有Compact Middle Package Compact Middle Package如果不在设置的主面板上&#xff0c;则点击Tree Appearance&#xff0c;会发现Compact Middle Package在Tree Appearance里…

【JavaEE初阶】volatile 关键字、wait 和 notify

目录 一、volatile 关键字 1、volatile 能保证内存可见性 2、volatile 不保证原子性 二、wait 和 notify 1、wait()方法 2、notify()方法 3、notifyAll()方法 4、wait 和 sleep 的对比 一、volatile 关键字 1、volatile 能保证内存可见性 我们前面的线程安全文章中&…

【物联网与大数据应用】Hadoop数据处理

Hadoop是目前最成熟的大数据处理技术。Hadoop利用分而治之的思想为大数据提供了一整套解决方案&#xff0c;如分布式文件系统HDFS、分布式计算框架MapReduce、NoSQL数据库HBase、数据仓库工具Hive等。 Hadoop的两个核心解决了数据存储问题&#xff08;HDFS分布式文件系统&#…

国产CPU计算平台选型指南

信创&#xff0c;这两年已经不是什么新鲜词了&#xff0c;随着29号文、79号文的实施落地&#xff0c;信创产品加速从党政走向八大关基行业。 八大行业中&#xff0c;金融、教育、电信、石油等企业步伐更大&#xff0c;很多企业已经从窗口业务、日常办公这类轻量应用场景&#…

什么是灯塔工厂?灯塔工厂的作用?

什么是灯塔工厂&#xff1f; "灯塔工厂"概念源于德国的工业4.0战略&#xff0c;又称“工业4.0示范工厂”或“标杆工厂”&#xff0c;代表工业领域顶级的智能制造能力。2018年&#xff0c;由世界经济论坛和麦肯锡共同推出。 灯塔工厂是通过数字化、网络化和智能化手…

LeetCode(43)快乐数【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 快乐数 1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也…

pygame图像变换:缩放、旋转、镜像

文章目录 函数列表图像显示翻转缩放旋转 函数列表 pygame的transform中封装了一些基础的图像处理函数&#xff0c;列表如下 函数功能flip镜像scale缩放至新的分辨率scale_by根据因子进行缩放scale2x专业图像倍增器rotate旋转rotozoom缩放并旋转smoothscale平滑缩放smoothscal…