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

OpenCV(二十一):椒盐噪声和高斯噪声的产生

目录

1.图像噪声介绍

2.椒盐噪声的产生

3.高斯噪声的产生


1.图像噪声介绍

噪声介绍

     图像噪声是指在图像中存在的不期望的、随机的像素值变化,这些变化来源于多种因素。噪声可能导致图像细节模糊、失真或难以分辨。

以下是几种常见的图像噪声类型:

      1.椒盐噪声:又被称作脉冲噪声,它会随机改变图像中的像素值,是由相机成像、图像传输、解码处理等过程产生的黑白相间的亮暗点噪声。

     2. 高斯噪声:高斯噪声是指噪声分布的概率密度函数服从高斯分布(正态分布)的一类噪声。

2.椒盐噪声的产生

椒盐噪声生成的步骤:

  • Step1:确定添加椒盐噪声的位置。
  • Step2:确定噪声的种类。
  • Step3:修改图像像素灰度值。
  • Step4:得到含有椒盐噪声的图像。

 由于椒盐噪声是随机产生的,所以我们要使用opencv中能够产生 随机数的函数,有下面两个:

1.rand_double()

double cvflann::rand_double ( double high=1.0,

double low = 0

)

2.rand_int()

int cvflann::rand_int ( int high =RAND MAX,

int low = 0

)

由于图像像素中的数据都是整数,并且产生的椒盐噪声的数据是0或者255的整数,我们主要使用rand_int()这个函数。

       在OpenCV中,可以使用cv::Mat类和随机数生成函数rand_int()来模拟生成椒盐噪声。下面是一个示例代码,展示如何在图像中添加椒盐噪声:


#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;//图像添加椒盐噪声函数
void saltAndPepper(Mat image,int n){for(int k=0;k<n/2;k++){//随机确定图像中的位置int i,j;i=cvflann::rand_int()%image.cols;//取余数运算,保证在图像的列数内j=cvflann::rand_int()%image.rows;//取余数运算,保证在图像的行数内int write_black=rand()%2;//判断为白色噪声还是黑色噪声的变量if(write_black==0)//添加白色噪声{if(image.type()==CV_8UC1){image.at<uchar>(j,i)=255;//白色噪声}else if(image.type()==CV_8UC4)//处理彩色图片{image.at<Vec4b>(j,i)[0]=255;//Vec4b为opencv定义的一个3个值的向量类型,指定通道,B:0 G:1 R:2image.at<Vec4b>(j,i)[1]=255;image.at<Vec4b>(j,i)[2]=255;image.at<Vec4b>(j,i)[3]=255;}}else{//添加黑色噪声if(image.type()==CV_8UC1){image.at<uchar>(j,i)=0;//白色噪声}else if(image.type()==CV_8UC4)//处理彩色图片{image.at<Vec4b>(j,i)[0]=0;//Vec4b为opencv定义的一个3个值的向量类型,指定通道,B:0 G:1 R:2image.at<Vec4b>(j,i)[1]=0;image.at<Vec4b>(j,i)[2]=0;image.at<Vec4b>(j,i)[3]=0;}}}
}
//椒盐噪声
void Saltandpepper_noise(Mat image){Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);imwrite("/sdcard/DCIM/image.png",image);//展示原图imwrite("/sdcard/DCIM/gray.png",gray);saltAndPepper(image,10000);//彩色图像添加椒盐噪声saltAndPepper(gray,10000);//灰度图像添加椒盐噪声imwrite("/sdcard/DCIM/image_saltAndPepper.png",image);imwrite("/sdcard/DCIM/gray_saltAndPepper.png",gray);}

在上面的代码中,首先包含了OpenCV的头文件<opencv2/opencv.hpp>。然后,定义了一个名为SaltAndPepper()的函数,用于向图像中添加椒盐噪声。

该函数使用cvflann::rand_int()函数生成随机数,并根据给定的噪声比例计算添加噪声的像素数量。接着,在图像中随机选择这些像素,并将其值设置为黑色(0)或白色(255),从而模拟生成椒盐噪声。

在Saltandpepper_noise函数中,读取了原始图像,并调用SaltAndPepper()函数来添加椒盐噪声。然后,使用cv::imwrite()显示带有噪声的图像。

       

         灰度图像                                           灰度图像添加椒盐噪声

    

            彩色图像                                           彩色图像添加椒盐噪声

请注意,在示例代码中,假设待处理的图像是8位无符号整型单通道灰度图像(CV_8UC1)或4通道彩色图像(CV_8UC4)。如果处理的图像类型不同,需要相应地修改代码。

3.高斯噪声的产生

高斯噪声生成的步骤:

Step1:创建一个与图像尺寸、数据类型以及通道数相同的Mat类变量。

Step2:在Mat类变量中产生符合高斯分布的随机数。

Step3:将原图像和含有高斯分布的随机数矩阵相加。

Step4:得到添加高斯噪声的图像。

在OpenCV中,RNG::fill()是一个用于填充数组或矩阵的函数,它可以生成指定分布的随机数,并将其存储在指定的数据结构中。该函数的签名如下:

void cv::RNG::fill ( InputOutputArray mat,

int     distType,

InputArray   a,

InputArray     b,

bool     saturateRange = false

)

  • mat:用于存放随机数的矩阵,目前只支持低于5通道的矩阵。
  • distType:指定生成随机数分布的类型,可以是以下值之一:
    • RNG::UNIFORM:均匀分布
    • RNG::NORMAL:正态分布(高斯分布)
  • a:生成分布所需的参数之一。对于均匀分布,它表示随机数的下界;对于正态分布,它是均值。
  • b:生成分布所需的参数之二。对于均匀分布,它表示随机数的上界;对于正态分布,它是标准差。
  • saturateRange:一个可选的布尔值,如果为true,则将生成的随机数截断到输出数组或矩阵的数据类型的有效范围内。

在OpenCV中,可以使用随机数生成函数和高斯分布函数来模拟生成高斯噪声。下面是一个示例代码,展示如何在图像中添加高斯噪声:

//高斯噪声
void Gaussian_noise(Mat image){Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);Mat image_noise=Mat::zeros(image.rows,image.cols,image.type());Mat gray_noise=Mat::zeros(gray.rows,gray.cols,gray.type());imwrite("/sdcard/DCIM/image.png",image);//展示原图imwrite("/sdcard/DCIM/gray.png",gray);RNG rng;//创建一个RNG类rng.fill(image_noise,RNG::NORMAL,10,20);//生成三通道的高斯分布随机数rng.fill(gray_noise,RNG::NORMAL,15,30);imwrite("/sdcard/DCIM/image_noise.png",image_noise);//三通道的高斯噪声imwrite("/sdcard/DCIM/gray_noise.png",gray_noise);//单通道的高斯噪声image=image+image_noise;//在彩色图像中添加高斯噪声gray=gray+gray_noise;//在灰度图像中添加高斯噪声//显示添加高斯噪声后的图像imwrite("/sdcard/DCIM/image_Gaussian.png",image);imwrite("/sdcard/DCIM/gray_Gaussian.png",gray);
}

