6.6高斯噪声

news2024/9/29 21:20:32

在OpenCV联合C++中给一张图片添加高斯噪声(Gaussian Noise),可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。高斯噪声是一种统计分布服从正态分布的噪声,通常用于模拟自然界的许多物理现象。

示例代码

以下是一个使用OpenCV和C++给一张图片添加高斯噪声的示例代码:


#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <random>

using namespace cv;
using namespace std;

// 添加高斯噪声的函数
void addGaussianNoise(cv::Mat &image, double mean = 0, double stddev = 10)
{
	// 创建随机数生成器
	std::random_device rd;
	std::default_random_engine gen(rd());
	std::normal_distribution<double> dist(mean, stddev);

	// 获取图像的行数和列数
	int rows = image.rows;
	int cols = image.cols;

	// 遍历图像中的每一个像素
	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			// 生成一个高斯分布的随机数
			double noise = dist(gen);

			// 加上噪声
			//image.at<uchar>(i, j) = std::min(std::max(image.at<uchar>(i, j) + noise, 0), 255);
			//image.at<uchar>(i, j) = saturate_cast<uchar>(image.at<uchar>(i, j) + noise);
			//std::min(255, std::max(0, static_cast<int>(alpha1 * pixelValue + beta1)));
			image.at<uchar>(i, j) = std::min(255, std::max(0, static_cast<int>(image.at<uchar>(i, j) + noise)));

/static_cast<int>  的添加
			//image.at<uchar>(i, j) = saturate_cast<uchar>(image.at<uchar>(i, j) + noise);
		}
	}
}

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("03.jpeg", cv::IMREAD_GRAYSCALE);
	if (img.empty())
	{
		std::cerr << "Error loading image." << std::endl;
		return -1;
	}

	// 显示原始图像
	cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
	cv::imshow("Original Image", img);

	// 添加高斯噪声
	addGaussianNoise(img, 0, 10); // 平均值为0,标准差为10


	// 显示添加噪声后的图像
	cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
	cv::imshow("Noisy Image", img);

	cv::imwrite("Dst2.jpg", img);//写入照片

	cv::waitKey(0);

	return 0;
}


代码解释
1. 读取图像:使用 cv::imread 函数读取原始图像,并将其转换为灰度图像。
2. 添加高斯噪声:定义一个 addGaussianNoise 函数,该函数接受一个图像矩阵 image、均值 mean 和标准差 stddev。均值 mean 通常设置为0,标准差 stddev 控制噪声的强度。
3. 随机数生成器:使用 <random> 头文件中的 std::random_device 和 std::default_random_engine 生成随机数,std::normal_distribution 生成符合正态分布的随机数。
4. 遍历图像:遍历图像的每一个像素点,根据生成的高斯分布随机数给像素值加上噪声。
5. 限制像素值范围:确保像素值在0到255之间,避免超出8位灰度图像的范围。
6. 显示图像:使用 cv::imshow 函数显示原始图像和添加噪声后的图像。

参数调整
•均值 mean:通常设置为0,表示噪声的平均值为0,即噪声在正负方向上是对称的。
•标准差 stddev:标准差越大,噪声的强度越高,图像越模糊。

注意事项
•噪声强度:标准差 stddev 控制噪声的强度,可以根据需要调整该参数。
•数据类型:在加噪声时,需要注意像素值的数据类型。在上面的示例中,我们使用了 uchar 类型,因此需要确保像素值在0到255之间。
•性能优化:如果图像较大,遍历每一个像素可能会比较耗时,可以考虑使用OpenCV提供的并行处理方法,如 cv::parallel_for_ 等。


通过上述方法,你可以很容易地在OpenCV和C++中给一张图片添加高斯噪声。这对于模拟真实世界中的噪声情况非常有用,尤其是在图像处理和计算机视觉的研究和应用中。

运行结果

除噪方法

