6.7泊松噪声

news2024/11/14 20:14:06

基础概念

在OpenCV联合C++中给一张图片添加泊松噪声(Poisson Noise)可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。泊松噪声是一种统计分布服从泊松分布的噪声,通常用于模拟光子计数等场景。

使用泊松噪声的场景

泊松噪声通常用于模拟光子计数过程中的噪声,例如在低光条件下拍摄的照片中,由于光子计数的统计特性,会产生这种类型的噪声。因此,在进行图像增强、图像去噪等处理时,添加泊松噪声可以帮助评估算法在实际应用中的鲁棒性。

示例代码1

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

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

// 添加泊松噪声的函数
void addPoissonNoise(cv::Mat &image, double scale = 1.0)
{
	// 创建随机数生成器
	std::random_device rd;
	std::default_random_engine gen(rd());
	std::poisson_distribution<int> dist(1.0); // 泊松分布

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

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

			// 加上噪声
			//image.at<uchar>(i, j) = std::min(std::max(image.at<uchar>(i, j) + noise * scale, 0), 255);

			image.at<uchar>(i, j) = std::min(std::max((int)(image.at<uchar>(i, j) + noise * scale), 0), 255);

		}
	}
}

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

	// 添加泊松噪声
	addPoissonNoise(img, 1.0); // scale 为 1.0

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

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

	cv::waitKey(0);

	return 0;

}


代码解释
1. 读取图像:使用 cv::imread 函数读取原始图像,并将其转换为灰度图像。
2. 添加泊松噪声:定义一个 addPoissonNoise 函数,该函数接受一个图像矩阵 image 和一个缩放因子 scale。缩放因子 scale 控制噪声的强度。
3. 随机数生成器:使用 <random> 头文件中的 std::random_device 和 std::default_random_engine 生成随机数,std::poisson_distribution 生成符合泊松分布的随机数。
4. 遍历图像:遍历图像的每一个像素点,根据生成的泊松分布随机数给像素值加上噪声。
5. 限制像素值范围:确保像素值在0到255之间,避免超出8位灰度图像的范围。
6. 显示图像:使用 cv::imshow 函数显示原始图像和添加噪声后的图像。

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

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

运行结果1

除噪方法

在OpenCV联合C++中去除一张图片上的泊松噪声(Poisson Noise),可以采用多种滤波方法。泊松噪声通常表现为与图像亮度相关的噪声,因此需要选择一种能够适应这种特性的滤波方法。以下是一些常用的滤波方法及其适用性:

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

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

示例代码

#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;
}

运行结果

2. 双边滤波(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;
}

运行结果

3. 高斯滤波(Gaussian 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::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;
}

运行结果

4. 维纳滤波(Wiener Filtering)

维纳滤波是一种基于最小均方误差估计的滤波方法,可以用于去除各种类型的噪声,包括泊松噪声。维纳滤波需要估计噪声的功率谱密度和信号的功率谱密度。示例代码维纳滤波在OpenCV中没有直接的支持,但可以通过自定义实现。

这里提供一个简化的伪代码示例:

示例代码

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

void applyWienerFilter(const cv::Mat &input, cv::Mat &output, double noiseVariance)
{
    // 假设输入图像为灰度图像
    cv::Mat fftInput, fftOutput, psf, noisePower, signalPower, wienerKernel;
    
    // 计算输入图像的傅里叶变换
    cv::dft(input, fftInput);
    
    // PSF(点扩散函数)可以是高斯核或其他核
    cv::GaussianBlur(cv::Mat::ones(input.size(), CV_32F), psf, cv::Size(3, 3),0);
    
    // 计算PSF的傅里叶变换
    cv::dft(psf, psf);
    
    // 计算噪声功率谱密度
    noisePower = cv::Mat::ones(fftInput.size(), CV_32F) * noiseVariance;
    
    // 估计信号功率谱密度
    signalPower = cv::abs(psf) * cv::abs(psf);
    
    // Wiener 滤波器
    wienerKernel = signalPower / (signalPower + noisePower);
    
    // 应用Wiener滤波器
    cv::mulSpectrums(fftInput, wienerKernel, fftOutput, 0);
    
    // 反傅里叶变换
    cv::dft(fftOutput, fftOutput, cv::DFT_INVERSE | cv::DFT_SCALE);
    
    // 逆变换回空间域
    cv::idft(fftOutput, output);
}

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;
    applyWienerFilter(img, denoisedImg, 10.0); // 假设噪声方差为 10.0

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

    cv::waitKey(0);

    return 0;
}

