图像去噪滤波算法汇总(Python)


前言

上篇文章:图像数据噪音种类以及Python生成对应噪音,汇总了常见的图片噪音以及噪音生成方法,主要用在数据增强上面,作为数据集填充的方式,可以避免模型过拟合。想要了解图像数据增强算法的可以去看本人所撰这篇文章:图像数据增强算法汇总(Python)。

本篇文章将介绍常用到的图像去噪滤波算法,采用实例代码和处理效果一并展现的方式进行介绍,能够更直观的看到每种算法的效果。本篇文章偏实战,所以不会涉及到过多每种算法的原理理论计算公式,以一篇文章快速了解并实现这些算法,以效率最高的方式熟练这些知识。

博主专注数据挖掘五年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。


一、图像噪音来源

随着图像获取技术的不断发展,我们在实际应用中常常会面临到各种形式的图像噪声,这些噪声会影响到图像的质量和特征的清晰度。为了有效地提升图像的质量,图像处理领域涌现出了多种去噪方法,它们以不同的原理和技术手段来应对各种噪声情况。在接下来的介绍中,我们将详细探讨一些常用的图像去噪方法,包括均值滤波、中值滤波、高斯滤波等,以及它们的适用场景和特点。让我们一起深入了解如何有效地应对图像噪声,提升图像处理的准确度和质量。 图像噪音可以由多种因素引起:

  1. 传感器噪音: 摄像机、扫描仪等图像采集设备本身会引入噪音,这是由于设备的电子元件和信号处理过程中的微小不确定性。

  2. 环境条件: 光线不足、强光、阴影等环境因素可能会导致图像中的噪音增加。

  3. 传输或存储中的干扰: 在图像传输或存储过程中,信号可能会受到电磁干扰、压缩算法等因素的影响,从而产生噪音。

  4. 设备老化或损坏: 图像采集设备的老化、损坏或不稳定可能会导致图像中出现各种噪音。

  5. 信号采样误差: 在信号采样过程中,由于采样率不足或量化误差等原因,会引入噪音。

  6. 电磁干扰: 来自电器设备、无线信号等电磁波的干扰可能会影响到图像质量。

  7. 传感器特性: 不同类型的传感器(例如CMOS、CCD)具有不同的特性,它们在信号处理过程中可能会引入特定类型的噪音。

二、图像去噪算法

1.均值滤波

均值滤波是一种常用的图像处理技术,它的原理是将图像中每个像素的值替换为周围像素值的平均数。这样可以平滑图像,减少噪声的影响。具体的实现步骤如下:

  1. 确定滤波器大小:均值滤波器的大小由一个参数决定,通常用一个正奇数来表示,如3x3、5x5等。这个值决定了滤波器在图像上的覆盖区域。

  2. 将滤波器放置在图像的每个像素上:以当前像素为中心,将滤波器覆盖在图像上。

  3. 计算周围像素的平均值:将滤波器覆盖区域内的所有像素值取平均,得到一个新的像素值。

  4. 将新的像素值赋给当前位置:用计算得到的新像素值替代原来的像素值。

均值滤波主要用于去除图像中的随机噪声,例如高斯噪声或盐椒噪声。它在保留图像整体结构的同时,可以有效地减轻噪声的影响。

使用均值滤波算法来去除图片的高斯噪音可以通过以下步骤实现:

1.应用均值滤波

# 设置卷积核大小,通常选择奇数
kernel_size = 3
# 使用均值滤波进行去噪
denoised_image = cv2.blur(image, (kernel_size, kernel_size))

 2.显示原始图片和去噪后的图片

