6.5椒盐噪声

news2024/9/20 14:36:39

在OpenCV中联合C++给一张图片加上椒盐噪声(Salt and Pepper Noise)可以通过随机选择像素点并将其置为黑色(0)或白色(255)来实现。椒盐噪声是一种随机噪声,通常表现为图像中的孤立黑点(盐噪声)和孤立白点(胡椒噪声)。

实现方法

以下是使用OpenCV和C++给图像添加椒盐噪声的一个简单示例:

#include "pch.h"

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

// 添加椒盐噪声的函数
void addSaltAndPepperNoise(cv::Mat &image, double noiseRatio = 0.05)
{
	// 创建随机数生成器
	std::random_device rd;
	std::mt19937 gen(rd());
	std::uniform_real_distribution<> dis(0.0, 1.0);

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

	// 遍历图像中的每一个像素
	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			// 产生一个介于0和1之间的随机数
			double r = dis(gen);

			// 根据噪声比例添加噪声
			if (r < noiseRatio / 2)
			{
				// 添加盐噪声(白色点)
				image.at<uchar>(i, j) = 255;
			}
			else if (r < noiseRatio)
			{
				// 添加胡椒噪声(黑色点)
				image.at<uchar>(i, j) = 0;
			}
		}
	}
}

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("00.jpg", 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);

	// 添加椒盐噪声
	addSaltAndPepperNoise(img, 0.05); // 噪声比例为5%



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

	cv::waitKey(0);

	return 0;
}

代码解释
1. 读取图像:使用 cv::imread 函数读取原始图像,并将其转换为灰度图像。
2. 添加椒盐噪声:定义一个 addSaltAndPepperNoise 函数,该函数接受一个图像矩阵 image 和一个噪声比例 noiseRatio。噪声比例表示图像中添加噪声的概率。
3. 随机数生成器:使用 <random> 头文件中的 std::random_device 和 std::mt19937 生成随机数,std::uniform_real_distribution 生成介于0到1之间的随机数。
4. 遍历图像:遍历图像的每一个像素点,根据随机数决定是否添加噪声。
5. 添加噪声:如果随机数小于噪声比例的一半,则添加盐噪声(白色点);如果随机数大于噪声比例的一半且小于噪声比例,则添加胡椒噪声(黑色点)。
6. 显示图像:使用 cv::imshow 函数显示原始图像和添加噪声后的图像。

噪声比例

噪声比例 noiseRatio 控制着图像中噪声点的数量。例如,noiseRatio = 0.05 表示有5%的概率会在图像中的任意像素点上添加噪声。

调整参数
你可以根据需要调整 noiseRatio 参数来控制噪声的密度。如果你希望噪声更密集,可以增加 noiseRatio 的值;反之亦然。

注意事项
•噪声分布:椒盐噪声通常表现为随机分布的黑白点,因此需要确保噪声点在整个图像中均匀分布。
•性能优化:在实际应用中,如果图像较大,遍历每一个像素可能会比较耗时,可以考虑使用 OpenCV 提供的一些优化手段,如并行处理等。

通过上述方法,你可以很容易地在 OpenCV 和 C++ 中给图像添加椒盐噪声。这对于图像处理和计算机视觉应用中的噪声建模和去噪研究非常有用。

运行结果

除噪方案

在OpenCV联合C++中,要去除一张图片上的椒盐噪声,通常可以采用以下几种滤波方法:

1. 中值滤波(Median Filtering):这是去除椒盐噪声最常用的方法之一。中值滤波通过对图像中的每个像素点应用一个中值滤波器来去除噪声,该滤波器用邻域内的中值像素值替换中心像素值。

2. 均值滤波(Mean Filtering):虽然均值滤波也能在一定程度上去除噪声,但它可能会模糊图像的边缘和细节,因此在处理椒盐噪声时不如中值滤波有效。

3. 双核滤波(Bilateral Filtering):双核滤波既能保留边缘又能去噪,但在处理椒盐噪声时可能不如中值滤波效果好。

4. 高斯滤波(Gaussian Filtering):高斯滤波也是常用的去噪方法之一,但对于椒盐噪声,它的效果通常不如中值滤波。

中值滤波

中值滤波是最适合去除椒盐噪声的滤波方法之一,因为它能够很好地保留图像的边缘和其他重要特征,同时有效地去除噪声点。

示例代码以下是一个使用OpenCV和C++进行中值滤波的示例代码:

#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::medianBlur(img, denoisedImg, 3); // ksize 为 3 的中值滤波

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

    cv::waitKey(0);

    return 0;
}

