当前位置: 首页 > article >正文

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()

运行效果:

总结

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

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


http://www.kler.cn/a/522546.html

相关文章:

  • CTF从入门到精通
  • Vscode的AI插件 —— Cline
  • Java面试题2025-并发编程进阶(线程池和并发容器类)
  • OpenHarmony 5.0.2 Release来了!
  • 基于ollama,langchain,springboot从零搭建知识库三【解析文档并存储到向量数据库】
  • 从单体应用到微服务的迁移过程
  • Java并发学习:进程与线程的区别
  • zyNo.16(笔记web题型)
  • Java进阶(二):Java设计模式
  • 数据结构 栈
  • qt-QtQuick笔记之常见项目类简要介绍
  • 构建一个时间序列分析模型,用于股票市场预测
  • Python 数据清洗与处理常用方法全解析
  • MFC设置透明但不穿透窗体
  • 2023CISCN初赛unzip
  • 【kong gateway】5分钟快速上手kong gateway
  • 【数据结构】_链表经典算法OJ:环形链表的约瑟夫问题
  • 基于 Android 的日程管理系统的设计与实现
  • 状态码对照表
  • 蓝桥杯准备 【入门2】分支结构
  • STM32 EXTI中断配置
  • Lite.Ai.ToolKit - 一个轻量级的 C++ 工具包
  • labelimg闪退的解决办法
  • leetcode 2105. 给植物浇水 II
  • 【QT】- QUdpSocket
  • 2018年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题-解析版