当前位置: 首页 > news >正文

OpenCV13-图像噪声:椒盐噪声和高斯噪声

OpenCV13-图像噪声:椒盐噪声和高斯噪声

    • 1.噪声种类
    • 2.椒盐噪声
    • 3.高斯噪声


1.噪声种类

图像噪声是指图像中的随机或非随机的不希望的视觉扰动。它可以出现在数字图像中的各种形式,例如颗粒状噪声、条纹、斑点、模糊、失真等。图像噪声可能是由于图像采集过程中的传感器噪声、电磁干扰、传输错误、压缩算法等原因引起的。

常见的图像噪声类型包括:

  1. 高斯噪声:高斯噪声是最常见的图像噪声类型之一。它是由于传感器噪声和环境干扰引起的,呈现为图像中的随机亮度变化。
  2. 椒盐噪声:椒盐噪声是指图像中出现随机黑白像素点,类似于盐和胡椒粉的颗粒。它通常是由于传感器故障或信号传输中的错误引起的。
  3. 斑点噪声:斑点噪声是指图像中出现的亮度不均匀的斑点,可能是由于摄像头或传感器的缺陷引起的。
  4. 条纹噪声:条纹噪声表现为图像中的水平或垂直条纹,通常是由于电源干扰或摄像头扫描时钟不稳定引起的。
  5. 压缩噪声:压缩噪声是在图像压缩中引入的,特别是在低比特率压缩中。它表现为图像细节的丢失、模糊或块状伪像。

为了减少或去除图像噪声,可以使用图像处理技术,例如平滑滤波、中值滤波、频域滤波等。这些技术可以根据噪声类型和特定应用的需求选择和调整参数,以改善图像质量并增强细节。

2.椒盐噪声

椒盐噪声又称作脉冲噪声,他会随机改变图像中的像素值,其样子就像是在图像上随机地撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。

OpenCV没有提供专门用于为图像添加椒盐噪声的函数,需要使用者根据需求编写生成噪声的程序。考虑到椒盐噪声会在图像中的任何一个位置随机产生,因此对于椒盐噪声的生成,需要使用OpenCV中能够产生随机数的函数 rand() 。为了能够生成不同数据类型的随机数,该函数拥有多种演变形式:

namespace cvflann
{inline int rand();// low与high是输出随机数的最小值与最大值inline double rand_double(double high = 1.0, double low = 0);inline int rand_int(int high = RAND_MAX, int low = 0);
}

添加椒盐噪声的步骤:

1.确定椒盐噪声的位置。通过随机函数生成两个随机数,确定噪声点的行和列。

2.确定噪声的种类。噪声点的黑白也是随机的,可以再生成一个随机数,根据奇偶性确定黑白。

3.修改图像像素灰度值。判断图像的通道数,灰度图像单通道赋一个值,彩色图像三通道赋3个值。

最终得到含有噪声的图像。

下面是代码实现:

#include <opencv2/core/utils/logger.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;//盐噪声函数
void saltAndPepper(cv::Mat image, int n)
{//using cvflann::rand();for (int k = 0; k < n / 2; k++){//随机确定图像中位置int i, j;i = cvflann::rand() % image.cols;  //取余数运算,保证在图像的列数内j = cvflann::rand() % image.rows;  //取余数运算,保证在图像的行数内int write_black = cvflann::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 (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()
{cout << "OpenCV Version: " << CV_VERSION << endl;utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);Mat lena = imread("lena.png");Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);if (lena.empty() || equalLena.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}imshow("lena原图", lena);imshow("equalLena原图", equalLena);saltAndPepper(lena, 10000);  //彩色图像添加椒盐噪声saltAndPepper(equalLena, 10000);  //灰度图像添加椒盐噪声imshow("lena添加噪声", lena);imshow("equalLena添加噪声", equalLena);int k = waitKey(0); // Wait for a keystroke in the windowreturn 0;
}

3.高斯噪声

