图像去噪简单介绍—并给出示例代码

news2024/10/7 17:25:31

文章目录

  • 图像去噪简单介绍—并给出示例代码
    • 去噪的基本原理
    • 常见的噪声类型
      • 高斯噪声
      • 椒盐噪声
      • 马赛克噪声
      • 脉冲噪声
    • 添加噪声的代码
      • 添加高斯噪声
      • 添加椒盐噪声
    • noise_pic
    • 常用的去噪方法
      • 均值滤波
      • 中值滤波
      • 高斯滤波
      • 双边滤波
      • 基于深度学习的图像去噪
    • 总结
    • 图片来源

图像去噪简单介绍—并给出示例代码

图像去噪是指在图像中移除噪声,以使其更加清晰。在本教程中,我们将深入介绍图像去噪的基本原理、常见噪声类型,以及几种常用的去噪方法,包括传统的滤波方法和深度学习方法。

去噪的基本原理

在讲解去噪的方法之前,我们需要了解一些基本原理。噪声通常被定义为信号中的任何不希望的成分,它们可能来自摄像机或传感器中的电子噪声,图像传输过程中的信号干扰,或者是在拍摄时因环境条件而产生的混淆,比如高温、强光或者颜色失真等。

去噪的主要原理就是对噪声进行消除或压制,并尽可能保留原始图像的特征。在去噪过程中,我们需要将图像中的噪声与有用的图像信息区分开来,并尝试还原原始图像的细节和信息。

常见的噪声类型

在图像去噪之前,了解不同类型的噪声及其统计特性非常重要。下面介绍几种常见的噪声类型。

高斯噪声

高斯噪声是一种满足正态分布的噪声类型,它可以形成在各种摄像机、传感器、通信通道中,通常是由于不可避免的随机波动造成的。

椒盐噪声

椒盐噪声通常是由于数字图像传输或存储过程中丢失像素信息造成的。它会在图像中随机出现黑色或白色像素,对图像质量造成明显的影响。

马赛克噪声

马赛克噪声通常是由于像素化和压缩造成的,这种噪声让图像看起来像是由一组相同颜色的小方块组成的,从而影响图像的质量和清晰度。

脉冲噪声

脉冲噪声是由于短时间内发生的突发性信号造成的。它通常表现为明显的高亮度/低亮度的像素点,对图像的质量和清晰度造成极大影响。

添加噪声的代码

添加高斯噪声

以下是使用 Python 和 NumPy 库为一个图像添加高斯噪声的示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg')

# 添加高斯噪声
mean = 0
var = 0.1
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
gaussian = gaussian.reshape(img.shape)
noisy_img = img + gaussian

# 将像素值限制在 0 和 255 之间
noisy_img = np.clip(noisy_img, 0, 255)

