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.rhkb.cn/news/423963.html

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

相关文章

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…

华为HCIA、HCIP和HCIE认证考试明细

华为认证体系包括三个主要等级&#xff1a;HCIA&#xff08;华为认证ICT助理&#xff09;、HCIP&#xff08;华为认证ICT高级工程师&#xff09;和HCIE&#xff08;华为认证ICT专家&#xff09;。每个等级的认证都有其特定的考试内容和费用。 HCIA&#xff08;华为认证ICT助理…

Excel 基础知识-操作手册2

十、查找与引用函数 Excel中的查找与引用函数非常丰富&#xff0c;以下是一些主要的函数及其使用示例&#xff1a; 1. **VLOOKUP** - 语法&#xff1a;VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) - 示例&#xff1a;假设A列是员工编号&#xff0c;B…

国际快递跟集运有什么区别?怎么做才能好集运?

在国际物流的舞台上&#xff0c;海外集运和国际快递是两种备受瞩目的运输方式&#xff0c;那两者之间有什么区别呢&#xff1f; 国际快递其实类似于国内快递&#xff0c;只是运输终点是海外。一般由公司或个人直接向海外邮寄&#xff0c;采用飞机运输&#xff0c;3 - 5 天就能…

IntelliJ IDE 插件开发 | (十二)自定义项目脚手架(上)

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在开发创建一个新项目的时候&#xff0c;我们一般都会使用平台自带的脚手架&#xff0c;如下图所示&#xff1a; 或者是使用网页版&#xff1a; 尽管平台已经…

先楫HPM6750 Windows下VSCode开发环境配置

用的是EVKmini&#xff0c;ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例&#xff0c;更改一下build path&#xff0c;可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行&#xff0c;用命令行启动vscode 新建.vscode文件夹&…

如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)

一、简述 在我们编写控制台应用程序时&#xff0c;默认情况下程序的打印输出会在控制台窗口中进行显示&#xff0c;我们在写服务功能时在窗口中会不断打印消息输出&#xff0c;这个时候如果使用鼠标点击了控制台窗口&#xff0c;会阻塞程序的继续运行&#xff0c;导致我们的程…

vue使用TreeSelect设置带所有父级节点的回显

Element Plus的el-tree-select组件 思路&#xff1a; 选中节点时&#xff0c;给选中的节点赋值 pathLabel&#xff0c;pathLabel 为函数生成的节点名字拼接&#xff0c;数据源中不包含。 在el-tree-select组件中设置 props“{ label: ‘pathLabel’ }” 控制选中时input框中回…

树莓派智能语音助手实现音乐播放

树莓派语音助手从诞生的第一天开始&#xff0c;我就想着让它能像小爱音箱一样&#xff0c;可以语音控制播放音乐。经过这些日子的倒腾&#xff0c;今天终于实现了。 接下里&#xff0c;和大家分享下我的实现方法&#xff1a;首先音乐播放模块用的是我在上一篇博文写的《用sound…

基于spring的博客系统(二)

4. 业务代码 4.1 持久层 根据需求, 先⼤致计算有哪些DB相关操作, 完成持久层初步代码, 后续再根据业务需求进⾏完善 1. ⽤⼾登录⻚ a. 根据⽤⼾名查询⽤⼾信息 2. 博客列表⻚ a. 根据id查询user信息 b. 获取所有博客列表 3. 博客详情⻚ a. 根据博客ID查询博客信息 b. 根据博客I…

现代 Web 开发工具箱:Element-UI 表单组件全攻略(二)

现代 Web 开发工具箱&#xff1a;Element-UI 表单组件全攻略&#xff08;二&#xff09; 一 . Switch 开关控件1.1 Switch 组件的创建① 注册路由② 创建 Switch 组件 1.2 Switch 组件的属性① 开关的宽度② 开关 打开/关闭 的文字提示③ 开关打开或者关闭时候的值④ 开关打开或…

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

测试通用面试题大全

24年软件测试的发展如何&#xff1f; 1、IT行业还会继续升温&#xff0c;高质量人才需求相对还是短缺。 2、要求变高之后&#xff0c;很难再下降了&#xff0c;学历和经验。 3、功能测试之外的东西&#xff0c;接口、性能和自动化要掌握一点。 4、长远来看&#xff0c;软件…

数据集 wider_face 人脸数据集 人脸检测 >> DataBall

数据集 wider 人脸检测数据集 WIDER FACE: A Face Detection Benchmark inproceedings{yang2016wider, Author {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou}, Booktitle {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, Title…

Radware Alteon 负载均衡-基于URL Filetype的七层负载均衡

作者&#xff1a;Xiaolei Ren Radware Alteon作为一款高性能的负载均衡器&#xff0c;其基于URL Filetype的七层负载均衡功能为众多企业提供了灵活、高效的解决方案。 该案例实现如下需求&#xff1a;当客户端访问服务器时&#xff0c;默认访问10.200.1.100&#xff0c;在ht…

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用 建议前提配置用到的命令参考文献&#xff1a; 建议 本文仅作个人记录&#xff0c;请勿完全照搬&#xff0c;建议直接看此视频&#xff0c;按作者的步骤进行配置 linux配置内外网&#xff08;ubuntu举例&#xff09;&am…

决策树算法上篇

决策树概述 决策树是属于有监督机器学习的一种&#xff0c;起源非常早&#xff0c;符合直觉并且非常直观&#xff0c;模仿人类做决策的过程&#xff0c;早期人工智能模型中有很多应用&#xff0c;现在更多的是使用基于决策树的一些集成学习的算法。 示例一&#xff1a; 上表根据…

Sparse4D v1

Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion Abstract 基于鸟瞰图 (BEV) 的方法最近在多视图 3D 检测任务方面取得了重大进展。与基于 BEV 的方法相比&#xff0c;基于稀疏的方法在性能上落后&#xff0c;但仍然有很多不可忽略的优点。为了…

四数之和--力扣18

四数之和 题目思路代码 题目 思路 类似于三数之和&#xff0c;先排序&#xff0c;利用双指针解题。 如果排序后的第一个元素大于目标值&#xff0c;直接返回&#xff0c;为什么nums[i]需要大于等于0&#xff0c;因为目标值可能为负数。比如&#xff1a;数组是[-4, -3, -2, -1…

大数据安全需求分析与安全保护工程

大数据安全威胁与需求分析 特征&#xff1a;海量是数据规模、快速的数据流转、多样的数据类型和价值密度低 种类和来源&#xff1a;结构化、半结构化和非结构化数据 数据种类&#xff1a; 结构化数据&#xff1a;关系模型数据&#xff0c;以关系数据库表形式管理的数据 非…