高斯噪声是指噪声分布的概率密度函数服从高斯分布(正态分布)的一类噪声。概率密度函数如下:
p ( z ) = 1 2 π σ e − ( z − μ ) 2 2 σ 2 p(z) = \frac{1}{\sqrt{2 \pi \sigma}} e^{\frac{-(z-\mu)^2}{2 \sigma^2}} p(z)=2πσ 1e2σ2(zμ)2
其中, z z z 表示图像像素灰度值, μ \mu μ 表示像素值的平均值或者期望值, σ \sigma σ 表示像素值的标准差。

OpenCV中也没有专门为图像添加高斯噪声的函数,对早在图像中添加椒盐噪声的过程,可以根据需求利用能够产生随机数的函数来完成在图像中添加高斯噪声的任务。在OpenCV中提供了 fill() 函数能够产生均匀分布或者高斯分布的随机数,可以利用该函数产生符合高斯分布的随机数,之后在图像中加入这些随机数即可。

void cv::RNG::fill(InputOutputArray mat, // 存放随机数的矩阵int distType,   // 均匀分布RNG::UNIFORM 高斯分布RNG::NORMALInputArray a,   // 均匀分布的最小下限,高斯分布的均值InputArray b,   // 均匀分布的最大上限,高斯分布的标准差bool saturateRange = false // 预报和标志,仅用于均匀分布
);

fill() 函数是 RNG 类的成员函数,因此必须要创建类对象才能使用:

cv::RNG rng;
rng.fill(mat, RNG::NORMAL, 10, 20);

在图像中添加高斯噪声的步骤:

1.创建与图像尺寸、数据类型及通道数相同的Mat类变量。

2.调用fill()函数在Mat类变量中产生符合高斯分布的随机数。

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

最终得到添加高斯噪声之后的图像。

下面是示例代码:

#include <opencv2/core/utils/logger.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{cout << "OpenCV Version: " << CV_VERSION << endl;utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);Mat lena = imread("lena.png");Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);if (lena.empty() || equalLena.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}//生成与原图像同尺寸、数据类型和通道数的矩阵Mat lena_noise = Mat::zeros(lena.rows, lena.cols, lena.type());Mat equalLena_noise = Mat::zeros(lena.rows, lena.cols, equalLena.type());imshow("lena原图", lena);imshow("equalLena原图", equalLena);RNG rng;  //创建一个RNG类rng.fill(lena_noise, RNG::NORMAL, 10, 20);  //生成三通道的高斯分布随机数rng.fill(equalLena_noise, RNG::NORMAL, 15, 30);  //生成三通道的高斯分布随机数imshow("三通道高斯噪声", lena_noise);imshow("单通道高斯噪声", equalLena_noise);lena = lena + lena_noise;  //在彩色图像中添加高斯噪声equalLena = equalLena + equalLena_noise;  //在灰度图像中添加高斯噪声//显示添加高斯噪声后的图像imshow("lena添加噪声", lena);imshow("equalLena添加噪声", equalLena);int k = waitKey(0); // Wait for a keystroke in the windowreturn 0;
}

考虑到灰度值相加会超过255的情况,实际上如果值超过255会等于255:

int main()
{cout << "OpenCV Version: " << CV_VERSION << endl;utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);Mat a = (Mat_<uchar>(2, 2) << 130, 125, 127, 129);Mat b = (Mat_<uchar>(2, 2) << 130, 125, 127, 129);Mat c = a + b;cout << "a: " << endl << a << endl;cout << "b: " << endl << b << endl;cout << "c: " << endl << c << endl;int k = waitKey(0); // Wait for a keystroke in the windowreturn 0;
}
/*
a:
[130, 125;127, 129]
b:
[130, 125;127, 129]
c:
[255, 250;254, 255]
*/

相关文章:

OpenCV13-图像噪声:椒盐噪声和高斯噪声