在OpenCV联合C++中去除一张图片上的高斯噪声,可以采用多种滤波方法。高斯噪声通常表现为像素值的随机波动,因此需要选择一种能够有效平滑图像的滤波方法。以下是一些常用的滤波方法及其适用性:

1. 高斯滤波(Gaussian Filtering)

高斯滤波是最常用来去除高斯噪声的方法之一。它通过应用一个高斯核来平滑图像,从而降低噪声的影响。高斯滤波在保留图像边缘的同时,能够很好地平滑图像。

示例代码

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("06.jpg", cv::IMREAD_GRAYSCALE);
	if (img.empty())
	{
		std::cerr << "Error loading image." << std::endl;
		return -1;
	}

	// 显示原始噪声图像
	cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
	cv::imshow("Noisy Image", img);

	// 应用高斯滤波
	cv::Mat denoisedImg;
	cv::GaussianBlur(img, denoisedImg, cv::Size(3, 3), 0); // ksize 为 3x3 的高斯滤波

	// 显示去噪后的图像
	cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);
	cv::imshow("Denoised Image", denoisedImg);

	cv::waitKey(0);

	return 0;
}


运行结果

2. 均值滤波(Mean Filtering)

均值滤波也是一种去除高斯噪声的方法,它通过计算每个像素点邻域内的平均值来替代中心像素值。均值滤波可以有效去除噪声,但可能会使图像变得模糊。

示例代码

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("06.jpg", cv::IMREAD_GRAYSCALE);
	if (img.empty())
	{
		std::cerr << "Error loading image." << std::endl;
		return -1;
	}

	// 显示原始噪声图像
	cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
	cv::imshow("Noisy Image", img);

	// 应用均值滤波
	cv::Mat denoisedImg;
	cv::blur(img, denoisedImg, cv::Size(3, 3)); // ksize 为 3x3 的均值滤波

	// 显示去噪后的图像
	cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);
	cv::imshow("Denoised Image", denoisedImg);

	cv::waitKey(0);

	return 0;
}

运行结果

3. 双边滤波(Bilateral Filtering)

双边滤波是一种非局部均值滤波方法,它在平滑图像的同时能够较好地保留边缘。双边滤波不仅考虑空间邻域,还考虑像素值的相似性,因此在去除高斯噪声的同时,可以较好地保留图像细节。

示例代码

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取图像
    cv::Mat img = cv::imread("path/to/noisy_image.jpg", cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cerr << "Error loading image." << std::endl;
        return -1;
    }

    // 显示原始噪声图像
    cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
    cv::imshow("Noisy Image", img);

    // 应用双边滤波
    cv::Mat denoisedImg;
    cv::bilateralFilter(img, denoisedImg, 9, 75, 75); // d=9, sigmaColor=75, sigmaSpace=75

    // 显示去噪后的图像
    cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);
    cv::imshow("Denoised Image", denoisedImg);

    cv::waitKey(0);

    return 0;
}

运行结果

4.中值滤波

示例代码

#include "pch.h"

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("06.jpg", cv::IMREAD_GRAYSCALE);
	if (img.empty())
	{
		std::cerr << "Error loading image." << std::endl;
		return -1;
	}

	// 显示原始噪声图像
	cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
	cv::imshow("Noisy Image", img);

	// 应用中值滤波
	cv::Mat denoisedImg;
	cv::medianBlur(img, denoisedImg, 3); // ksize 为 3 的中值滤波

	// 显示去噪后的图像
	cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);
	cv::imshow("Denoised Image", denoisedImg);

	cv::waitKey(0);

	return 0;
}

运行结果

5. 非局部均值去噪(Non-Local Means Denoising)

非局部均值去噪是一种高级去噪方法,它通过查找图像中的相似区域来进行去噪。这种方法可以在保持图像细节的同时去除噪声,尤其适用于高斯噪声。

