c/c++的opencv椒盐噪声

在 C/C++ 中实现椒盐噪声

椒盐噪声(Salt-and-Pepper Noise),也称为脉冲噪声(Impulse Noise),是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现纯白色(盐)或纯黑色(椒)的像素点,看起来就像在图像上撒了盐和胡椒一样。这种噪声通常由图像传感器、传输错误或存储介质损坏等原因引起。

本文将介绍椒盐噪声的基本原理,并提供一个使用 C/C++ 实现向图像添加椒盐噪声的示例。

什么是椒盐噪声?

椒盐噪声会随机地将图像中的一些像素替换为最大值(通常是255,代表“盐”像素,即白色)或最小值(通常是0,代表“椒”像素,即黑色)。其他未受影响的像素则保持其原始值。

主要特点:

  • 外观: 图像中散布着孤立的亮点和暗点。
  • 影响: 噪声像素的值与周围像素的值有显著差异。
  • 密度: 椒盐噪声的强度通常用噪声密度来描述,即图像中受噪声污染的像素所占的百分比。

添加椒盐噪声的算法

向图像添加椒盐噪声的基本算法步骤如下:

  1. 遍历图像像素: 依次处理图像中的每一个像素,或者随机选择一定比例的像素进行处理。
  2. 生成随机数: 对每个待处理的像素,生成一个随机数(通常在 [0, 1] 区间内)。
  3. 判断是否添加噪声:
    • 将此随机数与预设的噪声密度阈值 d 进行比较。如果随机数小于 d,则该像素将被噪声污染。
  4. 确定噪声类型(盐或椒):
    • 如果像素被确定为噪声点,则再生成一个随机数(例如,也在 [0, 1] 区间内)。
    • 根据这个新的随机数决定是添加“盐”噪声还是“椒”噪声。例如,可以设定一个概率 p_salt(通常为0.5),如果随机数小于 p_salt,则将像素值设为最大值(如255);否则,设为最小值(如0)。
  5. 保持原样: 如果步骤3中判断像素不被噪声污染,则其像素值保持不变。

C/C++ 实现示例

下面是一个简单的 C/C++ 函数,用于向灰度图像(以二维数组表示)添加椒盐噪声。为了简化,我们假设像素值范围是 0 到 255。

