【OpenCV • c++】图像噪音 | 椒盐噪音 | 高斯噪音

news2024/12/25 1:06:38

文章目录

    • 一、什么是图像噪音
    • 二、椒盐噪声
    • 三、高斯噪声

一、什么是图像噪音

  图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述, 也就是用它的概率分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。

二、椒盐噪声

  椒盐噪声是数字图像中的常见噪声,一般是由图像传感器、传输信道及解码处理等产生的黑白相见的亮暗点噪声,椒盐噪声常由图像切割产生。椒盐噪声是指两种噪声:盐噪声(salt noise)及椒噪声(pepper noise)。盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。图像去除脉冲干扰及椒盐噪声最常用的算法是中值滤波,图像模拟添加椒盐噪声是通过随机获取像素值点并设置为高亮点来实现的。
  下面时

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cstdlib>
using namespace cv;

// 向图像添加椒盐噪声的函数
Mat addSaltNoise(Mat srcImage, int n)
{
	Mat resultImage = srcImage.clone();

	// 循环添加椒盐噪声'n'次
	for (int k = 0; k < n; k++)
	{
		// 随机选择一个像素位置
		int i = rand() % resultImage.cols;
		int j = rand() % resultImage.rows;

		// 检查图像的通道数
		// 如果是灰度图像(1个通道),将像素值设置为255
		if (resultImage.channels() == 1)
			resultImage.at<uchar>(j, i) = 255;
		else // 如果是彩色图像(3个通道),将所有通道的值都设置为255
		{
			resultImage.at<Vec3b>(j, i)[0] = 255;
			resultImage.at<Vec3b>(j, i)[1] = 255;
			resultImage.at<Vec3b>(j, i)[2] = 255;
		}
	}

	return resultImage;
}

int main()
{
	// 从文件加载源图像
	Mat srcImage = imread("C://Users//86173//Desktop//cc.png");

	// 检查图像数据是否成功加载
	if (!srcImage.data)
		return -1;

	// 调用addSaltNoise函数,传入源图像和要添加的噪声像素数量
	Mat resultImage = addSaltNoise(srcImage, 5000);

	// 显示原始图像和带有噪声的图像
	imshow("srcImage", srcImage);
	imshow("resultImage", resultImage);

	// 等待按键输入,然后退出程序
	waitKey(0);
	return 0;
}

在这里插入图片描述

三、高斯噪声

  高斯噪声是指概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度服从高斯分布,而它的功率谱密度又是分布均匀的,则称它为高斯白噪声。高斯白噪声的二阶矩不想关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。高斯噪声完全由其时变平均值和两瞬时的协方差函数来确定,若噪声为平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之方差有关的相关函数,它在意义上等效于功率谱密度。高斯噪声可以由大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个脉冲值与所有脉冲值的总和相比都可以忽略不计。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cstdlib>
#include <limits>
#include <cmath>

using namespace cv;
using namespace std;

// 生成高斯分布的随机数
double generateGaussianNoise(double mu, double sigma)
{
    // 定义一个特别小的值
    const double epsilon = numeric_limits<double>::min();

    static double z0, z1;
    static bool flag = false;

    flag = !flag;

    // flag为假,构造高斯随机变量
    if (!flag)
        return z1 * sigma + mu;

    double u1, u2;

    // 构造随机变量
    do
    {
        u1 = rand() * (1.0 / RAND_MAX);
        u2 = rand() * (1.0 / RAND_MAX);
    } while (u1 <= epsilon);

    // flag为真构造高斯随机变量X
    z0 = sqrt(-2.0 * log(u1)) * cos(2 * CV_PI * u2);
    z1 = sqrt(-2.0 * log(u1)) * sin(2 * CV_PI * u2);

    return z1 * sigma + mu;
}

// 为图像添加高斯噪声
Mat addGaussianNoise(Mat& srcImage)
{
    Mat resultImage = srcImage.clone();    // 深拷贝,克隆
    int channels = resultImage.channels();    // 获取图像的通道
    int nRows = resultImage.rows;    // 图像的行数
    int nCols = resultImage.cols * channels;   // 图像的总列数

    // 判断图像的连续性
    if (resultImage.isContinuous())    // 判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
    {
        nCols *= nRows;
        nRows = 1;
    }

    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            // 添加高斯噪声
            int val = resultImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;

            if (val < 0)
                val = 0;

            if (val > 255)
                val = 255;

            resultImage.ptr<uchar>(i)[j] = (uchar)val;
        }
    }

    return resultImage;
}