OpenCV13-图像噪声&#xff1a;椒盐噪声和高斯噪声 1.噪声种类2.椒盐噪声3.高斯噪声 1.噪声种类 图像噪声是指图像中的随机或非随机的不希望的视觉扰动。它可以出现在数字图像中的各种形式&#xff0c;例如颗粒状噪声、条纹、斑点、模糊、失真等。图像噪声可能是由于图像采集过…...

天堂2服务器基本设置

[system] server_nameLocal Server ——〉服务器名称 server_rulesPvP http_host127.0.0.1 ——〉HTTP注册页面&#xff08;需先搭建IIS服务器&#xff09; http_port8080 rs_host127.0.0.1——〉填你IP rs_port3724 ws_host127.0.0.1 ——〉填你的IP就对啦 ws_port8085 wor…...

如何解决网站被攻击的问题

在当今数字化时代&#xff0c;网站攻击已经成为互联网上的一个常见问题。这些攻击可能会导致数据泄漏、服务中断和用户信息安全问题。然而&#xff0c;我们可以采取一些简单的措施来解决这些问题&#xff0c;以确保网站的安全性和可用性。 使用强密码和多因素认证 密码是保护网…...

python爬虫入门详细教程-采集云南招聘网数据保存为csv文件

python爬虫之User-Agent大全、随机获取User-Agent 网站地址数据提取技术介绍采集目标流程分析python代码实现 网站地址 https://www.ynzp.com/ 这个网址特别适合新手拿来练习&#xff0c;你采集多了还有个验证码页面&#xff0c;验证码是4位数字&#xff0c;很清晰&#xff0c…...

1.13.C++项目:仿muduo库实现并发服务器之TcpServer模块的设计

文章目录 一、LoopThreadPool模块二、实现思想&#xff08;一&#xff09;管理&#xff08;二&#xff09;流程&#xff08;三&#xff09;功能设计 三、代码 一、LoopThreadPool模块 TcpServer模块&#xff1a; 对所有模块的整合&#xff0c;通过 tcpserver 模块实例化的对象&…...

Spring(17) AopContext.currentProxy() 类内方法调用切入

目录 一、简介二、代码示例2.1 接口类2.2 接口实现类2.3 AOP切面类2.4 启动类&#xff08;测试&#xff09;2.5 执行结果 一、简介 背景&#xff1a; 在之前 Spring 的 AOP 用法中&#xff0c;只有代理的类才会被切入。例如&#xff1a;我们在 Controller 层调用 Service 的方式…...

自己的类支持基于范围的for循环 (深入探索)

自己的类支持基于范围的for循环 (深入探索) 编译器实际运行伪代码为: auto && __range range_expression; auto __begin begin_expr; auto __end end_expr; for (; __begin ! __end; __begin) {range_declaration *__begin;loop_statement }观察伪代码&#xff0…...

Multi Scale Supervised 3D U-Net for Kidney and Tumor Segmentation

目录 摘要1 引言2 方法2.1 预处理和数据增强2.2 网络的体系结构2.3 训练过程2.4 推理与后处理 3 实验与结果4 结论与讨论 摘要 U-Net在各种医学图像分割挑战中取得了巨大成功。一些新的、带有花里胡哨功能的架构可能在某些数据集中在使用最佳超参数时取得成功&#xff0c;但它们…...

《操作系统真象还原》第一章 部署工作环境

ref&#xff1a;https://www.bilibili.com/video/BV1kg4y1V7TV/?spm_id_from333.999.0.0&vd_source3f7ae4b9d3a2d84bf24ff25f3294d107 https://www.bilibili.com/video/BV1SQ4y1A7ZE/?spm_id_from333.337.search-card.all.click&vd_source3f7ae4b9d3a2d84bf24ff25f32…...

SpringCloud-Config