示例代码

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取图像
    cv::Mat img = cv::imread("path/to/noisy_image.jpg", cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cerr << "Error loading image." << std::endl;
        return -1;
    }

    // 显示原始噪声图像
    cv::namedWindow("Noisy Image", cv::WINDOW_NORMAL);
    cv::imshow("Noisy Image", img);

    // 应用非局部均值去噪
    cv::Mat denoisedImg;
    cv::fastNlMeansDenoising(img, denoisedImg, 10, 7, 21); // h=10, templateWindowSize=7, searchWindowSize=21

    // 显示去噪后的图像
    cv::namedWindow("Denoised Image", cv::WINDOW_NORMAL);
    cv::imshow("Denoised Image", denoisedImg);

    cv::waitKey(0);

    return 0;
}

运行结果

总结

•高斯滤波:适用于去除高斯噪声,能够较好地平滑图像,但可能使图像略微模糊。

•均值滤波:简单易用,但会使图像更加模糊。

•双边滤波:在平滑图像的同时能够较好地保留边缘,适用于需要保持图像细节的情况。

•非局部均值去噪:高级去噪方法,能够在保持图像细节的同时去除噪声,尤其适用于高斯噪声。

根据具体的应用需求和图像特点,可以选择最适合的方法。如果需要去除高斯噪声同时尽量保留图像细节,可以优先考虑高斯滤波和双边滤波。如果需要更高级的去噪效果,可以考虑非局部均值去噪。

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

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

相关文章

设计师私藏的 PDF 转 JPG 利器

你平常会通过扫描来发送文件吗&#xff1f;为了保证图片的清晰度一般都会采用PDF格式来转发&#xff0c;但是要插入到一些文件里的时候PDF格式不是那么好用。这时候就很需要PDF转jpg工具了。今天我就分享几款我用过的PDF转jpg的工具&#xff0c;有兴趣就接着往下看吧。 1.福昕…

Win10下64位Python连接32位Oracle数据库

之前看了15分钟解决此问题&#xff0c;DPI-1047: Cannot locate a 64-bit Oracle Client library: “The specified module could not be-CSDN博客的办法&#xff0c;确实能用。但是打开PL/SQL Developer就会出现错误。 上面是我的version。原文章里面用了instantclient_11_2&a…

工业互联网网络集成与实训系统解决方案

随着工业4.0时代的到来和信息技术的高速发展&#xff0c;工业互联网已成为推动产业升级的重要力量。本方案旨在通过构建高度仿真的实训环境&#xff0c;帮助学生全面掌握工业互联网技术&#xff0c;为未来的职业生涯奠定坚实基础。 一、设计理念 在设计理念上&#xff0c;本方…

信息安全数学基础(13)简化剩余系

一、定义 设 m 是一个正整数&#xff0c;且 m>1。模 m 的简化剩余系是一个由模 m 的剩余类中的元素组成的集合&#xff0c;这些元素与 m 互素&#xff08;即它们的最大公约数为1&#xff09;。换句话说&#xff0c;模 m 的简化剩余系是模 m 的所有与 m 互质的数的集合。 二、…

o1模型:引领AI技术在STEM领域的突破与应用

o1模型是OpenAI最新推出的大型语言模型&#xff0c;它在多个领域展现出了卓越的能力&#xff0c;被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析&#xff1a; o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…

node版本切换(nvm工具)

最近接手了一个新项目&#xff0c;Node 版本切换的知识又遇到了&#xff0c;如果不及时切换版本&#xff0c;项目运营不起来&#xff0c;或是遇到一些报错。如何切换 Node 版本呢&#xff1f; 对于 Linux 或 macOS&#xff1a; curl -o- https://raw.githubusercontent.com/n…

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者&#xff1a; 尚雷5580 原文来源&#xff1a; https://tidb.net/blog/beeb9eaf 注&#xff1a;本文基于 TiDB 官网 董菲老师 《TiDB 数据库核心原理与架构&#xff08;101) 》系列教程之 《Lesson 01 TiDB 数据库架构概述》内容进行整理和补充。 课程链接&#xff1a;…

ESP8266_MicroPython——定时器_I2C 总线

