图像去噪滤波算法汇总(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.mzph.cn/news/119799.shtml

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

相关文章

多线程的学习01

什么是线程 线程是为了解决并发编程引入的机制,线程相比进程来说更轻量。 创建线程比创建进程——开销更小 销毁线程比销毁进程——开销更小 调度线程比调度进程——开销更小 进程包含线程,同一进程里的若干线程之间,共享着内存资源和文件描…

8.稳定性专题

1. anr https://code84.com/303466.html 一句话,规定的时间没有干完要干的事,就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…

C语言重点突破(四)自定义类型详解

前言 本文意在介绍C语言里的常规自定义类型,它是C语言里最重要的概念之一,是我们从简单使用C语言到综合运用必不可少的知识之一,在C语言中具有重要的地位和作用,掌握自定义类型的使用方法和技巧对于写出高质量的C程序是非常重要的…

prometheus监控kafka

一、前言 关于对kafka的监控,要求高的话可以使用kafka-exorter和jmx-exporter一起收集监控数据,要求不高的情况下可以使用kafka-exporter收集监控数据即可 二、部署 kafka-exporter 部署kafka-exporter,我是在k8s集群中部署的 编辑yaml文件…

0基础学习PyFlink——用户自定义函数之UDAF

大纲 UDAF入参并非表中一行(Row)的集合计算每个人考了几门课计算每门课有几个人考试计算每个人的平均分计算每课的平均分计算每个人的最高分和最低分 入参是表中一行(Row)的集合计算每个人的最高分、最低分以及所属的课程计算每课…

UI自动化测试工具推荐

UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。然而,可视化工具也存在一些潜在的劣势。本文将探讨…

【iOS安全】提取app对应的URLScheme

获取app的URLScheme 在已越狱的iPhone上,使用Filza进入app列表目录: /private/var/containers/Bundle/Application/ 比如我要分析Microsoft Authenticator,明显对应的是这里面的“Authenticator”,那就在Filza中点击进入“Authen…

MySQL多表关联on和where速度对比实测谁更快

MySQL多表关联on和where速度对比实测谁更快 背景 今天发现有人在讨论:两张MySQL的数据表按照某一个字段进行关联的时候查询,我们使用on和where哪种查询方式更快。百闻不如一见,我们来亲自测试下。 先说结论 Where、对等查询的join速度基本…

Android WMS——概述(一)

Android 中的 WMS 指的是 Window Manager Service(窗口管理服务)。WMS 是 Android 系统中的核心服务,主要分为四大部分,分别是窗口管理,窗口动画,输入系统中转站和 Surface 管理 。负责管理应用程序窗口的创建、移动、调整大小和显示等操作。 一、功能简介 WMS 的职责可…

在Eclipse中使用Junit

1、准备测试类 public class Calculator {private static int result;public void add(int n) {result result n;} public void substract(int n) {result result -1; //Bug:正确的应该是resultresult-n}public void multiply(int n) {// result result*n;方法未写好}publi…

2.9每日一题(定积分的奇偶性以及比较大小)

1、用定积分奇函数和偶函数的性质 2、用常用的基本不等式推出大小 3、用区间相同的情况下被积函数大的定积分大的定理

嵌入式系统设计师考试笔记之操作系统基础复习笔记二

目录 3、任务管理 (1)嵌入式操作系统的任务管理可以分为 (2)进程 (3)线程 (4)任务 (5)任务的创建与中止 (6)任务的状态任务有三…

Spring Boot 使用 Disruptor 做内部高性能消息队列

这里写自定义目录标题 一 、背景二 、Disruptor介绍三 、Disruptor 的核心概念3.1 Ring Buffer3.2 Sequence Disruptor3.3 Sequencer3.4 Sequence Barrier3.5 Wait Strategy3.6 Event3.7 EventProcessor3.8 EventHandler3.9 Producer 四、案例-demo五、总结 一 、背景 工作中遇…

代码随想录算法训练营第2天| 977有序数组的平方、209长度最小的子数组。

JAVA代码编写 977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释&…

postgis ST_CoverageInvalidEdges使用说明

官方文档 函数说明 概要 geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance 0); 描述 一个窗口函数,用于检查窗口分区中的多边形是否形成有效的多边形覆盖范围。 它返回线性指示器,显示每个多边形中无效边(如果…

【微信小程序】实现投票功能(附源码)

一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发…

知识付费系统的移动应用开发:跨平台和原生应用的比较

移动应用在知识付费系统中发挥着重要作用,为用户提供了便捷的访问方式。在开发知识付费系统的移动应用时,开发团队通常需要考虑使用跨平台开发工具或原生开发。本文将比较这两种方法,讨论它们的优点和缺点,并提供示例代码来说明它…

面向对象设计原则之接口隔离原则

目录 定义接口隔离原则与单一职责原则示例 定义 接口隔离原则,全称为 Interface Segregation Principle,缩写ISP。 原始定义:Clients should not be forced to depend upon interfaces that they don’t use。 翻译: 不应该强行…

k8s 部署nginx前端

1.构建docker镜像,k8s拉取镜像运行 ​​​​​​​docker自己安装 [rootmaster1 ~]# docker pull nginx:1.24.0 [rootmaster1 ~]# mkdir k8s-nginx [rootmaster1 ~]# cd k8s-nginx [rootmaster1 k8s-nginx]# vim nginx.conf server_tokens off;server {listen …

MVC架构_Qt自己的MV架构

文章目录 前言模型/视图编程1.先写模型2. 视图3. 委托 例子(Qt代码)例1 查询本机文件系统例2 标准模型项操作例3 自定义模型示例:军事武器模型例4 只读模型操作示例例5 选择模型操作例6 自 定 义委 托(在testSelectionModel上修改) 前言 在Qt中&#xf…