opencv#29 图像噪声的产生

    在上一节的图像卷积我们了解到图像卷积可以用于去除图像中的噪声,那么对于现实生活中每一张采集到的图像都会包含噪声,也就是我们通过相机无法得到不包含噪声的图像,如果我想衡量噪声去除能力的强弱,就必须在一张不含噪声的图像中人为添加噪声。

噪声介绍

图像在获取或者传输过程中会收到随机信号的干扰产生噪声。

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

·高斯噪声:高斯噪声是指噪声分布的概率密度函数服从高斯分布(正态分布)的一类噪声(这种噪声形式会遍布在图像中每一个位置,也就是说这种噪声是每一个像素都可能会含有的,或大或小)。

下图分别是椒盐噪声(要么黑色要么白色,较为明显)和高斯噪声(遍布整个区域的噪声,像黑白电视机的雪花信号一样)的示例图。

 椒盐噪声的产生

椒盐噪声产生的步骤:

Step1:确定添加椒盐噪声的位置。

Step2:确定噪声的种类(椒盐噪声有两种:黑色噪声和白色噪声)。

Step3:根据椒盐噪声的种类修改图像像素灰度值。

Step4:得到含有椒盐噪声的图像。

rand_double()

                             high =
double cvflann::rand_double( double 1.0,double low = 0)

最大值1,最小值0,如果不设置任何参数,函数随机给出0~1之间分布的小数,里面的参数也可以人为进行设置, 比如设置为3和2,那么产生的随机数就是分布在2~3之间的小数,它是以返回值的形式给出返回值为double类型。 

rand_int()

                        high =
int cvflann::rand_int( int RAND_MAX,int low = 0)

int类型给出的默认值的最大值是系统给出的,也可以进行人为设置,比如0~100,那么输出的所有数都是0~100之间的整数,它的形式也是以返回值给出。

上述两个函数我们可以灵活地使用,由于图像像素值都为整数,并且产生的椒盐噪声的数据也是0或者255,因此我门主要使用rand_int,为了保证函数产生的随机数能够在范围之内,也为了增加随机数所适用的图像,比如给出一个512*512图像,我们就设置函数内的值为512,这种形式是比较笨拙的,因此它最好的方式就是你可以随意的生成一个随机数,这个范围给你一个比较大的范围,比如说你在0~10000之间生成随机数,但是由于我们的位置是在512*512的正方形中,如果生成一个大于此范围的数,那么你的位置将会超出图像,因此我们最好的方法是将产生的随机数除以图像的长度或者宽度,求余数,余数一定能够小于图像的长宽的并且大于等于0,通过这样的限定,就可以使得产生的随机数一定在图像范围内,保证了产生随机数的随机性,同样产生的噪声由于可黑可白,随机的,所以可以根据产生的随机数除以2的方式,因为除以2求余数,要么是0,要么是1,我们可以假设0产生的就是白色噪声,1产生的就是黑色噪声,通过这样的方式就可以在先确定噪声的位置后,再确定噪声的颜色或种类,最后修改像素值,便可以得到椒盐噪声。

高斯噪声的产生

高斯噪声生成的步骤:

Step1:创建一个与图像尺寸,数据类型以及通道数相同的Mat类变量。由于高斯噪声是在全局内产生的,因此噪声的尺寸要与原图像一致。

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

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

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

fill()

void cv::RNG::fill(InputOutputArray   mat,int                distType,InputArray         a,InputArray         b,bool               saturateRange = false)

·mat:用于存放随机数的矩阵(与原图像尺寸数据类型相同),目前只支持低于5通道的矩阵。

·distType:随机数分布形形式选择标志,高斯分布或均匀分布。

·a:确定分布规律的参数,在均匀分布的情况下,这是一个包含范围的下边界;在正太分布的情况下,这是一个平均值。

·b:确定分布规律的参数,在均匀分布的情况下,这是一个非包含上边界,在正太分布的情况下,这是一个标准差。

·saturateRange:预饱和标志,仅用于均匀分布,我们在使用高斯分布时,使用此参数的默认值即可。