这段示例代码演示了如何生成高斯噪声,并将其添加到彩色图像和灰度图像中。

首先,代码使用cvtColor函数将输入的彩色图像转换为灰度图像,并创建了grayimage变量来存储结果。

接下来,代码创建了两个空白图像:image_noisegray_noise,它们与输入图像和灰度图像具有相同的尺寸和类型。这些图像将用于存储生成的高斯噪声。

然后,代码利用RNG类创建了一个随机数生成器对象rng

通过调用rng.fill()函数,代码将生成服从高斯分布的随机数填充到image_noisegray_noise中。第一个参数是要填充的图像,第二个参数RNG::NORMAL表示生成的随机数应符合正态分布。第三个和第四个参数分别表示高斯分布的均值和标准差,这里分别为10和20(对于image_noise)以及15和30(对于gray_noise)。这些值可以根据需要进行调整。

之后,代码使用imwrite函数将原始图像、灰度图像、生成的高斯噪声图像保存到指定路径,将结果可视化。

最后,代码将高斯噪声添加到输入的彩色图像和灰度图像中,通过对应的像素相加。结果图像被保存并可视化。

      

           灰度图像                                               灰度图像添加高斯噪声

       

      彩色图像                                           彩色图像添加高斯噪声

相关文章:

OpenCV(二十一):椒盐噪声和高斯噪声的产生

目录 1.图像噪声介绍 2.椒盐噪声的产生 3.高斯噪声的产生 1.图像噪声介绍 噪声介绍 图像噪声是指在图像中存在的不期望的、随机的像素值变化&#xff0c;这些变化来源于多种因素。噪声可能导致图像细节模糊、失真或难以分辨。 以下是几种常见的图像噪声类型&#xff1a; 1…...

【设计模式】Head First 设计模式——构建器模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点&#xff0c;然后分离它们&#xff0c;从而管理变化。将变化像小兔子一样关到笼子里&#xff0c;让它在笼子里随便跳&#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想 ​ 将一个复杂对象的构建与其表示相分离&…...

基于Python+Django深度学习的身份证识别考勤系统设计与实现

摘 要 我们的生活都是由信息技术在潜移默化的改变着&#xff0c;那么早先改变校园生活的是校园信息化&#xff0c;改变社会人生活是各种应用软件。出行我们依靠的是滴滴&#xff0c;外卖我们依靠的是美团等等。从信息技术的发展至今&#xff0c;各色各样的技术能够满足各类人群…...

Unity控制程序退出

大家好&#xff0c;我是阿赵。   最近把公司的游戏发布到各种PC的游戏大厅&#xff0c;遇到了挺多奇怪的需求。之前介绍了一些Unity发布PC端控制窗口最大最小化、修改exe信息等问题&#xff0c;这次来探讨一下退出游戏的问题。 一、收到奇怪的需求 某游戏大厅要求&#xff0…...