cv2.imshow('Original Image', image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

然而,均值滤波对于一些特定类型的噪声(如周期性噪声)可能效果不佳,因为这些噪声会在图像中形成特定的模式,而均值滤波只能模糊图像,无法针对特定模式的噪声进行处理。总的来说,均值滤波是一种简单而有效的去噪方法,适用于大多数情况下的随机噪声去除。但在特定情况下,可能需要考虑其他类型的滤波器或去噪技术。卷积核越大,参与到均值运算中的像素就会越多,即当前计算的算的是更多点的像素值的平均值,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。因此在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核

2.中值滤波

中值滤波是一种常用于图像处理中的非线性滤波方法,其基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,从而达到去除噪音的目的。总共分两步:

  • 将滤波器窗口置于图像的某一像素处。

  • 将窗口中的像素值按大小排序,取其中间值作为该像素的新值。

能够处理的图像噪音类别:

中值滤波主要适用于以下几种图像噪音:

  1. 椒盐噪声:即图像中出现的黑白像素点。

  2. 横纹噪声:出现在图像中的横向条纹。

  3. 斑点噪声:散布在图像中的随机白点。

然而,中值滤波也有一些局限性,比如在保留图像细节的同时也会模糊图像,卷积核选择和均值滤波算法存在一样的问题,卷积核越大,参与到均值运算中的像素就会越多,即当前计算的算的是更多点的像素值的平均值,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重:

gray_image = cv2.cvtColor(noisy_image, cv2.COLOR_BGR2GRAY)
denoised_image = cv2.medianBlur(gray_image, 5)  # 5表示核的大小,可以根据需要调整cv2.imshow('Original Image', noisy_image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

3.高斯滤波

高斯滤波是一种线性平滑滤波器,它采用高斯函数作为权值函数进行图像滤波。高斯滤波的基本思想是通过对图像中每个像素周围的像素进行加权平均,从而降低噪声的影响,同时保留图像的边缘信息。高斯滤波器会使用一个高斯函数来计算权重,距离中心点越近的像素拥有越大的权重,距离越远的像素拥有越小的权重。

高斯滤波主要用于去除图像中的高频噪声,使图像变得更加平滑,同时也可以用于图像模糊或降低图像的细节信息。高斯滤波对高斯噪声的去除效果非常显著,可以有效地使图像变得更加平滑:

# 设置高斯滤波的内核大小,通常选择一个奇数值
kernel_size = 5
blurred_image = cv2.GaussianBlur(noisy_image, (kernel_size, kernel_size), 0)cv2.imshow('Original Image', noisy_image)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

4.双边滤波

双边滤波(Bilateral Filtering)是一种用于图像去噪的非线性滤波器。与高斯滤波不同,双边滤波考虑了像素之间的空间距离和像素值之间的相似性。

原理和功能:

  1. 空间距离权重:除了像素值之间的相似性,双边滤波还考虑了像素之间的空间距离。这意味着附近的像素对于滤波的影响更大,而远离的像素对滤波的影响更小。

  2. 相似性权重:双边滤波器使用高斯函数来度量像素值之间的相似性。如果两个像素的值非常相似,它们的权重较大。如果它们的值差异很大,它们的权重较小。

  3. 保留边缘信息:相比于一般的平滑滤波器,双边滤波器可以保留图像的边缘信息。这是因为它会考虑到边缘处像素的相似性。

双边滤波器可以有效地处理各种类型的噪音,包括高斯噪音、椒盐噪音等。

# 应用双边滤波
filtered_image = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75)

 

在一些名画细节上面修复去噪更加能够体现出来:

修复前

修复后:

 

 相比高斯滤波修复算法:

双边滤波器特别适用于那些需要保留图像细节和边缘的情况。

5.NL-Means(Non-Local Means)

NL-Means(Non-Local Means)是一种图像去噪算法,它通过利用图像中相似区域的信息来降低噪声水平,而不会损失图像的细节信息。NL-Means算法不仅可以处理高斯噪声,还可以有效地处理泊松噪声等其他类型的噪声。