代码解释
1. 读取图像:使用 cv::imread 函数读取带有椒盐噪声的原始图像,并将其转换为灰度图像。
2. 显示原始噪声图像:使用 cv::imshow 函数显示原始噪声图像。
3. 应用中值滤波:使用 cv::medianBlur 函数对图像进行中值滤波处理,参数 ksize 为滤波器的大小,通常选择奇数值,如3、5等。
4. 显示去噪后的图像:使用 cv::imshow 函数显示去噪后的图像。

运行结果

其他滤波方法

虽然中值滤波是处理椒盐噪声的首选方法,但也有其他方法可以尝试:

均值滤波

均值滤波通过计算每个像素点的邻域平均值来代替中心像素值,可以平滑图像并去除噪声,但对于椒盐噪声,其效果不如中值滤波。

#include "pch.h"

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

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("01.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 meanFilteredImg;
	cv::blur(img, meanFilteredImg, cv::Size(3, 3)); // ksize 为 3x3 的均值滤波


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

	cv::waitKey(0);

	return 0;
}

运行结果

双核滤波

双核滤波能够在平滑图像的同时保留边缘,但对椒盐噪声的处理效果一般。

#include "pch.h"

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

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("Dst.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 bilateralFilteredImg;
	cv::bilateralFilter(img, bilateralFilteredImg, 9, 75, 75); // d=9, sigmaColor=75, sigmaSpace=75


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

	cv::waitKey(0);

	return 0;
}

运行结果

高斯滤波

高斯滤波通过应用高斯核对图像进行平滑处理,可以去除高斯噪声,但对椒盐噪声的效果有限。

#include "pch.h"

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