#include <iostream>
#include <vector>
#include <cstdlib> // 用于 rand() 和 srand()
#include <ctime>   // 用于 time()// 假设图像数据结构
// 这里使用 std::vector<std::vector<int>> 来表示灰度图像
// 实际应用中可能是自定义的图像类或指向像素数据的指针/*** @brief 向灰度图像添加椒盐噪声* @param image 图像数据 (引用传递,会被直接修改)* @param noiseDensity 噪声密度 (0.0 到 1.0),表示受影响像素的比例* @param saltPepperRatio “盐”噪声相对于总噪声的比例 (0.0 到 1.0)* 例如,0.5 表示盐和椒的概率各占一半*/
void addSaltAndPepperNoise(std::vector<std::vector<int>>& image, double noiseDensity, double saltPepperRatio = 0.5) {if (image.empty() || image[0].empty()) {std::cerr << "错误:图像数据为空!" << std::endl;return;}if (noiseDensity < 0.0 || noiseDensity > 1.0) {std::cerr << "错误:噪声密度必须在 [0.0, 1.0] 之间!" << std::endl;return;}if (saltPepperRatio < 0.0 || saltPepperRatio > 1.0) {std::cerr << "错误:盐/椒比例必须在 [0.0, 1.0] 之间!" << std::endl;return;}int rows = image.size();int cols = image[0].size();// 初始化随机数生成器// 注意:srand() 最好在程序开始时调用一次,而不是每次调用函数时都调用// 这里为了示例的独立性,放在函数内部,但实际项目中应避免重复调用// static bool srand_called = false;// if (!srand_called) {//     srand(static_cast<unsigned int>(time(0)));//     srand_called = true;// }for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {// 生成一个0到1之间的随机数double randVal = static_cast<double>(rand()) / RAND_MAX;if (randVal < noiseDensity) {// 该像素被噪声污染double saltOrPepper = static_cast<double>(rand()) / RAND_MAX;if (saltOrPepper < saltPepperRatio) {image[i][j] = 255; // 盐噪声 (白色)} else {image[i][j] = 0;   // 椒噪声 (黑色)}}// else: 像素保持不变}}
}// 辅助函数:打印图像 (用于测试)
void printImage(const std::vector<std::vector<int>>& image) {if (image.empty()) return;for (const auto& row : image) {for (int pixel : row) {std::cout.width(4); // 设置输出宽度,方便对齐std::cout << pixel << " ";}std::cout << std::endl;}
}int main() {// 初始化随机数种子 (在main函数开始时调用一次)srand(static_cast<unsigned int>(time(0)));// 创建一个示例图像 (例如 5x5)int rows = 5, cols = 5;std::vector<std::vector<int>> myImage(rows, std::vector<int>(cols));// 填充一些初始像素值 (例如,都设为128)for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {myImage[i][j] = 128;}}std::cout << "原始图像:" << std::endl;printImage(myImage);// 添加椒盐噪声double density = 0.2; // 20% 的像素会被噪声污染double saltRatio = 0.5; // 盐和椒的比例为 1:1addSaltAndPepperNoise(myImage, density, saltRatio);std::cout << "\n添加椒盐噪声后的图像 (密度: " << density * 100 << "%):" << std::endl;printImage(myImage);return 0;
}

代码说明

  1. addSaltAndPepperNoise 函数:

    • 接收一个二维 std::vector<std::vector<int>> 作为图像数据。实际项目中,你可能会使用更专业的图像库(如 OpenCV)或自定义的图像数据结构。
    • noiseDensity 参数控制噪声的多少。例如,0.1 表示大约10%的像素会被修改。
    • saltPepperRatio 参数控制噪声点中“盐”像素(白色)所占的比例。0.5 表示盐和椒出现的概率均等。
    • 函数遍历图像中的每个像素。
    • 对于每个像素,生成一个随机数 randVal。如果 randVal 小于 noiseDensity,则该像素被选为噪声点。
    • 如果像素是噪声点,再生成一个随机数 saltOrPepper 来决定它是盐(255)还是椒(0)。
  2. 随机数生成:

    • srand(static_cast<unsigned int>(time(0))) 用于播种随机数生成器。这一步通常在程序开始时执行一次,以确保每次运行程序时都能得到不同的随机序列。在示例中,为了独立性,它被注释在了函数内部,并在 main 函数中调用。
    • rand() 生成一个伪随机整数,static_cast<double>(rand()) / RAND_MAX 将其归一化到 [0.0, 1.0] 范围内。
  3. main 函数示例:

    • 创建了一个简单的 5x5 图像,并用中间灰度值 (128) 初始化。
    • 调用 addSaltAndPepperNoise 函数添加噪声。
    • 打印原始图像和处理后的图像以供比较。

注意事项与改进

  • 彩色图像: 对于彩色图像(如RGB),可以独立地对每个颜色通道应用椒盐噪声,或者只对亮度/强度通道应用噪声。
  • 随机数生成器: C++11 及更高版本提供了更高级的随机数生成工具(在 <random> 头文件中),如 std::mt19937std::uniform_real_distribution,它们通常能提供比 rand() 更好的随机性。
  • 性能: 对于非常大的图像,直接遍历所有像素并为每个像素生成随机数可能不是最高效的方法。但对于大多数情况,这种方法的简单性和清晰度是足够的。
  • 图像库: 如果你正在进行更复杂的图像处理任务,建议使用像 OpenCV 这样的成熟图像处理库。这些库通常内置了添加各种类型噪声的函数,并且处理图像的加载、保存和操作更为便捷。

总结

椒盐噪声是一种简单的图像噪声模型,通过在C/C++中利用随机数生成器,我们可以有效地模拟这种噪声。理解其原理并能够手动实现它,对于学习图像处理和计算机视觉的基础非常有帮助。

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

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

相关文章

LIEDNet: A Lightweight Network for Low-light Enhancement and Deblurring论文阅读

摘要 夜间拍摄的图像常常面临诸如低光和模糊等挑战&#xff0c;这些问题主要是由于昏暗环境和长时间曝光的频繁使用所导致。现有方法要么独立处理这两种退化问题&#xff0c;要么依赖于通过复杂机制生成的精心设计的先验知识&#xff0c;这导致了较差的泛化能力和较高的模型复…

谈谈worldquant中设置的几个意思

Decay 是一个设置&#xff0c;用于确定要反映多少过去的位置。正如我们之前详细介绍的那样&#xff0c;Decay 值越高&#xff0c;Alpha 周转率越低。但是&#xff0c;请注意&#xff0c;Alpha 的夏普比率可能会随着信息延迟而降低。 创建 Alpha 时&#xff0c;头寸可能会集中在…

大模型和AI工具汇总(一)

一、国内可免费使用的大模型&#xff08;持续更新&#xff09; DeepSeek 模型介绍&#xff1a;DeepSeek 系列包括 DeepSeek V3&#xff08;通用场景&#xff09;、DeepSeek R1&#xff08;推理模型&#xff09;&#xff0c;支持高达 64K 上下文长度&#xff0c;中文场景表现优…

HarmonyOS NEXT 技术特性:分布式软总线技术架构

HarmonyOS NEXT 技术特性&#xff1a;分布式软总线技术架构 随着物联网发展&#xff0c;2030 预计全球联网设备达 2000 亿&#xff0c;异构设备互联难题凸显&#xff0c;分布式软总线作为 HarmonyOS 生态核心&#xff0c;以软件虚拟总线打破物理局限&#xff0c;让跨品牌设备即…

什么是VR展馆?VR展馆的实用价值有哪些?

VR展馆&#xff0c;重塑展览体验。在数字化时代浪潮的推动下&#xff0c;传统的实体展馆经历前所未有的变革。作为变革的先锋&#xff0c;VR展馆以无限的潜力&#xff0c;成为展览行业的新宠。 VR展馆&#xff0c;即虚拟现实展馆&#xff0c;是基于VR&#xff08;Virtual Real…

VLA模型:自动驾驶与机器人行业的革命性跃迁,端到端智能如何重塑未来?

当AI开始操控方向盘和机械臂&#xff0c;人类正在见证一场静默的产业革命。 2023年7月&#xff0c;谷歌DeepMind抛出一枚技术核弹——全球首个视觉语言动作模型&#xff08;VLA&#xff09;RT-2横空出世。这个能将“把咖啡递给穿红衣服的阿姨”这类自然语言指令直接转化为机器人…

华为OD机试真题——出租车计费/靠谱的车 (2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

40 岁 Windows 开启 AI 转型:从系统到生态的智能重构

在科技快速发展的当下&#xff0c;人工智能成为驱动各领域变革的核心力量&#xff0c;拥有 40 年历史的 Windows 也开启了向 AI 的全面转型。2025 年 5 月 19-22 日西雅图 Build 2025 开发者大会上&#xff0c;微软展示了 Windows 11 向 AI 智能体核心平台转型的战略&#xff0…

Python实例题:Python3实现可控制肉鸡的反向Shell

目录 Python实例题 题目 代码实现 reverse_shell_client.py reverse_shell_server.py 实现原理 反向连接机制&#xff1a; 命令执行与传输&#xff1a; 功能特点&#xff1a; 关键代码解析 服务端命令处理 客户端命令执行 客户端持久化连接 使用说明 启动服务端…

AWS EC2 使用Splunk DB connect 连接 RDS mysql

1: 先创建 RDS mysql: 我们选择free: 选择free 过后,自动生成single instance, 没有垮AZ 的db 设置。 选择密码登入: 注意:上面设置密码的时候,特别提示:不能有特殊字符,我就设置了: mypassword 下面可以选择通过EC2 连接,当然也可以不选:

SAP重塑云ERP应用套件

在2025年Sapphire大会上&#xff0c;SAP正式发布了其云ERP产品的重塑计划&#xff0c;推出全新“Business Suite”应用套件&#xff0c;并对供应链相关应用进行AI增强升级。这一变革旨在简化新客户进入SAP生态系统的流程&#xff0c;同时为现有客户提供更加统一、智能和高效的业…

初识 RocketMQ 知识总结:基础概念、架构解析、核心特性与应用场景

Apache RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;具有高吞吐量、低延迟、高可靠性等特点&#xff0c;广泛应用于互联网、金融、电商等领域。以下从多个维度对 RocketMQ 进行全面解析&#xff1a; 一、RocketMQ 基础概念 1. 定义与定位 分布式消息中间件…

[特殊字符] UI-Trans:字节跳动发布的多模态 UI 转换大模型工具,重塑界面智能化未来

2025 年&#xff0c;字节跳动&#xff08;ByteDance&#xff09;发布了革命性的多模态 UI 转换模型 —— UI-Trans&#xff0c;引发了业界广泛关注。作为一款融合视觉理解、语义分析与用户交互意图解析的 AI 工具&#xff0c;UI-Trans 在多个领域展现出强大能力&#xff0c;正在…

这个方法关闭PowerBI账户的安全默认值

这个方法关闭PowerBI账户的安全默认值 如果PowerBI账户是在 2019 年 10 月 22 日当天或之后创建的&#xff0c;则可能会自动启用安全默认值&#xff0c;登录账户会弹出弹框&#xff0c;如图&#xff1a; 使用四步就可以关闭此弹框的提示&#xff1a; 第一步&#xff1a;转到 A…

【Linux】磁盘空间不足

错误提示: no space left on device 经典版&#xff08;block占用&#xff09; 模拟 dd if/dev/zero of/var/log/nginx.log bs1M count2000排查 #1. df -h 查看哪里空间不足,哪个分区#2. du -sh详细查看目录所占空间 du -sh /* 排查占用空间大的目录 du -sh /var/* du…

计算机视觉---YOLOv2

YOLOv2讲解 一、YOLOv2 整体架构与核心特性 YOLOv2&#xff08;You Only Look Once v2&#xff09;于2016年发布&#xff0c;全称为 YOLO9000&#xff08;因支持9000类目标检测&#xff09;&#xff0c;在YOLOv1基础上进行了多项关键改进&#xff0c;显著提升了检测精度和速度…

【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则

一、感知机 对于分类问题&#xff0c;我们设定一个映射&#xff0c;将x通过函数f(x)映射到y 1. 感知机的基本结构 感知机&#xff08;Perceptron&#xff09;是最早期的神经网络模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是现代神经网络和深度学习模型的雏形…

IP、子网掩码、默认网关、DNS

IP、子网掩码、默认网关、DNS 1. 概述1.1 windows配置处 2.IP 地址&#xff08;Internet Protocol Address&#xff09;2.1 公网ip2.2 内网ip2.3 &#x1f310; 公网 IP 与内网 IP 的关系&#xff08;NAT&#xff09; 3. 子网掩码&#xff08;Subnet Mask&#xff09;4. 默认网…

Azure 公有云基础架构与核心服务:从基础到实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 Azure 的基础架构由多个核心组件构成&#xff0c;理解这些概念是掌握其技术框架的第一步&#xff1a; 地理区域&#xff08;Geographic R…

Ajax01-基础

一、AJAX 1.AJAX概念 使浏览器的XMLHttpRequest对象与服务器通信 浏览器网页中&#xff0c;使用 AJAX技术&#xff08;XHR对象&#xff09;发起获取省份列表数据的请求&#xff0c;服务器代码响应准备好的省份列表数据给前端&#xff0c;前端拿到数据数组以后&#xff0c;展…