NL-Means算法的基本思想是,对于图像中的每一个像素,通过计算该像素周围区域与其他像素区域的相似性来进行去噪。相似性计算可以基于像素强度的差异,也可以使用特征向量来进行。NL-Means算法的基本原理如下:

  1. 相似性比较: 对于图像中的每一个像素,NL-Means算法首先会在图像的局部区域内搜索与该像素相似的区域。相似性的度量可以基于像素强度的差异,也可以使用特征向量来进行。

  2. 权重计算: 对于每一个相似区域,算法会计算一个权重值,该权重值表示了该相似区域与目标像素的相似性。相似性越高,权重值越大。

  3. 加权平均: 使用计算得到的权重值,NL-Means算法对所有相似区域的像素值进行加权平均,得到目标像素的估计值。

  4. 重复处理: 以上步骤对图像中的每一个像素都进行处理,以达到整体去噪的效果。

通过这种方式,NL-Means算法能够保留图像的细节信息,并在降低噪声水平的同时,避免了模糊效果。

def denoise_nl_means(image, h=10, hForColor=10, templateWindowSize=7, searchWindowSize=21):denoised_image = cv2.fastNlMeansDenoisingColored(image, None, h, hForColor, templateWindowSize, searchWindowSize)return denoised_image

噪音图片:

 NL-Means去噪后图片:

 能够看出NL-Means算法保留图像的细节信息且图片没有那么模糊。

总结

综上所述,图像去噪是图像处理领域中的重要任务,其目的是消除或减弱图像中的噪音,以使图像更清晰、更易分析。不同的去噪算法适用于不同类型和强度的噪音,因此在实际应用中需要根据具体情况选择合适的方法。同时,对于特定的图像处理任务,也可能需要结合多种去噪技术以获得最佳效果。在实践中,通过理解各种去噪算法的原理和特性,可以更好地应用它们来解决实际问题,从而提升图像处理的质量和效率。


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

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

相关文章

2023深耕kotlin,谈谈前景

为什么学习kotlin? Kotlin 早就已经是 Google 官方推荐的开发语言了,而且 Android 新的 Compose 框架只支持 Kotlin ,在 Google 那里,Android开发中 Java 其实已经被淘汰了。Java 和 Kotlin 虽然都属于高级语言,但是 …

Adversarial attacks and defenses on AI in medical imaging informatics: A survey

Adversarial attacks and defenses on AI in medical imaging informatics: A survey----《AI在医学影像信息学中的对抗性攻击与防御:综述》 背景: 之前的研究表明,人们对医疗DNN及其易受对抗性攻击的脆弱性一直存在疑虑。 摘要:…

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介: 桥接模式,它是一种结构型设计模式,它的主要目的是将抽象部分与具体实现部分分离,使它们都可以独立地变化。…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

计算机毕业设计 基于SpringBoot大学生创新创业项目管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

工控安全与网络安全有什么不同?

在当代&#xff0c;全球制造业正在经历一场前所未有的技术变革。工业4.0不仅代表着自动化和数据交换的进步&#xff0c;它还揭示了工业自动化、智能制造与系统集成的融合。这种集成为企业带来了效率和质量的双重提升&#xff0c;但同时也暴露出新的安全隐患。工控系统成为了这一…

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…

【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现

文章目录 前言一、条件构造器1.1 什么是条件构造器1.2 QueryWrapper1.3 UpdateWrapper1.4 LambdaWrapper 二、自定义 SQL 语句2.1 自定义 SQL 的基本用法2.2 自定义 SQL 实现多表查询 三、Service 接口3.1 对 Service 接口的认识3.2 实现 Service 接口3.3 实现增删改查功能3.4 …

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…

bug:Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题

bug&#xff1a;Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题 1 解决 先说解决办法&#xff1a; 将下载的crx重命名为xxx.zip&#xff0c;然后解压打开chrome的开发者模式 点击加载已解压的应用程序&#xff0c;然后选择我们解压后的文件夹即可 安装成…

【linux】安装rpmrebuild

