OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录

简述

1. 瑞利噪声

2. 伽马噪声 

3. 脉冲噪声

4. 泊松噪声

总结


相关阅读

OpenCV:在图像中添加高斯噪声、胡椒噪声-CSDN博客

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客

OpenCV:图像处理中的低通滤波-CSDN博客

OpenCV:图像滤波、卷积与卷积核-CSDN博客


简述

在图像处理中,添加噪声是模拟真实场景的重要手段,用于测试算法的鲁棒性、增强模型的泛化能力或生成合成数据。以下介绍几种常见的噪声类型,包括:

  • 瑞利噪声
  • 伽马噪声
  • 脉冲噪声
  • 泊松噪声

并展示如何使用 Python 和 NumPy 添加这些噪声。


1. 瑞利噪声

瑞利噪声(Rayleigh Noise) 是一种基于瑞利分布的噪声类型,通常用于模拟实际场景中的噪声,例如图像中散射现象的模拟。以下是代码实现:

import cv2
import numpy as npdef add_rayleigh_noise(image, sigma=0.1):"""对图像添加瑞利噪声。参数:image (ndarray): 输入图像,范围 [0, 255]。sigma (float): 瑞利分布的尺度参数(控制噪声强度)。返回:noisy_image (ndarray): 添加噪声后的图像。"""# 归一化图像到 [0, 1]normalized_image = image / 255.0# 生成瑞利噪声rayleigh_noise = np.random.rayleigh(scale=sigma, size=normalized_image.shape)# 添加噪声并裁剪到 [0, 1]noisy_image = np.clip(normalized_image + rayleigh_noise, 0, 1)# 恢复到 [0, 255] 范围并转换为 uint8 类型return (noisy_image * 255).astype(np.uint8)# 读取图片
image = cv2.imread("D:\\resource\\huaji.jpg")# 添加瑞利噪声
noisy_image = add_rayleigh_noise(image, sigma=0.1)# 显示结果
cv2.imshow("Original", image)
cv2.imshow("Rayleigh", noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

2. 伽马噪声 

伽马噪声(Gamma Noise) 是一种基于伽马分布的随机噪声,常用于模拟图像中的统计波动,例如医学图像中的噪声。伽马噪声的强度可以通过分布的形状参数和尺度参数控制。

代码实现

import cv2
import numpy as npdef add_gamma_noise(image, shape=2.0, scale=0.1):"""对图像添加伽马噪声。参数:image (ndarray): 输入图像,范围 [0, 255]。shape (float): 伽马分布的形状参数(k)。scale (float): 伽马分布的尺度参数(theta)。返回:noisy_image (ndarray): 添加噪声后的图像。"""# 归一化图像到 [0, 1]normalized_image = image / 255.0# 生成伽马噪声gamma_noise = np.random.gamma(shape, scale, normalized_image.shape)# 添加噪声并裁剪到 [0, 1]noisy_image = np.clip(normalized_image + gamma_noise, 0, 1)# 恢复到 [0, 255] 范围并转换为 uint8 类型return (noisy_image * 255).astype(np.uint8)# 读取图像
image = cv2.imread("D:\\resource\\huaji.jpg")# 添加伽马噪声
noisy_image = add_gamma_noise(image, shape=2.0, scale=0.1)# 显示结果
cv2.imshow("Original", image)
cv2.imshow("Gamma", noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

3. 脉冲噪声

脉冲噪声 (Salt-and-Pepper Noise) 是一种二值噪声,其中像素值随机变为 0(胡椒噪声) 或 255(盐噪声)。

代码实现

import cv2
import numpy as npdef add_salt_and_pepper_noise(image, salt_prob=0.02, pepper_prob=0.02):"""对彩色图片添加脉冲噪声(Salt-and-Pepper Noise)。参数:image (ndarray): 输入彩色图片。salt_prob (float): 盐噪声的比例。pepper_prob (float): 胡椒噪声的比例。返回:noisy_image (ndarray): 添加噪声后的图片。"""# 确保输入图像为整数型noisy_image = image.copy()h, w, c = noisy_image.shape# 添加盐噪声num_salt = int(salt_prob * h * w)salt_coords = [np.random.randint(0, i - 1, num_salt) for i in noisy_image.shape[:2]]noisy_image[salt_coords[0], salt_coords[1], :] = 255  # 对所有通道添加盐噪声# 添加胡椒噪声num_pepper = int(pepper_prob * h * w)pepper_coords = [np.random.randint(0, i - 1, num_pepper) for i in noisy_image.shape[:2]]noisy_image[pepper_coords[0], pepper_coords[1], :] = 0  # 对所有通道添加胡椒噪声return noisy_image# 读取彩色图片
image = cv2.imread("D:\\resource\\huaji.jpg")# 添加脉冲噪声
noisy_image = add_salt_and_pepper_noise(image, salt_prob=0.02, pepper_prob=0.02)# 显示结果
cv2.imshow("Original", image)
cv2.imshow("Salt-Pepper", noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

4. 泊松噪声

泊松噪声 (Poisson Noise)服从泊松分布,通常用于模拟光子计数中的噪声。

泊松分布的概率质量函数为:

代码实现

import cv2
import numpy as np# 读取彩色图像
image = cv2.imread("D:\\resource\\huaji.jpg")# 将图像归一化到 [0, 1]
normalized_image = image / 255.0# 为每个通道添加泊松噪声
noisy_image = np.zeros_like(normalized_image)
for i in range(3):  # 对每个通道独立添加噪声noisy_channel = np.random.poisson(normalized_image[:, :, i] * 255) / 255.0noisy_image[:, :, i] = np.clip(noisy_channel, 0, 1)  # 保证范围在 [0, 1]# 恢复到 [0, 255] 并转换为 uint8 类型
noisy_image = (noisy_image * 255).astype(np.uint8)# 显示结果
cv2.imshow("Original", image)
cv2.imshow("Poisson", noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

总结

噪声类型特点应用场景
瑞利噪声偏向单侧分布,常用于雷达信号模拟合成数据、特殊场景模拟
伽马噪声控制形状和尺度,用于多样化数据增强医学图像模拟
脉冲噪声随机黑白点,模拟传感器故障降噪算法测试
泊松噪声用于低光条件下图像噪声模拟光子计数噪声分析

通过添加不同类型的噪声,可以帮助我们测试图像处理算法的鲁棒性,并更真实地模拟图像在复杂环境中的表现。

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

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

相关文章

小智 AI 聊天机器人

小智 AI 聊天机器人 (XiaoZhi AI Chatbot) 👉参考源项目复现 👉 ESP32SenseVoiceQwen72B打造你的AI聊天伴侣!【bilibili】 👉 手工打造你的 AI 女友,新手入门教程【bilibili】 项目目的 本…

如何学习Java后端开发

文章目录 一、Java 语言基础二、数据库与持久层三、Web 开发基础四、主流框架与生态五、分布式与高并发六、运维与部署七、项目实战八、持续学习与提升总结路线图 学习 Java 后端开发需要系统性地掌握多个技术领域,从基础到进阶逐步深入。以下是一个详细的学习路线和…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图,但是底层依赖了yahboomcar_bringup做底层的数据处理,所以先把依赖的工程导入。 程序启动后,会订阅imu和odom数据,过滤掉一部分的imu数据后,然后与odom数据进行融合,最后输出一个…

C++中的类与对象(中)

在上一节中,我们初步了解了一下,C中的类,这一概念,这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点: 1.2 析构函数 析构函数的特点: 1.3 …

Java坦克大战

画图基础 先定义画板类, 用于画图 // 定义画板类画板,用于画图 class MyPanel extends JPanel{// Graphics g是一只画笔// Graphics 提供了绘画方法public void paint(Graphics g){super.paint(g);g.drawOval(0,0,100,100);}}定义窗口类,用于显示画板 // public类…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…

redis数据安全与性能保障

数据安全与性能保障 1、持久化1.1 快照持久化1.2 AOF持久化1.3 重写/压缩AOF文件 2、复制2.1 Redis复制的启动过程2.2 主从链 3、处理系统故障3.1 验证快照文件和AOF文件 4、事务4.1 java中的redis事务使用 如有侵权,请联系~ 如有错误,也欢迎…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯: 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子,不管配置是否基本齐全; 绿色:指示灯说明一切正常,已成功执行算子。 (2)三角…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

js笔记(黑马程序员)

(Web APIs day4) 一、日期对象 1.实例化 在代码中发现了 new 关键字时,一般将这个操作称为实例化 创建一个时间对象并获取时间// 1.得到当前时间 2.日期对象方法 因为日期对象返回的数据我们不能直接使用,所以需…

Java基础知识总结(三十)--泛型

jdk1.5版本以后出现的一个安全机制。表现格式&#xff1a;< > 好处&#xff1a; 1&#xff1a;将运行时期的问题ClassCastException问题转换成了编译失败&#xff0c;体现在编译时期&#xff0c;程序员就可以解决问题。 2&#xff1a;避免了强制转换的麻烦。 只要带有…

SOME/IP--协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…

python-leetcode-反转链表 II

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseBetween(self, head: Optional…

LM Studio 本地部署DeepSeek及其他AI模型的详细操作教程及硬件要求

本篇文章主要讲解&#xff0c;通过LM Studio工具实现各类型AI模型本地部署的操作方法方式。 作者&#xff1a;任聪聪 日期&#xff1a;2025年1月29日 LM Studio 介绍&#xff1a; LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用&#xff0c;通过LM Studio 可以…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

doris:HLL

HLL是用作模糊去重&#xff0c;在数据量大的情况性能优于 Count Distinct。HLL的导入需要结合hll_hash等函数来使用。更多文档参考HLL。 使用示例​ 第 1 步&#xff1a;准备数据​ 创建如下的 csv 文件&#xff1a;test_hll.csv 1001|koga 1002|nijg 1003|lojn 1004|lofn …

在Rust应用中访问.ini格式的配置文件

在Rust应用中访问.ini格式的配置文件&#xff0c;你可以使用第三方库&#xff0c;比如 ini 或 config. 下面是一个使用 ini 库的示例&#xff0c;该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先&#xff0c;你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…

Janus Pro:DeepSeek 开源革新,多模态 AI 的未来

Janus Pro 是 DeepSeek 开发的一个开源多模态人工智能框架&#xff0c;它通过集成视觉和语言处理能力&#xff0c;提供了高性能的多模态任务处理能力。 在线体验&#xff1a; https://deepseek-januspro.com/ 背景 Janus Pro 于2025年1月发布&#xff0c;是一个开源的多模态…

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…

指针的介绍3前

1.字符指针变量 1.1介绍 char arr[] "abcdef";char* p arr; 上面的代码中&#xff0c;我创建了 字符数组 arr 来存储一个字符串 此时&#xff0c;我可以创建一个指针变量对这个字符串进行相应的修改&#xff1a; 我也可以创建一个指针变量指向一个字符串&#xff…