C++ using的多种用法

1、引入命名空间 using namespace std; using std::cout; 2、引入基类成员 class Base{ public:void func(){cout << "Base::func()" << endl;} }; class Derived : public Base{ public:using Base::func;void func(int x){cout << "Deriv…...

Java环境的安装

最近博主也是在学校开始学习了Java&#xff0c;也通过老师知道了可以通过大学生学生证申(bai)请(piao) IDEA的企业版&#xff08;社区版也是够学习用的&#xff09;有很多同学还是没有搞懂便做一下分享。 &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作…...

【ES6】js中的__proto__和prototype

在JavaScript中&#xff0c;__proto__和prototype都是用于实现对象继承的关键概念。 1、proto __proto__是一个非标准的属性&#xff0c;用于设置或获取一个对象的原型。这个属性提供了直接访问对象内部原型对象的途径。对于浏览器中的宿主对象和大多数对象来说&#xff0c;可…...

工程项目管理系统源码-简洁+好用+全面-工程项目管理

​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承包企…...

后端SpringBoot+前端Vue前后端分离的项目(二)

前言&#xff1a;完成一个列表&#xff0c;实现表头的切换&#xff0c;字段的筛选&#xff0c;排序&#xff0c;分页功能。 目录 一、数据库表的设计 ​编辑二、后端实现 环境配置 model层 mapper层 service层 service层单元测试 controller层 三、前端实现 interface接…...

【5】openGL使用宏和函数进行错误检测

当我们编写openGL程序&#xff0c;没有报编译链接错误&#xff0c;但是运行结果是黑屏&#xff0c;这不是我们想要的。 openGL提供了glGetError 来检查错误&#xff0c;我们可以通过在运行时进行打断点查看glGetError返回值&#xff0c;得到的是一个十进制数&#xff0c;将其转…...

STM32 CAN快速配置(HAL库版本)

STM32 CAN快速配置&#xff08;HAL库版本&#xff09; 目录 STM32 CAN快速配置&#xff08;HAL库版本&#xff09;前言1 软件编程1.1 初始化1.1.1 引脚设置1.1.2 CAN参数设置1.1.3 CAN滤波器设置 1.2 CAN发送1.3 CAN接收 2 运行测试结束语 前言 控制器局域网总线&#xff08;CA…...

【文末送书】全栈开发流程——后端连接数据源(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

leetcode_27_最小栈

class MinStack { public:MinStack() {}void push(int val) {//只要是压栈&#xff0c;先将元素保存到_elem中_elem.push(val);//如果x小于_min中栈顶的元素&#xff0c;将x再压入_min中if(_min.empty() || val < _min.top()){_min.push(val);}}void pop() {//如果——min栈…...

01-ZooKeeper快速入门

1 Zookeeper概念 Zookeeper是Apache Hadoop项目下的一个子项目&#xff0c;是一个树形目录服务。 zookeeper翻译过来就是 动物园管理员&#xff0c;它是用来管理Hadoop&#xff08;大象&#xff09;、Hive&#xff08;蜜蜂&#xff09;、Pig&#xff08;小猪&#xff09;的管…...

[经典面试题]JS的typeof和instanceof区别

一、typeof typeof 是一个一元操作符不是函数&#xff0c;所以不需要传递参数&#xff0c;使用方法非常简单&#xff1a;typeof A 对于基本类型 let s "Nicholas"; let b true; let i 22; let u; let sb undefined; console.log(typeof s); // string console.…...

C++内存区堆和栈

在C中&#xff0c;内存分成5个区&#xff0c;堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆&#xff0c;就是那些…...

QT中闹钟的设置

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮 #include <QTextEdit> //文本 #include <QLabel> //标签 #include <QLineEdit> //行编辑器#include <QTimerEvent> //定时器事件类头文件 #…...

【Redis】几款redis可视化工具(推荐Another Redis Desktop Manager)

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。不过它公自带一个最小化的命令行式的数据库管理工具&#xff0c;有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理…...

肖sir__设计测试用例方法之因果图07_(黑盒测试)

设计测试用例方法之因果图 一、定义&#xff1a;因果图提供了一个把规格转化为判定表的系统化方法&#xff0c;从该图中可以产生测试数据。其 中&#xff0c;原因是表示输入条件&#xff0c;结果是对输入执 行的一系列计算后得到的输出。 二、因果图方法最终生成的就是判定表。…...

李宏毅-21-hw3:对11种食物进行分类-CNN

一、代码慢慢阅读理解总结内化&#xff1a; 1.关于torch.nn.covd2d()的参数含义、具体用法、功能&#xff1a; &#xff08;1&#xff09;参数含义&#xff1a; 注意&#xff0c;里面的“padding”参数&#xff1a;《both》side所以是上下左右《四》边都会加一个padding数量…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...