rpmrebuild是一种从已经安装的包中构建RPM文件的工具。它可以用于轻松构建修改后的包&#xff0c;并适用于任何使用RPM的Linux发行版。 访问地址 rpm rebuild download | SourceForge.net 选择版本 版本地址&#xff1a;版本地址 下载安装包 安装 rpm -ivh rpmrebuild-2.15…

简单8位CPU设计verilog微处理器,源码/视频

名称&#xff1a;8位CPU设计微处理器 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 设计一个简单的处理器&#xff0c;可以实现加减法以及简单的逻辑运算。 设计包括程序计数器电路&#xff0c;指令存储器电路&#xff0c;指令译码器电路(控制器…

数字化转型系列主题:数据中台知识体系

当前&#xff0c;大部分企业不再建设从源数据采集到分析应用的烟囱式系统&#xff0c;更倾向于数据集中采集、存储&#xff0c;并应用分层建设。这种方式一方面有利于应用系统的快速部署&#xff0c;另一方面也保证了数据的集中管理与运营&#xff0c;体现数据的资产、资源属性…

异常---

目录 认识异常 自定义异常 认识异常 1.异常是什么&#xff1f; 2&#xff0e;异常的代表是谁&#xff1f;分为几类&#xff1f; Error &#xff1a;代表的系统级别错误&#xff08;属于严重问题&#xff09;&#xff0c;也就是说系统一旦出现问题&#xff0c; s u n 公司会把…

Unsatisfied dependency expressed through bean property ‘sqlSessionTemplate‘;

代码没有问题&#xff0c;但是启动运行报错 2023-10-25 16:59:38.165 INFO 228964 --- [ main] c.h.h.HailiaowenanApplication : Starting HailiaowenanApplication on ganluhua with PID 228964 (D:\ganluhua\code\java\hailiao-java\target\classes …

<多线程章节十> 定时器的使用方法以及定时器的模拟实现

文章目录 &#x1f490;专栏导读&#x1f4a1;Java标准库中的定时器类&#x1f4a1;模拟实现定时器 &#x1f490;专栏导读 本篇文章收录于多线程&#xff0c;也欢迎翻阅博主的其他文章&#xff0c;可能也会让你有不一样的收获&#x1f604; &#x1f342;JavaSE&#x1f337;多…

36基于matlab的对分解层数和惩罚因子进行优化

基于matlab的对分解层数和惩罚因子进行优化。蚁狮优化算法优化VMD,算术优化算法优化VMD&#xff0c;遗传优化算法优化VMD&#xff0c;灰狼优化算法优化VMD&#xff0c;海洋捕食者优化算法优化VMD&#xff0c;粒子群优化VMD&#xff0c;麻雀优化算法优化VMD&#xff0c;鲸鱼优化…

将安全作为首要目标 — Venus 的现状和前景展望

DeFi 的全面爆发将上一轮牛市推向巅峰。在不断的演化中&#xff0c;DeFi 领域也产生了很多新兴的细分领域&#xff0c;比如收益聚合器、合成资产、各种 DeFi 收益工具&#xff0c;以及最近整个市场都在讨论的 RWA 等。 DeFi 在不断进化&#xff0c;不变的是&#xff0c;DEX 和借…

Ocelot简易教程目录

Ocelot简易教程目录 这里写目录标题 Ocelot简易教程目录 Ocelot简易教程&#xff08;一&#xff09;之Ocelot是什么Ocelot简易教程&#xff08;二&#xff09;之快速开始1Ocelot简易教程&#xff08;二&#xff09;之快速开始2Ocelot简易教程&#xff08;三&#xff09;之主要特…

Makefile 基础教程:从零开始学习

在软件开发过程中&#xff0c;Makefile是一个非常重要的工具&#xff0c;它可以帮助我们自动构建程序&#xff0c;管理程序依赖关系&#xff0c;提高开发效率。本篇博客将从基础开始&#xff0c;介绍Makefile的相关知识&#xff0c;帮助大家快速掌握Makefile的使用方法 Makefil…