示例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv; //opencv的命名空间
using namespace std;//椒盐噪声函数
void saltAndPepper(cv::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 = std::rand() % 2;//判定为白色噪声还是黑色噪声if (write_black == 0) //添加白色噪声{if (image.type() == CV_8UC1)//处理灰度图像{image.at<uchar>(j, i) = 255; //白色噪声}else if (image.type() == CV_8UC3) //处理彩色图像{image.at<cv::Vec3b>(j, i)[0] = 255; //cv::Vec3b为opencv定义的一个3个值的向量类型image.at<cv::Vec3b>(j, i)[1] = 255; //[]指定通道:B:0,G:1,R:2image.at<cv::Vec3b>(j, i)[2] = 255;}}else if (write_black == 1)//添加黑色噪声{if (image.type() == CV_8UC1)//处理灰度图像{image.at<uchar>(j, i) = 0; //白色噪声}else if (image.type() == CV_8UC3) //处理彩色图像{image.at<cv::Vec3b>(j, i)[0] = 0; //cv::Vec3b为opencv定义的一个3个值的向量类型image.at<cv::Vec3b>(j, i)[1] = 0; //[]指定通道:B:0,G:1,R:2image.at<cv::Vec3b>(j, i)[2] = 0;}}}
}//主函数
int main()
{Mat lena = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");Mat equalLena;cvtColor(lena, equalLena, COLOR_BGR2GRAY); //转为灰度图像if (lena.empty()|| equalLena.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat lena_G, equalLena_G;lena.copyTo(lena_G);equalLena.copyTo(equalLena_G);imshow("lena原图", lena);imshow("equallena原图", equalLena);saltAndPepper(lena, 10000); //彩色图像加椒盐噪声saltAndPepper(equalLena, 10000); //灰度图像添加椒盐噪声imshow("lena添加噪声", lena);imshow("equalLena", equalLena);cout << "下面是高斯噪声" << endl;waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出Mat lena_noise = Mat::zeros(lena.rows, lena.cols, lena.type()); //用于存放高斯随机数的与原图像尺寸大小数据类型相同的Mat类Mat equalLena_noise = Mat::zeros(lena.rows, lena.cols, equalLena.type());imshow("lena原图", lena_G);imshow("equalLena原图", equalLena_G);RNG rng; //创建一个RNG类,opencv中RNG类是用于生成随机数的伪随机数生成器,可用来生成各种类型的随机数rng.fill(lena_noise, RNG::NORMAL, 10, 20); //生成三通道的高斯分布随机数(后面的参数是均值和方差值)rng.fill(equalLena_noise, RNG::NORMAL, 15,30); //生成单通道的高斯分布随机数imshow("三通道高斯噪声", lena_noise);imshow("单通道高斯噪声", equalLena_noise);lena_G = lena_G + lena_noise; //在彩色图像中添加高斯噪声equalLena_G = equalLena_G + equalLena_noise;//在灰度图像中添加高斯噪声//显示添加高斯噪声后的图像imshow("lena(高斯)", lena_G);imshow("equalLena(高斯)", equalLena_G);imwrite("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena_G.png", equalLena_G); //保存灰度椒盐噪声图片imwrite("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/equalLena.png", equalLena); //保存灰度高斯噪声图片waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出return 0;}

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

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

相关文章

Leetcode 第 380 场周赛题解

Leetcode 第 380 场周赛题解 Leetcode 第 380 场周赛题解题目1&#xff1a;3005. 最大频率元素计数思路代码复杂度分析 题目2&#xff1a;3006. 找出数组中的美丽下标 I思路代码复杂度分析 题目3&#xff1a;3007. 价值和小于等于 K 的最大数字思路代码复杂度分析 题目4&#x…

OCP NVME SSD规范解读-7.TCG安全日志要求

在OCP NVMe SSD规格中&#xff0c;TCG的相关内容涉及以下几个方面&#xff1a; 活动事件记录&#xff1a; NVMe SSD需要支持记录TCG相关的持久事件日志&#xff0c;用于追踪固态硬盘上发生的与TCG安全功能相关的关键操作或状态变化&#xff0c;如启动过程中的安全初始化、密钥…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器 点击button按钮触发事件显示月份与获取的时间 Button button3 (Button) findComponentById(ResourceTable.Id_button3);button3.setClickedListener(new Component.ClickedListener() {Overridepublic void onClick(Compon…

BL120PM PLC网关,实现PLC协议转Modbus协议

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

muduo网络库剖析——线程Thread类

muduo网络库剖析——线程Thread类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精…

RectMask2D的合批情况验证

1.经过实际测试&#xff0c;RectMask2D在裁剪区域完全相同且位置完全重合的情况下能够合批 但是当RectMask2D位置不重合时&#xff0c;就不能合批 注意&#xff0c;虽然此处被RectMask2D裁剪了&#xff0c;但是有部分是被渲染的&#xff0c;在计算深度时属于需要渲染…

【人工智能大脑】仿生学与人工智能交汇:基于MP神经网络的精准农业实践

MP神经网络&#xff0c;即McCulloch-Pitts模型&#xff08;MCP Model&#xff09;&#xff0c;是神经网络的早期形式之一&#xff0c;由Warren McCulloch和Walter Pitts在1943年提出。这个模型为现代人工神经网络的发展奠定了理论基础&#xff0c;并首次尝试模拟了生物神经元的…

【数据结构】二叉树算法讲解(定义+算法原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…

单元化(Set)架构设计详解:异地多活、突破扩展上限的优选方案

文章目录 一、单元化架构基础1、扩展性&#xff08;Scalability&#xff09;概述2、扩展性 - 横向扩展&#xff08;Horizontal Scale&#xff09;3、扩展性 - 纵向扩展&#xff08;Vertical Scale&#xff09;4、扩展性 - 扩展魔方5、一致性 - 数据库事务一致性&#xff08;ACI…

分布式websocket IM聊天系统相关问题问答【第九期】

前言 上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。 本期对应视频 目前已经写的文章有。并且有对应视频版本。 git项目地…

PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护方法

PLAN方法&#xff1a;解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文&#xff1a;https://arxiv.org/abs/2307.02984 代码&#xff1a;https://github.com/perceivelab/P…