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:2
				image.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:2
				image.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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构篇09:架构设计原则案例

文章目录 淘宝案例手机QQ案例小结 我们先复习一下架构设计的三条核心原则&#xff1a;合适原则、简单原则和演化原则。 我们在架构设计实践中&#xff0c;应该时刻谨记这三条设计原则&#xff0c;指导我们设计出合适的架构&#xff0c;即使是代表中国互联网技术最顶尖水平的 BA…

51单片机1-6

目录 单片机介绍 点亮一个LED 流水灯参考代码 点亮流水LEDplus版本 独立按键 独立按键控制LED亮灭 静态数码管 静态数码管显示 动态数码管显示 模块化编程 调试工具 矩阵键盘 矩阵键盘显示数据 矩阵键盘密码锁 学习B站江协科技课程笔记。 安装keil&#xff0c;下…

docker容器下php框架laravel的使用问题与解决方案

DB_CONNECTIONmysqlDB_HOSTlocalhost DB_CONNECTIONmysqlDB_HOSTdocker33-mysql-1 容器中只有数据库结构 进入MySQL容器内&#xff0c;创建表结构&#xff0c;添加数据 代码层面需要转换成数组 $query->get([*])->toArray(); 分页数据框架会返回带有data的数据&#xf…

Spring Boot3整合Druid(监控功能)

目录 1.前置条件 2.导依赖 错误依赖&#xff1a; 正确依赖&#xff1a; 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动。 作者版本为3.2.2最新版 2.导依赖 错误依赖&#xff1a; 这个依赖对于spring boot 3的支持不够&#…

机器学习实验报告——APRIORI算法

目录 一、算法介绍 1.1算法背景 1.2算法引入 1.3算法假设 1.4算法基本概念介绍 1.4.1关联规则 1.4.2支持度 1.4.3置信度 1.4.4频繁项集 1.4.5项目 1.4.6提升度 二、算法原理 2.1算法思想 2.2Apriori算法产生频繁项集 2.3Apriori算法的基本步骤 2.4关联分析 三、算法实现 3.1 Ap…

开始学习vue2基础篇(初体验)

一、什么是VUE&#xff08;官网 &#xff1a;https://cn.vuejs.org/&#xff09; 官方给出的概念 &#xff1a;Vue (读音 /vju ː/ &#xff0c;类似于 view) 是一套用 于构建用户界面的前端框架 渐进式的 JavaScript 框架 二、VUE的特点 易用 &#xff1a;基础只需HTML、CSS、…

爬虫案例—抓取找歌词网站的按歌词找歌名数据

爬虫案例—抓取找歌词网站的按歌词找歌名数据 找个词网址&#xff1a;https://www.91ge.cn/lxyyplay/find/ 目标&#xff1a;抓取页面里的所有要查的歌词及歌名等信息&#xff0c;并存为txt文件 一共46页数据 网站截图如下&#xff1a; 抓取完整歌词数据&#xff0c;如下图…

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…

Ubutu下的Shell操作

前言 在学习Ubuntu系统时&#xff0c;Shell操作是必不可少的知识。本篇文章是记录我学习Linux系统时&#xff0c;Ubutu下的Shell操作&#xff0c;希望我的分享对大家有所帮助&#xff01; 目录 前言 一、什么时是Shell 二、Shell的基本操作 三、常用的Shell命令 1、目录信…

PrestaShop购物系统 SQL注入漏洞复现(CVE-2023-30150)

0x01 产品简介 PrestaShop 是一个功能丰富,基于 PHP5 开发的 Web2.0 网上购物系统。PrestaShop 具有可定制,稳定等特点。整个系统只有 5.8MB,易于快速安装。 0x02 漏洞概述 PrestaShop 的部分主题中使用Leo Custom Ajax模块拓展,Leo Custom Ajax模块中可以在/modules/le…

Hugo使用且部署GitHubPages

hugo的使用 20201121 Hugo是由Go语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。 安装Hugo 0.windows安装(releases) 下载地址&#xff1a;https://github.com/spf13/hugo/releases。 配置环境变量 验证测试是否安装成功 hugo help1. 二进制安装&#xf…

C#使用DateAndTime.DateDiff方法计算年龄

目录 一、计算年龄的方法 二、 DateAndTime类 1.定义 2.常用方法 3.DateDiff(DateInterval, DateTime, DateTime, FirstDayOfWeek, FirstWeekOfYear) 三、使用DateAndTime.DateDiff方法计算年龄 一、计算年龄的方法 使用DateDiff方法计算系统时间与员工生日之间相隔的年…

续签KES证书

MiniO KES&#xff08;密钥加密服务&#xff09;是 MinIO 开发的一项服务&#xff0c;旨在弥合在 Kubernetes 中运行的应用程序与集中式密钥管理服务 &#xff08;KMS&#xff09; 之间的差距。中央 KMS 服务器包含所有状态信息&#xff0c;而 KES 在需要执行与获取新密钥或更新…

【AI Agent系列】【MetaGPT】7. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体

文章目录 0. 前置推荐阅读1. 本文内容2. 解析用户指令&#xff08;分析用户需求&#xff09;2.1 完整代码及注释2.2 运行结果 3. 利用大模型写爬虫代码3.1 对html内容进行精简3.2 利用大模型写爬虫代码3.3 补充代码&#xff0c;测试本节程序3.4 运行结果及踩坑3.4.1 运行结果3.…

leaflet学习笔记-带过滤的图例(九)

前言 图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素&#xff0c;本文要介绍的图例组件还可以按需求过滤掉不用显示的要素&#xff0c;使地图的更能清晰的显示我们需要显示的内容 技术核心 说到过滤要素&#xff0c;第一时间想到的就是滑块组件…

CmakeList教程

一、CmakeList介绍&#xff1a; cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。它会通过写的语句自动生成一个MakeFile,从而实现高效编译 二、CmakeList的常用指令 1.指定…

瑞_力扣LeetCode_101. 对称二叉树

文章目录 题目 101. 对称二叉树题解方式一 递归方式二 迭代 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列&#xff0c;主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用&#xff0c;禁止用于商业用途&#xff0c…

电脑 wifi 常断

问题 电脑wifi网络经常断。 详细问题 笔者使用笔记本电脑&#xff0c;发现每过三五分钟&#xff0c;wifi便会自动断开。 解决方案 步骤1、搜索框搜索设备管理器。 步骤2、找到网络适配器并点击。 步骤2、找到网络适配器菜单中的Wireless相关内容&#xff0c;右键&#x…

解读 EventBridge Transform:数据转换和处理的灵活能力

作者&#xff1a;木则 阿里云 EventBridge 提供了强大而灵活的事件总线服务&#xff0c;它可以连接应用程序、阿里云云服务和阿里云 Serverless 服务来快速构建 EDA&#xff08;Event-driven Architectures&#xff09;事件驱动架构&#xff0c;驱动应用与应用&#xff0c;应用…

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…