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

news/2024/12/2 4:35:22/

目录

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函数将原始图像、灰度图像、生成的高斯噪声图像保存到指定路径,将结果可视化。

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

      

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

       

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


http://www.ppmy.cn/news/1091801.html

相关文章

实时操作系统Freertos开坑学习笔记:(八):信号量、事件标志组、任务通知机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、信号量的简介1.信号量与队列的区别&#xff1f; 二、二值信号量及其实例1.什么是二值信号量2.二值信号量相关API函数3.二值信号量实例 三、计数型信号量四、…

zabbix监控网络设备和zabbix proxy

监控linux主机 [rootrocky8 conf]# yum -y install net-snmp vim /etc/snmp/snmpd.conf com2sec notConfigUser default 123456##修改此行,设置团体密码,默认为public,此处 改为123456 view systemview included .1. ##添加此行,自定义授权,否则 zabbix 无法获取数据 [rootr…

网络安全行业岗位缺口有多大?看看美国有多少岗位空缺

网络安全行业岗位缺口一直很大&#xff0c;在各类统计中其实并不能完全客观的反应这个缺口&#xff0c;不过都可以作为一个参考。同时&#xff0c;网络安全行业岗位的人员能力参差不齐&#xff0c;不仅仅在数量上有所欠缺&#xff0c;同时从质量上更加加剧了对人才的需求。我们…

车内信息安全技术-安全技术栈-软件安全

操作系统 1.隔离技术 信息安全中的隔离技术通常指的是将不同安全级别的信息或数据隔离开来,以保护敏感信息不受未授权的访问或泄露。在操作系统中,常见的隔离技术包括:虚拟化技术:通过虚拟化软件,将物理计算机分割成多个独立的虚拟计算机,每个虚拟计算机都可以运行独立的…

用户端APP自动化测试_L2

目录&#xff1a; appium server 环境安装capability 进阶用法元素定位工具高级定位技巧-xpath 定位高级定位技巧-css 定位与原生定位特殊控件 toast 识别显式等待高级使用高级控件交互方法设备交互api模拟器控制雪球财经app股票详情功能点自动化测试实战 1.appium server 环…

【BI看板】Superset时间过滤控件二次开发

有没有人发觉Superset时间过滤组件非常高级&#xff0c;&#x1f61f;但又有点复杂&#xff0c;没有选择时间区间的快捷方式。 Superset的时间过滤控件可以通过在代码中进行二次开发来进行定制。以下是一些可能有用的提示&#xff1a; 查找源代码&#xff1a;可以在Superset的源…

Knowledge Graph Prompting for Multi-Document Question Answering

本文是LLM系列文章&#xff0c;针对《Knowledge Graph Prompting for Multi-Document Question Answering》的翻译。 多文档问答中的知识图谱提示 摘要1 引言2 符号3 知识图谱构建4 LM引导的图形遍历器5 实验6 相关工作7 结论 摘要 大型语言模型的“预训练、提示、预测”范式…

如何在VueJS应用程序中设置Toast通知

通知是开发者提升应用程序互动性和改善用户体验的强大工具。通过利用通知&#xff0c;开发者可以在用户与应用程序互动的同时&#xff0c;有效地向用户传达重要事件。 通知在应用程序中起着至关重要的作用&#xff0c;可以及时通知用户有关各种操作和事件的信息。它们可以用于通…