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

目录

简述

1. 瑞利噪声

2. 伽马噪声 

3. 脉冲噪声

4. 泊松噪声

总结


相关阅读

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

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

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

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


简述

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

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

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


1. 瑞利噪声

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

import cv2
import numpy as np

def 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 np

def 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 np

def 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.0
    noisy_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()

运行效果:

总结

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

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

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

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

相关文章

github制作静态网页

打开gihub并新建仓库 命名仓库:xxx.github.io 点击create repository进行创建 点击蓝色字体“creating a new file”创建文件 文件命名为index.html, 并编写html 右上角提交 找到setttings/pages,修改路径,点击保存,等…

从 SAP 功能顾问到解决方案架构师:破茧成蝶之路

目录 行业瞭望:架构师崭露头角 现状剖析:功能顾问的局限与机遇 能力跃迁:转型的核心要素 (一)专业深度的掘进 (二)集成能力的拓展 (三)知识广度的延伸 &#xff0…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景,在构建中包含的场景 (否则会认为是失效的Scene) 2.4 Scenes in Bui…

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐! 接之前wiki 35、【OS】【Nuttx】OSTest分析(1):stdio测试(五) 已经分析完了第一个测试项,输入输出端口测试,接下来分析下环境变量测试,也比较…

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎,能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中,Ollama是一个非常方便的工具,它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类, auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误: end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP:10.10.16.21 靶机IP:10.10.10.161 靶机Domain:forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意:GateWay不能跟Web一起引入! 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…

STM32 PWM驱动直流电机

接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…

强大到工业层面的软件

电脑数据删不干净,简直是一种让人抓狂的折磨!明明已经把文件扔进了回收站,清空了,可那些残留的数据就像牛皮癣一样,怎么也除不掉。这种烦恼简直无处不在,让人从头到脚都感到无比烦躁。 首先,心…

一分钟搭建promehteus+grafana+alertmanager监控平台

为什么要自己搭建一个监控平台 平时进行后端开发,特别是微服务的后端可开发,一定少不了对接监控平台,但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试,这里我使用docker-compose搭建了一个…

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

崇州市街子古镇正月初一繁华剪影

今天是蛇年正月初一,下午笔者步出家门,逛到了崇州市街子古镇井水街,想看看景象如何。结果看到的是车水马龙、人流如织,繁花似锦,热闹非凡,原来今天开始预订此地摆下的长街宴。心里高兴,便用手机…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音(TTS)技术已经成为人工智能领域的重要一环,无论是语音助手、教育内容生成,还是音频文章创作,TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS,一款基于 Microsoft Edge 在线文本…

练习(复习)

大家好,今天我们来做几道简单的选择题目来巩固一下最近学习的知识,以便我们接下来更好的学习。 这道题比较简单,我们前面学过,在Java中,一个类只能继承一个父类,但是一个父类可以有多个子类,一个…

Meta推动虚拟现实:Facebook如何进入元宇宙时代

随着科技的不断进步,虚拟现实(VR)与增强现实(AR)技术的快速发展,世界正在逐步迈向一个全新的数字时代——元宇宙。而在这个革命性的转变中,Meta(前身为Facebook)作为全球…