6.5椒盐噪声
在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++中去除椒盐噪声,建议首先尝试中值滤波。如果需要进一步处理或尝试其他滤波方法,可以根据具体需求选择合适的滤波器。
相关文章:
6.5椒盐噪声
在OpenCV中联合C给一张图片加上椒盐噪声(Salt and Pepper Noise)可以通过随机选择像素点并将其置为黑色(0)或白色(255)来实现。椒盐噪声是一种随机噪声,通常表现为图像中的孤立黑点(…...
CSS样式的引用方式以及选择器使用
1. CSS 引用方式 CSS 可以通过三种方式引用到 HTML 文件中: 行内样式(Inline Styles):直接在 HTML 元素中定义样式。内部样式表(Internal CSS):在 HTML 文档的 <head> 部分使用 <sty…...
Python Flask_APScheduler定时任务的正确(最佳)使用
描述 APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务,在使用过程当中也遇到很多问题,例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…...
Linux命名管道
通信的前提是让不同的进程看到同一份资源,因为路径是具有唯一性的,所以我们可以使用路径文件名来唯一的让不同进程看到同一份资源,实现没有血缘关系的两个进程进行管道通信 1.指令级 mkfifio(FILENAME,0666) …...
Xinstall助力App全渠道统计,参数传递下载提升用户体验!
在移动互联网时代,App已成为我们日常生活中不可或缺的一部分。然而,对于App开发者来说,如何有效地推广和运营自己的应用,却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下,如何精准…...
【时时三省】(C语言基础)指针进阶 例题4
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 strlen是求字符串长度 这个需要算上\0 第一个arr 是打印6 因为它加上\0是有六个元素 第二个arr0 数组名相当于首元素的地址 a的地址加0还是a的地址 所以这个地方还是…...
k8s的配置管理
一、配置管理分为两种: 1. 加密配置:用来保存密码和token密钥对以及其它敏感的k8s资源。 2.应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中的容器。 二、加密配置 1.secret三种类型…...
JAVA- 多线程
一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。࿰…...
【Qt】解决设置QPlainTextEdit控件的Tab为4个空格
前言 PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合,它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面(GUI)的应用程序,以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。…...
elementUI根据列表id进行列合并@莫成尘
本文章提供了elementUI根据列表id进行列合并的demo,效果如图(可直接复制代码粘贴) <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…...
基于人工智能的智能安防监控系统
目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据采集与预处理模型训练与预测实时监控与检测应用场景结论 1. 引言 随着科技的发展,智能安防监控系统逐渐成为家庭、企业和公共场所保障安全的核心工具。通过人工智能和计…...
分享从零开始学习网络设备配置--任务6.3 使用基本ACL限制网络访问
任务描述 某公司构建了互联互通的办公网,为保护公司内网用户数据的安全,该公司实施内网安全防范措施。公司分为经理部、财务部和销售部,分属3个不同的网段,3个部门之间用路由器进行信息传递。为了安全起见,公司领导要求…...
数据结构——线性表(静态链表、循环链表以及双向链表)
1、静态链表 用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。 静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。 最后一个指向第一个有数据的下标地址,第一个游标指向第一个没有数据的下标地址。 我们对…...
vue3_对接腾讯_实时音视频
项目需要对接腾讯的实时音视频产品,我这里选择的是多人会议,选择其他实时音视频产品对接流程也一样,如何对接腾讯实时音视频的多人会议产品,从开通服务到对接完成,一 一讲解。 一、开通腾讯实时音视频 1.腾讯实时音视…...
一台电脑对应一个IP地址吗?探讨两台电脑共用IP的可能性
在当今数字化时代,IP地址作为网络世界中的“门牌号”,扮演着至关重要的角色。它负责在网络上唯一标识每一台设备,使得数据能够在庞大的互联网中准确无误地传输。然而,对于IP地址与电脑之间的对应关系,许…...
XInput手柄输入封装
功能全面地封装了XInput的输入, 1. 普通按钮按下, 按住, 弹起状态检查, 2. 摇杆4个方向的按下, 按住, 弹起检查 3. 按键状态变化检测并且记录按下触发时间, 按住保持时间, 方便用来完全自定义的输入功能 4. 多手柄输入合并 CXinputHelper.h #pragma once #include <win…...
NodeMCU-ESP8266+flash_download_tool_3.9.7 烧录
USB-TTL 接 NodeMCU的RXD0, TXD0, GND 例程hello_world: Eclipse编译信息: python /d/ESP/ESP8266_RTOS_SDK/ESP8266_RTOS_SDK/components/esptool_py/esptool/esptool.py --chip esp8266 --port COM6 --baud 115200 --before default_reset --after …...
首例开源的自动驾驶混合运动规划框架,手握“规划可解释”和“决策准确”两张王牌!
导读: 本文开发了一种新的混合运动规划方法,将环境和预测信息集成在Frenet坐标系中,提升了运动规划能力。本文将传统运动规划算法的可预测性和稳定性与RL的动态适应性相结合,从而形成了一个能够有效管理复杂情况并适应不断变化的环…...
数据结构之红黑树的 “奥秘“
目录: 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何 一条从根…...
【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/cheinlu/groundhog-charging-syst…...
如何突破Office功能限制?本地化激活方案全解析
如何突破Office功能限制?本地化激活方案全解析 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 当…...
别再死记硬背Modbus了!用Python+Modbus-TCP/RTU模拟器5分钟搞懂数据帧
用PythonModbus模拟器5分钟实战协议帧解析 当你第一次接触工业通信协议时,那些晦涩的术语和抽象的数据帧结构是否让你望而生畏?作为在工业自动化领域工作多年的开发者,我完全理解这种挫败感。传统学习Modbus的方式往往从理论入手,…...
屏幕取色与设计辅助工具 ColorWanted:提升设计师与开发者工作效率的专业解决方案
屏幕取色与设计辅助工具 ColorWanted:提升设计师与开发者工作效率的专业解决方案 【免费下载链接】ColorWanted Screen color picker for Windows (Windows 上的屏幕取色器) 项目地址: https://gitcode.com/gh_mirrors/co/ColorWanted 你是否曾遇到这样的工作…...
Qwen3.5-9B-AWQ-4bit部署指南:双卡RTX 4090-D镜像免配置快速上手
Qwen3.5-9B-AWQ-4bit部署指南:双卡RTX 4090-D镜像免配置快速上手 1. 模型概述 千问3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合处理以下任务: 图片主…...
ARL灯塔扫不出指纹?手把手教你用Python脚本批量导入指纹库,提升资产识别准确率
ARL灯塔指纹识别优化实战:Python脚本批量导入与精准率提升指南 资产侦察灯塔(ARL)作为渗透测试领域的重要工具,其核心价值在于准确识别目标资产的技术特征。然而许多中级用户发现,默认指纹库在面对特定行业或新型资产…...
INNISO1接口模块
INNIS01 接口模块INNIS01 是一款应用于工业自动化控制系统中的接口模块,主要用于实现控制系统内部或与外部设备之间的信号连接与数据交互,属于系统中的通信与接口扩展单元。一、基本概述INNIS01 接口模块通常用于连接控制器与现场设备或其他功能模块&…...
从 14 万美元支付事故看:AI 写的代码过了所有测试,为什么活不过生产?
我审计过的一家科技公司,曾因一段 AI 生成的异步支付处理代码,遭遇了一场灾难性的生产事故。这段代码完美通过了所有自动化检查、单元测试与集成测试,标注着「All checks passed」被顺利合并到生产环境,最终却触发了竞态条件与重复…...
保姆级教程:在Ubuntu 20.04上搞定Montreal Forced Aligner (MFA) 2.0安装与验证
保姆级教程:在Ubuntu 20.04上搞定Montreal Forced Aligner (MFA) 2.0安装与验证 语音对齐技术正在成为语音处理领域的基础工具,而Montreal Forced Aligner(MFA)作为当前最流行的开源解决方案,其2.0版本带来了显著的性…...
从原理到代码:用Python实现简易变焦跟踪算法(OpenCV实战)
从原理到代码:用Python实现简易变焦跟踪算法(OpenCV实战) 在计算机视觉领域,变焦跟踪是一个既基础又关键的技术难题。想象一下,当你用手机拍摄远处景物时,镜头从广角切换到长焦的过程中,画面往往…...
Pixel Dream Workshop 快速上手:Python 零基础入门到生成第一幅AI画作
Pixel Dream Workshop 快速上手:Python 零基础入门到生成第一幅AI画作 1. 前言:为什么选择Pixel Dream Workshop 如果你对AI绘画感兴趣但苦于没有编程基础,这篇教程就是为你量身定制的。Pixel Dream Workshop是一个对新手极其友好的AI绘画工…...