一、介绍 &#xff08;1&#xff09;服务注册中心 &#xff08;2&#xff09;管理各个服务上的application.yml&#xff0c;支持动态修改&#xff0c;但不会影响客户端配置 &#xff08;3&#xff09;一般将application.yml文件放在git上&#xff0c;客户端通过http/https方式…...

劣币驱良币的 pacing 之殇

都说 pacing 好 burst 孬(参见&#xff1a;为啥 pacing)&#xff0c;就像都知道金币好&#xff0c;掺铁金币孬一样。可现实中掺铁的金币流通性却更好&#xff0c;劣币驱良币。劣币流通性好在卖方希望收到别人的良币而储存&#xff0c;而自己作为买方只使用劣币。 burst 和 pac…...

Gin 中的 Session(会话控制)

Session 介绍 session和cookie实现的底层目标是一致的,但是从根本而言实现的方法是不同的; session 是另一种记录客户状态的机制, 不同的是 Cookie 保存在客户端浏览器中,而 session保存 在服务器上 ; Session 的工作流程 当客户端浏览器第一次访问服务器并发送请求时,服…...

ChatGPT AIGC 实现数据分析可视化三维空间展示效果

使用三维空间图展示数据有以下一些好处&#xff1a; 1可视化复杂性&#xff1a;三维图可以展示三个或更多的变量&#xff0c;一眼就能看出数据各维度之间的关系&#xff0c;使复杂数据的理解和分析变得更为直观。 2检测模式和趋势&#xff1a;通过三维图&#xff0c;用户可以…...

Stable Diffusion 动画animatediff-cli-prompt-travel

基于 sd-webui-animatediff 生成动画或者动态图的基础功能,animatediff-cli-prompt-travel突破了部分限制,能让视频生成的时间更长,并且能加入controlnet和提示词信息控制每个片段,并不像之前 sd-webui-animatediff 的一套关键词控制全部画面。 动图太大传不上来,凑合看每…...

fatal error C1083: 无法打开包括文件: “ta_libc.h”: No such file or directory

用python做交易数据分析时&#xff0c;可以用talib库计算各类指标&#xff0c;这个库通过以下命令安装&#xff1a; pip install TA-Lib -i https://pypi.tuna.tsinghua.edu.cn/simple windows安装时可能出现本文标题所示的错误&#xff0c;可按如下步骤解决&#xff1a; 1、去…...

c 语言基础题目:L1-034 点赞

微博上有个“点赞”功能&#xff0c;你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签&#xff0c;而你点赞的博文的类型&#xff0c;也间接刻画了你的特性。本题就要求你写个程序&#xff0c;通过统计一个人点赞的纪录&#xff0c;分析这个人的特性。 …...

SaaS人力资源管理系统的Bug

SaaS人力资源管理系统的Bug Bug1【18】 这里我是直接把代码复制过来的&#xff0c;然后就有一个空白 这是因为它的代码有问题&#xff0c;原本的代码如下所示 <el-table-column fixed type"index" label"序号" width"50"></el-table…...

GPTQ 和 AWQ:LLM 量化方法的比较

大语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;任务中取得了显著的进展。然而&#xff0c;LLM 通常具有非常大的模型大小和计算复杂度&#xff0c;这限制了它们在实际应用中的部署。 量化是将浮点数权重转换为低精度整数的过程&#xff0c;…...

JVM:虚拟机类加载机制

JVM:虚拟机类加载机制 什么是JVM的类加载 众所周知&#xff0c;Java是面向对象编程的一门语言&#xff0c;每一个对象都是一个类的实例。所谓类加载&#xff0c;就是JVM虚拟机把描述类的数据从class文件加载到内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&a…...

PHP筆記

​ 前言因緣際會下還是開始學習php了。經歷了風風雨雨終於在今年暑假要去加拿大留學了&#xff0c;php會是第二年的其中一門必修課程&#xff0c;加上最近前端也真的蠻心累&#xff0c;也許有一門精進的後端語言&#xff0c;日後轉職會有更寬廣的道路&#xff0c;對自己說加油&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...