MicroPython 文章目录 MicroPython前言一、定时器二、I2C 总线总结 前言 我们继续学习定时器和IIC 一、定时器 定时器&#xff0c;顾名思义就是用来计时的&#xff0c;我们常常会设定计时或闹钟&#xff0c;然后时间到了就告诉我们要做什么了。单片机也是这样&#xff0c;通…

AI大模型与产品经理:替代与合作的深度剖析

在创业的征途中&#xff0c;产品经理常常被外界以一种半开玩笑的口吻提及&#xff1a;“就差一个程序员了。”这句话背后&#xff0c;既蕴含着对产品经理创意与策略能力的认可&#xff0c;也揭示了技术实现环节对于产品成功不可或缺的重要性。然而&#xff0c;随着AI技术的飞速…

SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能

1、工程包结构 主要是这5个Java类 2、导入EasyExcel包 这里同时贴出其他相关springboot的基础包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depend…

Docker 网络基本概念

在之前讲 Redis 集群搭建的时候&#xff0c;我们用过一个选项 --net host​&#xff0c;现在就来讲讲该选项&#xff0c;以及 Docker 的网络。 docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluste…

【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation

文章目录 1、任务描述2、MASR RCNN 网络结构3、方法实现4、结果展示5、涉及到的库getPerfProfile 6、参考 1、任务描述 利用 mask rcnn 网络&#xff0c;进行图片和视频的目标检测和实例分割 2、MASR RCNN 网络结构 3、方法实现 # Copyright (C) 2018-2019, BigVision LLC (L…

YOLOv5改进 | 模块缝合 | C3 融合Self-Calibrated Convolutions丰富特征图【CVPR2020】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv5入门 改…

pgrouting实战应用

1&#xff09;下载地区地区数据&#xff08;下载数据是XYZM 四位数据&#xff09; 2&#xff09;下载裁剪行政区数据 3&#xff09;使用arcgis pro添加路网数据和行政区数据 4&#xff09;裁剪数据&#xff0c;仅历下行政区路网 5&#xff09;arcgis pro要素转线&#xff0…

基础GAN生成式对抗网络(pytorch实验)

&#xff08;Generative Adversarial Network&#xff09; 一、理论 https://zhuanlan.zhihu.com/p/307527293?utm_campaignshareopn&utm_mediumsocial&utm_psn1815884330188283904&utm_sourcewechat_session 大佬的文章中的“GEN的本质”部分 二、实验 1、数…

SIP ACK method

SIP ACK同样在RFC3261中定义。 ACK仅仅用于对INVITE request的response的回复&#xff0c;例如在通话结束时&#xff0c;MO要断开连接&#xff0c;此时就会生成一条BYE 消息。BYE不会经过代理&#xff0c;而是直接路由到MT。MT通过200 (OK) 响应确认收到 BYE&#xff0c;然后就…

vagrant+virtualbox+ubuntu22.04无法上网问题

一、过程 vagrantfile配置私有网络 config.vm.network "private_network", ip: "192.168.56.10"启动虚拟机&#xff0c;可以ping通百度的实际IP&#xff0c;ping不通域名修改/etc/netplan/50-vagrant.yaml&#xff0c;配置DNS network:renderer: Networ…

计算机毕业设计Python知识图谱美团美食推荐系统 美团餐厅推荐系统 美团推荐系统 美食价格预测 美团爬虫 美食数据分析 美食可视化大屏

《Python知识图谱美团美食推荐系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和互联网应用的普及&#xff0c;人们的消费习惯逐渐从线下转移到线上&#xff0c;外卖行业迎来了前所未有的发展机遇。美团作为国内领先的生活服务电子商务平台&#xff0c;拥有庞大的…

基于SpringBoot+Vue的考务报名平台(带1w+文档)

基于SpringBootVue的考务报名平台(带1w文档) 基于SpringBootVue的考务报名平台(带1w文档) 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

026.(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…