运行结果

总结

•非局部均值去噪(Non-Local Means Denoising):适用于需要保留图像细节的情况,能够较好地去除泊松噪声。
•双边滤波(Bilateral Filtering):在平滑图像的同时能够较好地保留边缘,适用于需要保持图像细节的情况。
•高斯滤波(Gaussian Filtering):简单易用,但在处理泊松噪声时效果可能不如非局部均值去噪和双边滤波。
•维纳滤波(Wiener Filtering):适用于需要精确去噪的情况,但实现较为复杂。

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

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

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

相关文章

【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案

人话说在前&#xff1a;这篇的内容是2022年5月写的&#xff0c;当时碰到了要批量处理数据的情况&#xff0c;但是又不知道数据为啥一直报错报错报错&#xff0c;说不允许我操作&#xff0c;最终发现是因为存在隐藏的列或行&#xff0c;于是就很无语地写了博客&#xff0c;但内容…

Codeforces Round 972 (Div. 2) E2. Subtangle Game (Hard Version)(博弈+双指针 sg函数思想)

题目 思路来源 稲葉廻代码 题解 这个题比easy version的数据范围大了比较多&#xff0c; 不能再直接dp[i][j][k]表示数组a的第i个做开始局面时&#xff0c;位置(j,k)为起点时的获胜情况了 当然你把第一维压到bitset里&#xff0c;然后前缀和优化一下&#xff0c;还是可以通…

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …

Tomcat中间件常见漏洞复现

#1.CVE-2017-12615 -----Tomcat put方法任意文件写入漏洞 1.打开靶场 cd vulhub/tomcat/CVE-2017-12615 docker-compose up -d docker ps 2.访问8080端口&#xff0c;来到靶场 3.首页进抓包&#xff0c;Tomcat允许适⽤put⽅法上传任意⽂件类型&#xff0c;但不允许jsp后缀…

redisson 延迟队列实现任务过期监听

一、需求&#xff1a; 任务超过一个小时以后&#xff0c;如果还为待执行状态&#xff0c;则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener&#xff0c;消费延迟队列&#xff1b;创建新增延迟队列的类&#xff0c;用于创建延迟队列&#xf…

LeetCode 热题 100 回顾17

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

HTML翻牌器:用CSS和HTML元素创造动态数字展示

HTML翻牌器&#xff1a;用CSS和HTML元素创造动态数字展示 前言 翻牌器是一种数字动态展示形式&#xff0c;在生活中常见的例如翻牌计分、翻牌时钟等。 之所以以翻牌的形式是因为其物理设计的原因使其只能滚动翻牌展示数字&#xff0c;在电子显示设备不普及时&#xff0c;使用…

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中&#xff0c;尤其是在软件开发这样的复杂项目中&#xff0c;工作内容是多种多样的。从需求分析、设计、编码到测试和部署&#xff0c;每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

【Unity Shader】Special Effects(九)Vortex 旋涡(UI)

源码:[点我获取源码] 索引 Vortex 旋涡思路分析旋涡中心旋涡旋转旋涡强度旋涡动画Vortex 旋涡 旋涡效果可以将一张图像以指定点作为旋涡中心,呈顺时针旋涡动画效果,使用动画播放器: 思路分析 首先,旋涡特效的核心也即是旋转(特别是uv坐标的旋转); 在此基础上,旋涡中…

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想&#xff1a; 父组件中给子组件绑定属性…

