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.mzph.cn/news/641018.shtml

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

相关文章

瑞_力扣LeetCode_104. 二叉树的最大深度

文章目录 题目 104. 二叉树的最大深度题解后序遍历 递归实现后序遍历 迭代实现层序遍历 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列&#xff0c;主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用&#xff0c;禁…

Armv8-M的TrustZone技术之内存属性单元

如果处理器包含Armv8-M安全扩展&#xff0c;则内存区域的安全状态由内部安全属性单元&#xff08;SAU&#xff0c;Secure Attribution Unit&#xff09;或外部实现定义的属性单元&#xff08;IDAU&#xff0c;Implementation Defined Attribution Unit&#xff09;的组合控制。…

机器学习实验报告——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…

深度学习(5)---自注意力机制

文章目录 1. 输入与输出2. Self-attention2.1 介绍2.2 运作过程2.3 矩阵相乘理解运作过程 3. 位置编码4. Truncated Self-attention4.1 概述4.2 和CNN对比4.3 和RNN对比 1. 输入与输出 1. 一般情况下在简单模型中我们输入一个向量&#xff0c;输出结果可能是一个数值或者一个类…

【一站解决您的问题】mac 利用命令升级nodejs、npm、安装Nodejs的多版本管理器n、nodejs下载地址

一&#xff1a;下载nodejs 官网地址&#xff0c;点击下载稳定版 https://nodejs.org/en 如果官网下载特别慢&#xff0c;可以点击这个地址下载 点击这里 https://nodejs.cn/download/current/ 安装完成后&#xff0c;就包含了nodejs 和 npm。此时您的版本就是下载安装的版本…

数字频率合成器dds的量化性能分析matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 DDS的基本原理 4.2 DDS的量化性能分析 5.完整工程文件 1.课题概述 数字频率合成器dds的量化性能分析matlab仿真&#xff0c;分别定义累加器位宽&#xff0c;截位位宽&#xff0c;模拟DAC位宽等&…

制冷系统吸排气管路的设计

吸气管路的设计 由于流动产生的阻力损失,导致压缩机吸气口处的压力低于蒸发器出口处的压力。当吸气压力降低时&#xff0c;回气比容增大&#xff0c;压缩机的排气量减少&#xff0c;机组制冷量将会有损失。同时吸气管中还要维持足够高的制冷剂流速以使冷冻油能顺利返回压缩机。…

走出大模型部署新手村!小明这样用魔搭×函数计算

作者&#xff1a;拓山 前文介绍了魔搭 ModelScope 社区模型服务 SwingDeploy 服务。开发者可以将模型从魔搭社区的模型库一键部署至阿里云函数计算&#xff0c;当选择模型并部署时&#xff0c;系统会选择对应的机器配置。按需使用可以在根据工作负载动态的减少资源&#xff0c…

如何在WordPress网站中添加多语言搜索(2种简单方法)

您想在WordPress网站中添加多语言搜索吗&#xff1f; 如果您有一个多语言 WordPress 网站&#xff0c;那么添加多语言搜索功能可以帮助用户通过使用自己的语言进行搜索来更快地找到信息。 在本文中&#xff0c;我们将向您展示如何在 WordPress 中轻松添加多语言搜索&#xff…

C#,入门教程(31)——预处理指令的基础知识与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(30)——扎好程序的笼子&#xff0c;错误处理 try catchhttps://blog.csdn.net/beijinghorn/article/details/124182386 Visual Studio、C#编译器以及C#语法所支持的预处理指令&#xff0c;绝对是天才设计。 编译程序的时候会发现&am…

EasyRecovery2024易恢复专业免费可靠的国产数据恢复软件

EasyRecovery TM &#xff08;易恢复中国&#xff09;是由全球著名数据厂商Ontrack 出品的一款数据文件恢复软件。支持恢复不同存储介质数据&#xff1a;硬盘、光盘、U盘/移动硬盘、数码相机、Raid文件恢复等&#xff0c;能恢复包括文档、表格、图片、音视频等各种文件。 Easy…

Docker Ipvlan l3s模式说明

看到Docker Ipvlan中有三种模式L2、L3、L3S模式&#xff0c;查阅了L3S&#xff0c;记录如下&#xff1a; 起因 Docker链接: IPvlan network driver 概念 注释说明&#xff08;摘选自: ipvlan-l3s模式&#xff09; L3S mode与L3 mode 的区别在于启用了iptables (conn-track…

服务优雅下线

服务优雅下线 问题背景描述 运维同事反馈上线滚动发布&#xff0c;旧实例接收的请求发生业务中断&#xff0c;没有处理完成&#xff0c; 为保证服务质量&#xff0c;期望发布时旧实例将已有请求处理完成再回收。先说可能会带来的影响&#xff1a;业务处理中断 导致数据不完整…

开源项目CuteSqlite开发笔记(八):Windows 64位/32位使用GetWindowLongPtr钩子函数

需求描述 在开发CuteSqlite的时候&#xff0c; 有一个功能需要实现&#xff0c;鼠标移到WTL::CStatic上后&#xff0c;发送消息通知CToolTipCtrl弹出。 遇到问题 WTL::CStatic控件没有相应 WM_MOUSEMOVE 消息&#xff0c;需要返回一个HTCLIENT消息来让窗口处理函数执行 WM_MO…

【QT+QGIS跨平台编译】之六:【LZMA+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、lzma介绍二、文件下载三、文件分析四、pro文件五、编译实践一、lzma介绍 LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化后的压缩算法。 libLzma是基于LZMA压缩算法封装的开源库。2001年被首次应用于7-Zip压缩工具中,是 …

点亮流水灯

目录 1.water_led 2.tb_water_led 50MHZ一个周期是20ns,0.5秒就是20ns0.02um0.00002ms0.000_00002s。0.5/0.000_00002s25_000_000个时钟周期&#xff0c;表示要从0计数到24_999_999 LED灯是低电平点亮&#xff0c;前0.5秒点亮第一个LED灯&#xff0c;当检测到脉冲信号点亮第二…

关于缓存 db redis local 取舍之道

文章目录 前言一、影响因素二、db or redis or local1.db2.redis3. local 三、redisson 和 CaffeineCache 封装3.1 redisson3.1.1 maven3.1.2 封装3.1.3 使用 3.2 CaffeineCache3.1.1 maven3.1.2 封装3.1.3 使用 总结 前言 让我们来聊一下数据缓存&#xff0c;它是如何为我们带…

【C/C++】C/C++编程——为什么学习 C++?

当提到C的时候&#xff0c;很多人会觉得语法复杂、学习曲线陡峭&#xff0c;并且好像与C语言还有点"纠缠不清"。尽管如此&#xff0c;C仍然是当今世界上最受欢迎和最有影响力的编程语言之一。特别是在当今快速发展的人工智能&#xff08;AI&#xff09;领域&#xff…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数&#xff01;这是一个简单的教程&#xff0c;帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图&#xff0c;这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

NodeJs 第二十章 代理

在计算机网络中&#xff0c;代理是一种中间服务&#xff0c;能够代理用户与网络资源之间的通信。代理服务器可以缓存网页内容、过滤网络流量或隐藏用户的真实IP地址等功能。 在日常开发中&#xff0c;我们接触最多的是客户端发送ajax到服务端。但是服务端并不是 node &#xf…