int main()
{
    Mat srcImage = imread("C://Users//86173//Desktop//cc.png");

    if (!srcImage.data)
        return -1;

    imshow("srcImage", srcImage);

    Mat resultImage = addGaussianNoise(srcImage);

    imshow("resultImage", resultImage);

    waitKey(0);

    return 0;
}

在这里插入图片描述

  • 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • 💟 作    者:锡兰_CC ❣️
  • 📝 专    栏:【OpenCV • c++】计算机视觉
  • 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪

更多专栏订阅推荐:

  • 👍 【开卷数据结构】
  • 💛 【备战蓝桥,冲击省一】
  • 💕   从零开始的 c++ 之旅
  • 💖 【OpenCV • c++】计算机视觉

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

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

相关文章

C语言学习系列-->一篇带你看懂内存函数

文章目录 前言memcpy概述模拟实现 memmove概述模拟实现 memsetmemcmp总结 前言 上篇文章学习了C语言字符串函数&#xff0c;只是对字符串进行操作 本节&#xff0c;小编整理了一下C语言中的内存函数&#xff0c;对内存进行操作&#xff0c;只针对会内存块&#xff0c;不针对数据…

视频剪辑文案怎么写 视频剪辑文案用什么软件

视频剪辑文案与平面材料文案相比&#xff0c;在声音、画面的展现上自由度更高&#xff0c;视觉的丰满感也更高&#xff0c;是视听结合效果的呈现。本文会给大家介绍视频剪辑文案怎么写&#xff0c;视频剪辑文案用什么软件的相关内容&#xff0c;让大家可以在短时间内学会视频剪…

无涯教程-JavaScript - VDB函数

描述 VDB函数使用双倍余额递减法或您指定的某些其他方法返回您指定的任何期间(包括部分期间)的资产折旧。 VDB代表可变余额递减。 语法 VDB (cost, salvage, life, start_period, end_period, [factor], [no_switch])争论 Argument描述Required/OptionalCostThe initial co…

langchain主要模块(二):数据连接

langchain2之数据连接 langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.数据连接1.数据加载&#xff1a;2.文档分割&#xff1a;3.文档向量化&#xff1a;4.存储和检索向量数据:…

单例模式-饿汉模式、懒汉模式

单例模式&#xff0c;是设计模式的一种。 在计算机这个圈子中&#xff0c;大佬们针对一些典型的场景&#xff0c;给出了一些典型的解决方案。 目录 单例模式 饿汉模式 懒汉模式 线程安全 单例模式 单例模式又可以理解为是单个实例&#xff08;对象&#xff09; 在有些场…

SG-Former实战:使用SG-Former实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

Vue-video-player下载失败(npm i 报错)

Vue-video-player下载失败 最近在做项目时涉及到视频的播放组件&#xff0c;看了一下选择了Vue-video-player这个工具&#xff0c;实际在操作中是遇到许多问题的。 Q1:不支持谷歌 对于 “vue-video-player” 使用时出现 Adobe Flash 不再支持的提示&#xff0c;这是因为 Ado…

[maven] maven 简述及使用 maven 管理单个项目

maven 简述及使用 maven 管理单个项目 简单的说就是 maven 是一个项目管理工具&#xff0c;同时也是一个依赖管理工具。 使用 maven 生成的项目结构大致如下&#xff1a; project|- src/main/java|- src/main/resources|- src/test/java|- src/test/resources本篇笔记带一些…

服务器访问本机图片nginx配置