Vue Devtools -----一条龙安装教程 + 解决安装使用过程的一些问题

一条龙安装教程&#xff08;首次 安装看这里&#xff09; 点击下方网址 进入下载页面 安装 |Vue 开发工具 (vuejs.org)https://devtools-v6.vuejs.org/guide/installation.html 选择适合自己浏览器的版本 以Edge为例&#xff0c;点击下载即可 我以为已经下载过了&#xff0c;…

BUUCTF-MISC-数据包中的线索

下载题目文件&#xff0c;解压发现是一段流量包 使用Wireshark打开 首先过滤HTTP数据流 然后追踪HTTP数据流 通过追踪数据流可以发现 流7 当中有一段base64编码&#xff0c;我们尝试解码 base64基本特征 Base64编码只包含64个字符&#xff1a;大写字母&#xff08;A-Z&#x…

计算机网络笔记002

### 课堂讨论对话 **学生A**: 老师&#xff0c;计算机网络的组成是怎样的&#xff1f;&#x1f914; **老师**: 非常好的问题&#xff01;计算机网络主要由硬件、软件和通信协议三部分组成。我们先从硬件开始讨论吧。 **学生B**: 硬件包括哪些设备呢&#xff1f;&#x1f60…

cmd快速进入文件夹目录下

首先&#xff0c;将文件夹直接点击左键拖动至cmd窗口中&#xff0c;就可以得到目录路径。 还有就是&#xff0c;在命令行直接敲入D:或者C:就可以在磁盘之间进行转换&#xff0c;注意冒号不要丢。 再有&#xff0c;如果进入某磁盘中的一个文件夹&#xff0c;使用cd命令。路径获取…

zabbix email 告警

配置媒介、触发器动作&#xff08;动作、操作&#xff09; 为用户 定义媒体&#xff0c;比如电子邮件地址 动作 - 条件

[图解]静态关系和动态关系

1 00:00:01,060 --> 00:00:04,370 首先我们来看静态关系和动态关系 2 00:00:06,160 --> 00:00:10,040 我们要尽量基于静态关系来建立动态关系 3 00:00:11,740 --> 00:00:13,740 不能够在没有这个的基础上 4 00:00:14,220 --> 00:00:17,370 没有这个的情况下就胡…

2024PHP彩虹工具网源码一个多功能工具箱程序支持72种常用站长和开发等工具

安装&#xff1a; PHP>7.4 伪静态设置Thinkphp 设置/public为网站运行目录 访问你的域名/install进行安装即可 安装扩展 sg11 &#xff0c;fileinfo &#xff0c; ionCube 常用功能 站长工具&#xff1a;ICP备案查询、IP地址查询、域名Whios查询、腾讯域名拦截查询、Mysql…

828华为云征文 | 构建高效搜索解决方案,Elasticsearch Kibana的完美结合

前言 构建高效搜索解决方案&#xff0c;FlexusX服务器与Elasticsearch & Kibana的完美结合&#xff0c;为企业带来云端搜索新体验。FlexusX实例以其卓越性能与灵活扩展性&#xff0c;确保高并发搜索的流畅运行。部署Elasticsearch&#xff0c;享受分布式搜索的精准与快速&a…

从Yargs源码学习中间件的设计

yargs中间件介绍 yargs 是一个用于解析命令行参数的流行库&#xff0c;它能帮助开发者轻松地定义 CLI&#xff08;命令行接口&#xff09;&#xff0c;并提供参数处理、命令组织、help文本自动生成等功能。今天我们来学习一下它对中间件的支持。 中间件的API详细信息&#xff0…

Python | Leetcode Python题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution:def flatten(self, head: "Node") -> "Node":def dfs(node: "Node") -> "Node":cur node# 记录链表的最后一个节点last Nonewhile cur:nxt cur.next# 如果有子节点&#…