# 显示带噪声的图像
cv2.imshow('noisy image', noisy_img.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 input.jpg 的图像。然后,我们使用 NumPy 库中的 np.random.normal() 函数生成一个与输入图像大小相同的高斯噪声数组,并将其加到输入图像中。最后,我们使用 np.clip() 函数将像素值限制在 0 和 255 之间,并使用 cv2.imshow() 函数显示带噪声的图像。

在添加高斯噪声时,我们可以调整 var 参数来控制噪声的强度。如果 var 值较小,噪声将不太明显;如果 var 值较大,噪声将更明显。

添加椒盐噪声

以下是使用 Python 和 NumPy 库为一个图像添加椒盐噪声的示例代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg')

# 添加椒盐噪声
p = 0.05  # 像素点被替换为椒盐噪声的概率
salt_vs_pepper = 0.5  # 椒盐噪声的比例
num_salt = np.ceil(p * img.size * salt_vs_pepper)
num_pepper = np.ceil(p * img.size * (1.0 - salt_vs_pepper))
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
img[coords[0], coords[1], :] = 255
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
img[coords[0], coords[1], :] = 0

# 显示带噪声的图像
cv2.imshow('noisy image', img.astype(np.uint8))
cv2.imwrite('noise_pic.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 input.jpg 的图像。然后,我们使用 NumPy 库中的随机数函数来生成椒盐噪声,并将其添加到原始图像中。其中,p 是像素点被替换为椒盐噪声的概率,salt_vs_pepper 是椒盐噪声的比例,num_saltnum_pepper 是椒盐噪声点的数量。最后,我们使用 cv2.imshow() 函数显示带噪声的图像。

请注意,椒盐噪声会随机替换像素点的值为黑色或白色,因此它会严重破坏图像的细节和特征。因此,为了使噪声更加真实,通常需要在添加椒盐噪声时使用一些概率和比例参数来控制噪声的数量和分布。

同时添加高斯和椒盐噪声,处理图片之后如下所示。

import cv2
import numpy as np

# 读取图像
img = cv2.imread('pic_2.png')

# 添加高斯噪声
mean = 0
var = 0.1
sigma = var ** 0.5
# 生成符合高斯分布的随机噪声,均值为0,标准差为sigma
gaussian = np.random.normal(mean, sigma, img.shape)
# 将噪声的形状改为与原始图像相同
gaussian = gaussian.reshape(img.shape)
# 将随机噪声添加到原始图像中
noisy_img = img + gaussian

# 添加椒盐噪声
s_vs_p = 0.5
amount = 0.05
# 计算添加的椒盐噪声点的数量
num_salt = np.ceil(amount * img.size * s_vs_p)
num_pepper = np.ceil(amount * img.size * (1.0 - s_vs_p))
# 生成坐标数组,用于添加椒盐噪声
coords_salt = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
coords_pepper = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
# 将椒盐噪声点的像素值分别设置为白色和黑色
noisy_img[coords_salt[0], coords_salt[1], :] = 255
noisy_img[coords_pepper[0], coords_pepper[1], :] = 0

# 将像素值限制在 0 和 255 之间
noisy_img = np.clip(noisy_img, 0, 255)

# 显示带噪声的图像
cv2.imshow('noisy image', noisy_img.astype(np.uint8))
cv2.imwrite('noise_pic.jpg', noisy_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图

noise_pic

整幅原图如下:
请添加图片描述

常用的去噪方法

下面介绍几种常用的去噪方法。

均值滤波

均值滤波是一种基本的线性滤波算法,它是指通过取周围像素的平均值,来代替当前像素的值。这种方法适用于图像中的高斯噪声。噪声越多,需要取的邻域像素值就越多。具体操作如下:

  1. 首先,我们需要选取一个大小为 m×n 的窗口(m* 和 n* 一般为奇数)。
  2. 将该窗口置于图像的每一个像素上。
  3. 取窗口中所有像素的平均值,并将其设置为当前像素的值。
import cv2

# 读取图像
img = cv2.imread('noise_pic.jpg')

# 均值滤波
dst = cv2.blur(img, (3, 3))

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

中值滤波

中值滤波是一种简单而有效的图像去噪方法。它的原理是将每个像素的值替换为它周围像素值的中位数。这种方法特别适用于消除椒盐噪声,即随机黑白像素点。

中值滤波是一种非线性滤波方法,它是通过取邻域像素值的中值来代替当前像素的值。相比于均值滤波,中值滤波更能保留图像的细节。因此,它更适用于椒盐噪声等噪声类型(其中一些像素会被明显赋值为黑或白)。具体操作如下:

  1. 首先,我们需要选取一个大小为 m×n* 的窗口(m* 和 n* 一般为奇数)。
  2. 将该窗口置于图像的每一个像素上。
  3. 取窗口中所有像素的中值,并将其设置为当前像素的值。
import cv2

# 读取图像
img = cv2.imread('input.jpg')

# 中值滤波
dst = cv2.medianBlur(img, 3)

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

高斯滤波

高斯滤波是一种广泛应用的图像去噪方法。它的原理是将每个像素的值替换为其周围像素值的加权平均值,其中权重由高斯函数计算得出。高斯滤波器可以消除高斯噪声和一些其他类型的噪声。

以下是使用 Python 和 OpenCV 库去除图像中高斯噪声的示例代码:

import cv2
import numpy as np

# 读取带噪声的图像
img = cv2.imread('noisy_image.jpg')

# 去除高斯噪声
denoised_img = cv2.GaussianBlur(img, (5, 5), 0)

# 显示去噪后的图像
cv2.imshow('denoised image', denoised_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先使用 cv2.imread() 函数读取一个名为 noisy_image.jpg 的带有高斯噪声的图像。然后,我们使用 OpenCV 库中的 cv2.GaussianBlur() 函数应用高斯模糊来去除图像中的噪声。其中 (5, 5) 是高斯核的大小,可以根据图像的噪声强度和大小进行调整。最后,我们使用 cv2.imshow() 函数显示去噪后的图像。

请注意,高斯模糊也会使图像变得模糊,因此需要小心选择模糊核的大小。如果模糊核的大小太大,可能会导致图像失去细节和清晰度。

双边滤波

双边滤波是一种非线性滤波方法,可以在保留图像边缘信息的同时消除噪声。它的原理是根据像素之间的空间距离和像素值之间的差异来计算像素之间的相似度,然后将每个像素值替换为其周围像素的加权平均值。

import cv2

# 读取图像
img = cv2.imread('input.jpg')

# 双边滤波
dst = cv2.bilateralFilter(img, 7, 50, 50)

# 保存处理后的图像
cv2.imwrite('output.jpg', dst)

基于深度学习的图像去噪

基于深度学习的图像去噪方法利用卷积神经网络(Convolutional Neural Networks,CNN)来进行图像去噪。它将图像去噪问题看作是一个回归问题,在训练阶段使用带有噪声的图像作为输入,纯净的图像作为输出进行训练。在测试阶段,CNN可以根据噪声图像进行推理,从而输出一张去噪后的图像。相较于传统的滤波方法,基于深度学习的图像去噪能够在去除噪声的同时更好地保留图像的细节。

总结

图像去噪是一个广泛的领域,涉及许多技术和方法。在实际应用中,我们可以根据不同的噪声类型和去噪需求,选择不同的去噪方法,以便得到更好的去噪效果。在未来,随着技术的不断发展,图像去噪的方法和算法会不断改进和更新。

图片来源

网站:wallhaven

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

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

相关文章

Win11如何下载安装java?

一、问题描述 我在复现论文代码的时候,遇到了这样的问题: 我没有下载java,那么该如何解决呢? 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序。Java 是一种广泛使用的编程语言,可用于开发各…

【leetcode刷题总结】——代码随想录(数组总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。 以下是个人刷题总结,…

多线程编程的安全问题和解决措施

线程不安全的概念 由于多线程并发执行,导致结果出错,我们称这种线程是不安全的。 多线程编程出错的原因 一:线程之间并发执行的随机性导致线程不安全 二:多个线程对同一个对象进行修改 三:线程的操作不是原子性的…

Vscode搭建ESP-IDF开发环境指南-Ubuntu ESP32-C3 合宙

文章目录 1.Ubuntu环境搭建2.vscode安装3.esp-idf插件如果到这里没出现问题的话,就能顺利安装了,如果出现问题会在输出那一栏里报错,根据错误去找原因就好,常见的错误就是网络原因以及之前的依赖包没有装好 ![](https://img-blog.…

优思学院|受控文件在质量管理体系中的作用?

在质量管理体系中,受控文件是指受到控制和管理的文件,包括政策、程序、指南、规程、说明书、作业指导书、记录等,它们记录了组织内各种活动的要求和实施方法,并规定了文件的创建、审批、发布、变更和废止等流程,以确保…

宝塔怎么安装青龙面板-跑京东豆脚本

一、搭建青龙面板 安装docker管理器 我们使用宝塔的Docker管理器来一键安装Docker 在软件商店内搜索Docker,直接安装第一个应用即可。 拉取镜像运行容器 在安装完docker之后我们就可以开始拉取docker镜像并运行容器了,ssh连接服务器命令行中输入下面的代码: docker run …

TOGAF架构内容—TOGAF 内容框架和企业元模型

一、概述 TOGAF ADM 提供了一个流程生命周期,用于在企业内创建和管理架构。在 ADM,对输入、输出和步骤的讨论,描述了许多架构工作产品或工件,例如过程和 应用。 此处提供的内容框架和企业元模型为这些术语定义了正式结构&#x…

【python】NameError: No such file or directory 问题解决

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 1. 问题 最近有小伙伴经常问到这个报错,今天来分享一下具体怎么解决。 [Errno 2] No such file or directory: ./mnist_image_label/mnist_train_jpg_60000.txt这个没有查找到子文件或者子文件夹的问题 2. 解决…

WIZnet 的 TOE 设计大赛

链接: TOE Design Contest 介绍 欢迎来到 WIZnet 的年度物联网设计大赛! TOE 竞赛是对您的 IoT 技能和创造力的终极考验。 借助强大的 W5300 网络控制器芯片,您将能够以前所未有的方式将您的物联网愿景变为现实。 无论您是经验丰富的专业人士还是刚刚起…

计算机提示vcruntime140.dll丢失是什么意思?vcruntime140.dll丢失的解决方法(详细方法)

计算机丢失vcruntime140.dll是什么意思?经常看到有小伙伴有在网上问这样的问题,电脑上这个vcruntime140.dll文件丢失的问题经常发生吧,那么就很有必要给大家详细的说说这一方面的问题了,下面我们来看看 第一:vcruntim…

RocketMQ的简单使用

大家好,我是Leo!今天来和大家分享RocketMQ的一些用法。 领域模型介绍 Producer: 用于生产消息的运行实体。 Topic: 主题,用于消息传输和存储的分组容器。 MessageQueue: 消息传输和存储的实际单元容器。 Message: 消息传输的最小单元。 C…

如何让你的 WebSocket 接口测试更高效?拯救你的接口测试工作

目录 引言 WebSocket介绍 HTTP与WebSocket的区别 WebSocket测试方法 使用在线工具 使用Postman 使用Jmeter 使用Python 结语 引言 你是否曾经为 WebSocket 接口测试中复杂的协议和难以捕获的数据而感到束手无策?WebSocket 协议与传统的 HTTP 协议不同&…

【牛客网】美国节日与因式分解

目录 一、编程题 1.美国节日 2.因式分解 一、编程题 1.美国节日 链接:美国节日__牛客网 (nowcoder.com) 和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下&#xff1a…

volatile与synchronized

文章目录 前言一、简介volatilesynchronized 二、名词解释可见性原子性指令重排临界区对象锁类锁 二、实战使用1 Volatile可以解决的问题2 volatile无法解决非原子性操作问题--synchronized 总结 前言 volatile与synchronized 都是java的关键字 volatile一般修饰变量,被修饰的…

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !

前段時间,在网上看到一句话:有什么事情,比窮更可怕? 有人回答说:“又忙又窮。” 很扎心,却是绝大多数人的真实写照。 每天拼死拼活的996,你有算过你的時间值多少钱? 我们来算一笔…

操作系统——死锁

0.关注博主有更多知识 操作系统入门知识合集 目录 5.1死锁概念 5.2死锁的起因 5.3预防死锁的策略 思考题: 5.1死锁概念 在介绍死锁之前,先来探究一个问题:哲学家就餐问题。五个哲学家围坐在圆桌边,有5支筷子,哲…

免费的绘图工具DrowIO下载及安装

还在为论文绘图而烦恼吗?还在为如何选择画图工具而烦恼吗?没事,本期就给你们推荐一款超级好用且免费的绘图工具——DrawIO。 目前使用比较多的绘图工具有:Visio、亿图图示、Word、PPT、DrawIO等 其中DrawIO由于其既实用又免费的…

使用 Esp32 和 TinyML 进行手势分类

介绍 手势分类是机器学习可以做什么的一个简单但同时又很好的例子。它使用大量“混乱”的数据来对事物进行分类。 在这个项目中,我们将制作一个包含 4 个类的分类器,idle、up_down、left_right 和 circle。 数据采集 要将数据上传到 Edge Impulse,我们需要使用 Edge Imp…

199. 二叉树的右视图【111】

难度等级:中等 上一篇算法: 236. 二叉树的最近公共祖先【190】 力扣此题地址: 199. 二叉树的右视图 - 力扣(Leetcode) 1.题目:199. 二叉树的右视图 给定一个二叉树的 根节点 root,想象自己站在…

JavaScript事件

事件流描述的是从页面接收事件的顺序。比如说单击了某个按钮&#xff0c;但是单击事件不仅发生在按钮上&#xff0c;在单击按钮的同时&#xff0c;也单击了按钮的容器元素&#xff0c;甚至是 <body> 、<html> 、document。 事件传播的顺序不同导致存在两种事件流机…