下面是Nginx的配置 然后是yml文件配置 后端返回给前端的数据直接返回这个地址就可以了 {"success": true,"code": "200","msg": "操作成功","data": [{"趋势": "https://120.26.98.185:8090/s…

Day62|图part1:深度优先搜索理论基础、797. 所有可能的路径

深度优先搜索&#xff08;DFS&#xff09;理论基础 图的实质和存储方式 图实际上就是一棵多叉树&#xff0c;可以用以下的数据结构进行表示&#xff1a; class Vertex {int id;vector<Vertex*> neighbors; };多叉树的&#xff1a; /* 基本的 N 叉树节点 */ class Tre…

第一章 计算机系统概述 八、虚拟机

目录 一、传统虚拟机的结构 二、两类虚拟机管理程序 &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;区别&#xff1a;&#xff08;考点&#xff09; 一、传统虚拟机的结构 二、两类虚拟机管理程序 &#xff08;1&#xff09;定义&#xff1a; &…

电子企业MES管理系统实施的功能和流程有哪些

MES生产管理系统是一种应用于电子企业的管理系统&#xff0c;旨在提高生产效率、降低浪费、优化资源利用&#xff0c;并实时监控和改善生产过程。在电子企业中&#xff0c;实施MES管理系统对于实现精细化管理、增强信息互联、提高产品质量和交货期等方面具有重要作用。 一、MES…

模电课设:用Multisim了解三极管特性及计算静态工作点

1 课设内容 1&#xff09;绘制三极管输入特性曲线、输出特性曲线、放大倍数的幅频特性&#xff1b; 2&#xff09;测试三极管放大倍数β与VBE的关系、放大倍数与温度的关系&#xff1b; 3&#xff09;利用Multisim计算静态工作点。 2 模型搭建 电路一&#xff1a;绘制三极管…

字节一面:如何实现单行/多行文本溢出的省略样式?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;css是我们的必备技能&#xff0c;文本溢出问题也是我们经常遇到的问题&#xff0c;我们不仅只是处理这种情况&#xff0c;还要考虑他的…

微信小程序 通过 pageScrollTo 滚动到界面指定位置

我们可以先创建一个page 注意 一定要在page中使用 因为pageScrollTo控制的是页面滚动 你在组件里用 他就失效了 我们先来看一个案例 wxml 代码如下 <view><button bindtap"handleTap">回到指定位置</button><view class "ControlHeight…

证件照电子版怎么做?学会这个方法自己就会做证件照

自己制作证件照的好处在于可以根据需要调整照片的大小、背景颜色以及美颜等设置&#xff0c;以满足不同场景下的使用需求。此外&#xff0c;自己制作证件照还可以更好地保护个人隐私&#xff0c;避免使用公共设备拍摄证件照时泄露个人信息。 总的来说&#xff0c;自己制作证件…

Webpack Sourcemap文件泄露漏洞

Webpack Sourcemap文件泄露漏洞 前言一、Webpack和Sourcemap1.1 什么是Webpack1.2 什么是Sourcemap 二、漏洞利用2.1 使用reverse-sourcemap工具2.1 直接看前端代码 三、漏洞挖掘漏洞修复 前言 Webpack主要是用于前端框架进行打包的工具&#xff0c;打包后形成.js.map文件&…

Revit SDK 介绍:CurtainSystem 幕墙系统

前言 这个例子介绍如何创建和修改幕墙系统。 内容 如图所示&#xff0c;创建一个幕墙系统&#xff0c;这个系统里有三个面。 创建幕墙系统 // 遍历体量元素的几何&#xff0c;得到所有的面&#xff0c;保存在 m_mydocument.MassFaceArray // 获取用户选中的面 FaceArray …

哪种IP更适合你的数据抓取需求?

程序员大佬们好&#xff01;今天我要和大家分享一个关于数据抓取的话题&#xff0c;那就是Socks5爬虫ip和动态IP之间的比较。在进行数据抓取时&#xff0c;选择适合自己需求的工具和技术是非常重要的。Socks5爬虫ip和动态IP都是常见的网络工具&#xff0c;它们在数据抓取方面都…

节能灯与led灯哪个对眼睛好一点?精选好用的led护眼灯

节能灯和led灯相比&#xff0c;肯定是led灯更加护眼一点的。 首先节能灯最大的优点就是节能&#xff0c;可以使用的寿命长。可是和led灯相比&#xff0c;led灯的转换效率会更好一点&#xff0c;也更加节能&#xff0c;可使用寿命也很长。其次节能灯他启动会比较慢&#xff0c;散…