6.6高斯噪声

在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.xdnf.cn/news/1535371.html

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

相关文章

衡石分析平台使用手册-通用配置文档

配置文件​ 配置文件中存放 HENGSHI SENSE 的配置参数&#xff0c;可以通过修改配置文件来改变 HENGSHI SENSE 的服务方式。 配置文件说明​ 配置文件存放在 conf 路径下&#xff0c;包含 hengshi-sense-env.sh 和 engine-segment-hosts 两个文件。其中 engine-segment-host…

R18 Enhancements on CHO procedure for NES cell(s)(NES event)

在 R18 Network energy savings(NES) 之cell DTX/DRX https://t.zsxq.com/o1jnp 中有提到DCI format 2_9中的field NES-mode indication,这个field就与另一个NES feature相关,下面就简单看下。 在TR 38.864中有提到Connected mode mobility的内容:在 NES mode switching期间…

标准库、HAL库、LL库

目录 举例理解 概念理解 标准库&#xff08;Standard Peripheral Library&#xff0c;SPL&#xff09; 2. HAL库&#xff08;Hardware Abstraction Layer&#xff09; 3. LL库&#xff08;Low-Layer Library&#xff09; 总结区别 如何选择 实际应用中的结合使用 代码…

根据第七次人口普查数据探索中国平均预期寿命

一&#xff1a;数据介绍 数据来源&#xff1a;预期寿命数据集 - Heywhale.com 该数据提供了中国各地区在第七次人口普查&#xff08;2020年&#xff09;中的平均预期寿命&#xff0c;包括男性和女性的预期寿命。该表具有93行和3列。以下是关于这个数据表的具体信息&#xff1…

设计师私藏的 PDF 转 JPG 利器

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

蓝牙模块助力游戏设备开启沉浸式娱乐新体验

在当今科技飞速发展的时代&#xff0c;游戏设备正经历着一场前所未有的智能化变革。作为连接虚拟世界与现实体验的重要桥梁&#xff0c;蓝牙模块已经成为游戏设备不可或缺的核心组件之一。它的广泛应用&#xff0c;不仅为玩家提供了更加便捷、流畅的游戏体验&#xff0c;更推动…

python制作石头剪刀布

方法一&#xff1a; import random def rock_paper_scissors(): user_score 100 computer_score 100 while user_score > 0 and user_score < 200: user_choice int(input("请输入1&#xff08;剪刀&#xff09;、2&#xff08;石头&#x…

算子级血缘在金融数据环境的实践应用

在企业的数据管理领域&#xff0c;算子级血缘极大优化了脚本内部字段口径的理解与追踪。面对几十、几百乃至几千行代码的复杂脚本&#xff0c;并且有着各种函数调用、数据转换等复杂的加工逻辑&#xff0c;如果通过传统的 ETL 工作模式&#xff0c;开发人员就不得不采用“盲人摸…

PDF——压缩大小的方法

方法一&#xff1a;QQ浏览器->格式转换->PDF转纯图PDF

从“看”到“管”:EasyCVR安防监控平台如何推动城市管理模式的转型升级

在21世纪的今天&#xff0c;随着城市化进程的加速推进&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;城市管理面临着前所未有的挑战。从公共安全、交通管理到环境保护、应急响应&#xff0c;每一个领域都对城市的治理能力和效率提出了更高要求。在这…

【STM32】DMA数据转运(存储器到外设)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 外设DMA请求使能 DMA1 DMA2 常用的外设DMA使能库函数 配置串口发送的DMA请求 驱动代码 MyDMA.h MyDMA.c main.c 前言 【STM32】DMA数据转运&#xff08;存储器到存储器&a…

c++----模板(进阶)

也是好久没有更新了今天来将我们前面写过的模板更加升华一下。更加深一下。我们还记得我们前面讲过的模板&#xff0c;只是简单的运用模板而且还是参数类型模板。当然大家如果敏锐一点的话&#xff0c;应该就能看出这句话的问题看吧。我这里说的是参数类型模板&#xff0c;那么…

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性

先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的&#xff0c;最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式&#xff0c;不是单向加密 那么如下进行…

Java在零工市场中的应用:构建灵活高效的劳动力平台

随着数字经济的迅猛发展&#xff0c;零工经济作为一种新兴的劳动力市场模式&#xff0c;正在全球范围内迅速崛起。零工市场通过互联网平台将服务提供者与需求者进行快速匹配&#xff0c;使得个人可以临时、自由地提供服务&#xff0c;企业则能够按需雇佣劳动力&#xff0c;实现…

清理微信一些文件

C盘的微信文件实在是太难搞了&#xff0c;怎么弄怎么麻烦 一般文件保存在手机端或者自己的文件夹更多&#xff0c;要清理呀 不然卡秃噜皮了怎么办是啊不 路径如图

【JAVA入门】Day45 - 压缩流 / 解压缩流

【JAVA入门】Day45 - 压缩流 / 解压缩流 文章目录 【JAVA入门】Day45 - 压缩流 / 解压缩流一、解压缩流二、压缩流 在文件传输过程中&#xff0c;文件体积比较大&#xff0c;传输较慢&#xff0c;因此我们发明了一种方法&#xff0c;把文件里的数据压缩到一种压缩文件中&#x…

Linux与Ubuntu:内核与发行版的关系

在计算机科学的领域内&#xff0c;Linux和Ubuntu这两个术语频繁出现&#xff0c;但它们之间的确切联系往往不为大众所熟知。本文旨在深入探讨Linux内核与Ubuntu操作系统发行版之间的技术关系&#xff0c;并阐明它们各自的独特性质。 Linux内核&#xff1a;操作系统的基石 Lin…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>> 双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践技术应用 目录 专题一、DNDC模型介绍 专题二&#xff1a;DNDC初步操作 专题三、遥感和GIS基础 专题四、DNDC气象数据 专题五、DNDC土地数据 专题六…

项目警告Added non-passive event listener to a scroll-blocking ‘touchstart‘ event.

使用touchstart和touchmove时项目报如下警告&#xff1a; 这个警告信息是由浏览器提供的&#xff0c;主要是为了提醒开发者关注性能问题。在移动设备上&#xff0c;touchstart事件可能会导致滚动操作的响应问题。当你在touchstart事件上添加了一个非被动的监听器&#xff08;即…

统计/nginx/access.log中每个ip的访问次数,按高到低排列

/nginx/access.log具体内容长这样&#xff1a; 第一个元素就是ip。 awk {print $1} /nginx/access.log | sort | uniq -c | sort -r首先&#xff0c;awk {print $1} /nginx/access.log 从 /nginx/access.log文件的每行中提取出第一个字段。然后&#xff0c;sort 对提取出的第…