int main()
{
	// 读取图像
	cv::Mat img = cv::imread("01.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 gaussianFilteredImg;
	cv::GaussianBlur(img, gaussianFilteredImg, cv::Size(3, 3), 0); // ksize 为 3x3 的高斯滤波

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

	cv::waitKey(0);

	return 0;
}

运行结果

​​​​​​​

总结

在处理椒盐噪声时,中值滤波是最常用且有效的滤波方法。它能够很好地去除噪声点,同时保留图像的边缘和其他重要特征。如果你需要在OpenCV和C++中去除椒盐噪声,建议首先尝试中值滤波。如果需要进一步处理或尝试其他滤波方法,可以根据具体需求选择合适的滤波器。

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

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

相关文章

Windows环境下 VS2022 编译 LAME 源码

LAME LAME 是一个非常流行的开源 MP3 编码器库&#xff0c;它的全称是 “LAME Ain’t an MP3 Encoder”&#xff0c;这是一个带有讽刺意味的名字&#xff0c;因为 LAME 实际上是一个功能强大的 MP3 编码器。LAME 的开发始于 1998 年&#xff0c;目的是创建一个开放源代码的库&a…

AIPaperGPT写论文靠谱吗?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在信息爆炸的今天&#xff0c;学术写作的挑战日益增加&#xff0c;而AIPaperGPT作为一款旨在提升写作效率的工具&#xff0c;其可靠性自然成为了用户关注的焦点。本文将从多个维度对AIPaperGPT进行全面评估&…

(java+Seleniums3)自动化测试实战

一.web自动化测试基础 密码的加密处理--是在前端JavaScript 二.selenium IDE录制 打开火狐浏览器&#xff1a; 点击 寻找更多附加组件 输入&#xff1a; 选择&#xff1a; 跳转&#xff1a;点击 安装完成&#xff0c;打开之后是这个页面&#xff1a; 录制一个新的测试用例在一个…

黑马点评17——多级缓存-Lua语法

文章目录 Lua语法初始Lua变量和循环条件控制、函数 变量和循环函数和条件控制 Lua语法 初始Lua https://www.lua.org/ 魔兽的一些插件就是用lua开发的。 centOs已经装好了lua&#xff0c;直接用~ 变量和循环 条件控制、函数 变量和循环 函数和条件控制

python项目无法启动?在终端运行 manage.py runserver 8000 没反应该怎么解决

运行 manage.py runserver 8000 没反应&#xff0c;出现提示语句&#xff1a; 根据提示修改命令再次运行 .\manage.py runserver 8000 仍然没反应 解决办法&#xff1a; 1、添加当前目录到 PATH&#xff1a;临时将当前目录添加到 PATH 环境变量中。使用以下命令&#xff1a; …

如何理解有效值电流?电流的均方根值

电流的有效值就是电流的均方根。 有效值电流定义&#xff1a;将一直流电与一交流电分别通过相同阻值的电阻&#xff0c;如果相同时间内两电流通过电阻产生的热量相同&#xff0c;就说这一直流电的电流值是这一交流电的有效值。 如果说电流就是直流电&#xff0c;那么电流的有效…

一、数据结构和算法概述

文章目录 一、数据结构的介绍二、线性结构和非线性结构 一、数据结构的介绍 二、线性结构和非线性结构

Numpy中常用的数学方法

目录 1、数学运算符2、比较运算符3、常用的数学函数4、常用的统计函数 1、数学运算符 import numpy as npa np.array([10,4,6,7]) b np.arange(4) # 两数组值相加 cab # 数组的值平方 db**2 # 两数组对应的值相乘 ea*b # 两数组对应的值相除 fc/a # 两数组对应的值取余 gc…

JDBC的介绍续

四 JDBC的事务支持 4.1 银行转账案例演示 4.4.1 案例分析&#xff1a; 1.需求&#xff1a;一个账号fromAccount向另一个账号toAccount转入money元钱 2.分析&#xff1a; - 检查两个账号是否存在&#xff0c;不存在的话&#xff0c;结束转账行为 - 检查转出账号的里金…

N 皇后

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 ‘Q’ 和 ‘.’…

RP2040 C SDK 64位定时器功能使用

RP2040 C SDK 64位定时器功能使用 &#x1f9e8;RP2040的64位定时器功能介绍参见&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_timer &#x1f389;RP2040有一个单64位计数器&#xff0c;每微秒递增一次看起来很复杂&#xf…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 3 搭建项目] 02 配置 nodejs 淘宝镜像仓库

文章目录 为什么要配置淘宝镜像仓库呢如何查看镜像仓库如何配置镜像仓库 为什么要配置淘宝镜像仓库呢 主要是因为默认的镜像仓库是国外的&#xff0c;当我们使用 npm 安装依赖的时候会很慢或者失败&#xff0c;我们配置国内的镜像仓库这样就可以加速我们安装镜像的过程&#x…

这些加密软件功能你都知道吗?

1.透明加密与无感操作&#xff1a; 透明加密是许多现代加密软件的核心功能之一&#xff0c;它允许用户在无感知的情况下对文件进行加密和解密。这意味着用户无需改变日常操作习惯&#xff0c;加密和解密过程在后台自动完成&#xff0c;确保了数据的安全性同时不影响工作效率。…

【阿雄不会写代码】全国职业院校技能大赛GZ036第十套

也不说那么多了&#xff0c;要用到这篇博客&#xff0c;肯定也知道他是干嘛的&#xff0c;给博主点点关注点点赞&#xff01;&#xff01;&#xff01;这样博主才能更新更多免费的教程&#xff0c;不然就直接丢付费专栏里了&#xff0c;需要相关文件请私聊

关于OceanBase MySQL 模式中全局索引 global index 的常见问题

在OceanBase的问答区和开源社区钉钉群聊中&#xff0c;时常会有关于全局索引 global index的诸多提问&#xff0c;因此&#xff0c;借这篇博客&#xff0c;针对其中一些普遍出现的问题进行简要的解答。 什么是 global index &#xff1f; 由于 MySQL 不具备 global index 的概…

利用TCP编程实现FTP功能

模拟FTP核心原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;那么清空…

uboot源码分析uboot启动流程,uboot-CMD命令调用关系

uboot的最终目的是引导启动内核加载系统&#xff0c;根据这个线索我们可以首先找到uboot引导内核的main函数&#xff0c;查看系统引导的执行跳转的函数 main_loop。 下面对uboot函数的调用关系和主要调用函数进行分析。 一、uboot函数调用关系梳理 函数调用如下&#xff1a; …

Ollama 本地运行大模型(LLM)完全指南

文章介绍了 Ollama 本地运行大模型&#xff08;LLM&#xff09;的方方面面&#xff0c; 包括安装运行、对话、自定义模型、系统提示配置、调试、开发、存储、如何作为服务、OpenAI 的兼容等。 这一年来&#xff0c;我已经习惯了使用线上大模型 API 来工作&#xff0c;只要网络…

2025毕业设计免费指导!!

本人专注于Android/java/PHP/Python/人工智能/数据库/微信小程序技术等领域的开发&#xff0c;以及有好几年的计算机毕业设计方面的实战开发经验和技术积累&#xff1b;尤其是在图像识别、网站开发和微信小程序的开发&#xff0c;很是熟悉和了解&#xff1b;本人也是多年的全栈…

DevOps实现CI/CD实战(六)- Jenkins集成k8s

十、 Jenkins集成k8s Jenkins在集成K8s之前&#xff0c;需要搭建k8s集群&#xff0c;具体搭建步骤&#xff0c;完整笔记 https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps&#xff0c; 包括完整的DevOps的笔记。 1. 准备部署的yml文件 pipeline.yml …