opencv#29 图像噪声的产生

news2024/9/22 21:20:11

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

噪声介绍

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

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

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

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

 椒盐噪声的产生

椒盐噪声产生的步骤:

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;

}

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

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

相关文章

架构篇11:架构设计流程-设计备选方案

文章目录 架构设计第 2 步&#xff1a;设计备选方案设计备选方案实战小结 上一期我讲了架构设计流程第 1 步识别复杂度&#xff0c;确定了系统面临的主要复杂度问题后&#xff0c;方案设计就有了明确的目标&#xff0c;我们就可以开始真正进行架构方案设计了。今天我来讲讲架构…

【Go面试向】Go程序的执行顺序

【Go】Go程序的执行顺序 大家好 我是寸铁&#x1f44a; 总结了一篇Go程序的执行顺序的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; Go程序内容 go程序通常包含: 包、常量、变量、init()、main()等元素 下面从这几个方面分别去梳理&#xff01; 包的执行顺序 程序中的包 …

【数据结构】链表(单链表与双链表实现+原理+源码)

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

【GoLang入门教程】Go语言工程结构详述

程序员裁员潮&#xff1a;技术变革下的职业危机 文章目录 程序员裁员潮&#xff1a;技术变革下的职业危机前言总结:专栏集锦强烈推荐写在最后 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

瑞金市城北社区开展新时代文明实践文艺汇演

为发扬中华民族优秀传统文化&#xff0c;促进社区居民邻里交流&#xff0c;丰富居民业余文化生活&#xff0c;1月18日&#xff0c;瑞金市城市社区城北社区新时代文明实践站在金盛小区开展新时代文明实践文艺汇演活动。 社区文艺爱好者们自编自演的节目丰富多彩&#xff0c;现场…

基于open3d的半径滤波

概念原理 半径滤波器比较简单粗暴。以某点为中心画一个圆计算落在该圆中点的数量&#xff0c;当数量大于给定值时&#xff0c;则保留该点&#xff0c;数量小于给定值则剔除该点。此算法运行速度快&#xff0c;依序迭代留下的点一定是最密集的&#xff0c;但是圆的半径和圆内点…

5.命令源码文件及命令行参数

目录 概述命令源码文件接收参数查看参数的使用说明结束 概述 命令源码文件接收参数 命令源码文件是程序的运行入口&#xff0c;是每个可独立运行的程序必须拥有的 无论是 Linux 还是 Windows&#xff0c;如果用过命令行&#xff08;command line&#xff09;的话&#xff0c;肯…

泥石流监测识别摄像机

泥石流监测识别摄像机是一种基于图像识别技术的监测设备&#xff0c;主要用于实时监测和识别泥石流的发生和演变过程&#xff0c;以预警和减灾为目的。这种摄像机通常采用高清晰度摄像头和图像处理系统&#xff0c;能够实时拍摄泥石流事件&#xff0c;并对图像进行处理和分析&a…

植物神经功能紊乱是什么?

植物神经也叫自律神经&#xff0c;它是一种自发的&#xff0c;非主观意识控制的&#xff0c;低级的神经活动。包括呼吸的、心律的、汗腺的、胃肠道的调节等等&#xff0c;都叫植物神经功能调节。 植物神经它的一旦出现了障碍可以有两种倾向&#xff0c;一种倾向就是出汗、兴奋…

Navicat使用HTTP通道连接远程服务器的SQLite文件

拷贝ntunnel_sqlite.php文件到Linux机器中 ntunnel_sqlite.php文件位置&#xff1a; 在Navicat安装位置中可以找到ntunnel_sqlite.php文件&#xff0c;其他两个类似文件是支持MySQL和pgsql的

【计算机网络】应用层——HTTP 协议(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、什么是 HTTP 协…

MySQL-查询SQL语句

阅读目录 1.基础查询2.高级多表查询 回到顶部 1.基础查询 范围查询 在范围in select 字段 from 表名 where 字段 in (值,值); select id from stu where id in (2,3); 不在范围not in select 字段 from 表名 where 字段 in (值,值); select id from stu where id not in…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

LLM:PI - 位置插值

标题:EXTENDING CONTEXT WINDOW OF LARGE LANGUAGE MODELS VIA POSITION INTERPOLATION 论文:https://arxiv.org/pdf/2306.15595.pdf 发表:2023 ​ Transformer的长度外推技术分为两类: 1:修改推理:比如PI、NTK-RoPE、YaRN、ReRoPE等。 优点:可直接修改推理模型,无…

Linux设备树中的 gpio 信息

一. 简介 前面几篇文章讲解了 pinctrl 子系统&#xff0c; pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性。 注意&#xff1a;如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话&#xff0c;那么接下来就要用到 gpio 子系统了。如果 PIN用作其他…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Midjourney在线绘画及提示词精选库

网址:https://chat.xutongbao.top/ 一碗面粉&#xff1a; Self-Rising Flour in a 50s colourful bowl. professional photograph --ar 720:1170 --v 6 烟花古建筑&#xff1a; At night, with the snow-covered scenery of the Beijing Forbidden City as the backdrop, brill…

【Linux C | 进程】进程终止、等待 | exit、_exit、wait、waitpid

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【网站项目】基于SSM的263货物进销管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

超融合基础架构理解

1 超融合基础架构 1.1 定义 超融合基础架构&#xff08;Hyper-converged infrastructure&#xff0c;缩写为HCI&#xff09;&#xff0c;是一种集成了存储设备及虚拟运算的信息基础架构框架。在这样的架构环境中&#xff0c;同一厂商的服务器与存储等硬件单元&#xff0c;搭配…