OpenCV13-图像噪声:椒盐噪声和高斯噪声

这篇具有很好参考价值的文章主要介绍了OpenCV13-图像噪声:椒盐噪声和高斯噪声。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1.噪声种类

图像噪声是指图像中的随机或非随机的不希望的视觉扰动。它可以出现在数字图像中的各种形式,例如颗粒状噪声、条纹、斑点、模糊、失真等。图像噪声可能是由于图像采集过程中的传感器噪声、电磁干扰、传输错误、压缩算法等原因引起的。

常见的图像噪声类型包括:

  1. 高斯噪声:高斯噪声是最常见的图像噪声类型之一。它是由于传感器噪声和环境干扰引起的,呈现为图像中的随机亮度变化。
  2. 椒盐噪声:椒盐噪声是指图像中出现随机黑白像素点,类似于盐和胡椒粉的颗粒。它通常是由于传感器故障或信号传输中的错误引起的。
  3. 斑点噪声:斑点噪声是指图像中出现的亮度不均匀的斑点,可能是由于摄像头或传感器的缺陷引起的。
  4. 条纹噪声:条纹噪声表现为图像中的水平或垂直条纹,通常是由于电源干扰或摄像头扫描时钟不稳定引起的。
  5. 压缩噪声:压缩噪声是在图像压缩中引入的,特别是在低比特率压缩中。它表现为图像细节的丢失、模糊或块状伪像。

为了减少或去除图像噪声,可以使用图像处理技术,例如平滑滤波、中值滤波、频域滤波等。这些技术可以根据噪声类型和特定应用的需求选择和调整参数,以改善图像质量并增强细节。

2.椒盐噪声

椒盐噪声又称作脉冲噪声,他会随机改变图像中的像素值,其样子就像是在图像上随机地撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。

OpenCV没有提供专门用于为图像添加椒盐噪声的函数,需要使用者根据需求编写生成噪声的程序。考虑到椒盐噪声会在图像中的任何一个位置随机产生,因此对于椒盐噪声的生成,需要使用OpenCV中能够产生随机数的函数 rand() 。为了能够生成不同数据类型的随机数,该函数拥有多种演变形式:

namespace cvflann
{
    inline int rand();
    // low与high是输出随机数的最小值与最大值
    inline double rand_double(double high = 1.0, double low = 0);
    inline int rand_int(int high = RAND_MAX, int low = 0);
}

添加椒盐噪声的步骤:

1.确定椒盐噪声的位置。通过随机函数生成两个随机数,确定噪声点的行和列。

2.确定噪声的种类。噪声点的黑白也是随机的,可以再生成一个随机数,根据奇偶性确定黑白。

3.修改图像像素灰度值。判断图像的通道数,灰度图像单通道赋一个值,彩色图像三通道赋3个值。

最终得到含有噪声的图像。

下面是代码实现:

#include <opencv2/core/utils/logger.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

//盐噪声函数
void saltAndPepper(cv::Mat image, int n)
{
	//using cvflann::rand();
	for (int k = 0; k < n / 2; k++)
	{
		//随机确定图像中位置
		int i, j;
		i = cvflann::rand() % image.cols;  //取余数运算,保证在图像的列数内
		j = cvflann::rand() % image.rows;  //取余数运算,保证在图像的行数内
		int write_black = cvflann::rand() % 2;  //判定为白色噪声还是黑色噪声的变量
		if (write_black == 0)  //添加白色噪声
		{
			if (image.type() == CV_8UC1)  //处理灰度图像
			{
				image.at<uchar>(j, i) = 255;  //白色噪声
			}
			else if (image.type() == CV_8UC3)  //处理彩色图像
			{
				image.at<cv::Vec3b>(j, i)[0] = 255; //cv::Vec3b为opencv定义的一个3个值的向量类型
				image.at<cv::Vec3b>(j, i)[1] = 255; //[]指定通道,B:0,G:1,R:2
				image.at<cv::Vec3b>(j, i)[2] = 255;
			}
		}
		else  //添加黑色噪声
		{
			if (image.type() == CV_8UC1)
			{
				image.at<uchar>(j, i) = 0;
			}
			else if (image.type() == CV_8UC3)
			{
				image.at<cv::Vec3b>(j, i)[0] = 0; //cv::Vec3b为opencv定义的一个3个值的向量类型
				image.at<cv::Vec3b>(j, i)[1] = 0; //[]指定通道,B:0,G:1,R:2
				image.at<cv::Vec3b>(j, i)[2] = 0;
			}
		}
	}
}

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	Mat lena = imread("lena.png");
	Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);
	if (lena.empty() || equalLena.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	imshow("lena原图", lena);
	imshow("equalLena原图", equalLena);
	saltAndPepper(lena, 10000);  //彩色图像添加椒盐噪声
	saltAndPepper(equalLena, 10000);  //灰度图像添加椒盐噪声
	imshow("lena添加噪声", lena);
	imshow("equalLena添加噪声", equalLena);

	int k = waitKey(0); // Wait for a keystroke in the window
	return 0;
}

3.高斯噪声

高斯噪声是指噪声分布的概率密度函数服从高斯分布(正态分布)的一类噪声。概率密度函数如下:
p ( z ) = 1 2 π σ e − ( z − μ ) 2 2 σ 2 p(z) = \frac{1}{\sqrt{2 \pi \sigma}} e^{\frac{-(z-\mu)^2}{2 \sigma^2}} p(z)=2πσ 1e2σ2(zμ)2
其中, z z z 表示图像像素灰度值, μ \mu μ 表示像素值的平均值或者期望值, σ \sigma σ 表示像素值的标准差。

OpenCV中也没有专门为图像添加高斯噪声的函数,对早在图像中添加椒盐噪声的过程,可以根据需求利用能够产生随机数的函数来完成在图像中添加高斯噪声的任务。在OpenCV中提供了 fill() 函数能够产生均匀分布或者高斯分布的随机数,可以利用该函数产生符合高斯分布的随机数,之后在图像中加入这些随机数即可。

void cv::RNG::fill(
    InputOutputArray mat, // 存放随机数的矩阵
    int distType,   // 均匀分布RNG::UNIFORM 高斯分布RNG::NORMAL
    InputArray a,   // 均匀分布的最小下限,高斯分布的均值
    InputArray b,   // 均匀分布的最大上限,高斯分布的标准差
    bool saturateRange = false // 预报和标志,仅用于均匀分布
);

fill() 函数是 RNG 类的成员函数,因此必须要创建类对象才能使用:

cv::RNG rng;
rng.fill(mat, RNG::NORMAL, 10, 20);

在图像中添加高斯噪声的步骤:

1.创建与图像尺寸、数据类型及通道数相同的Mat类变量。

2.调用fill()函数在Mat类变量中产生符合高斯分布的随机数。

3.将原图像和含有高斯分布的随机数矩阵相加。

最终得到添加高斯噪声之后的图像。

下面是示例代码:

#include <opencv2/core/utils/logger.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	Mat lena = imread("lena.png");
	Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);
	if (lena.empty() || equalLena.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	//生成与原图像同尺寸、数据类型和通道数的矩阵
	Mat lena_noise = Mat::zeros(lena.rows, lena.cols, lena.type());
	Mat equalLena_noise = Mat::zeros(lena.rows, lena.cols, equalLena.type());
	imshow("lena原图", lena);
	imshow("equalLena原图", equalLena);
	RNG rng;  //创建一个RNG类
	rng.fill(lena_noise, RNG::NORMAL, 10, 20);  //生成三通道的高斯分布随机数
	rng.fill(equalLena_noise, RNG::NORMAL, 15, 30);  //生成三通道的高斯分布随机数

	imshow("三通道高斯噪声", lena_noise);
	imshow("单通道高斯噪声", equalLena_noise);
	lena = lena + lena_noise;  //在彩色图像中添加高斯噪声
	equalLena = equalLena + equalLena_noise;  //在灰度图像中添加高斯噪声
	//显示添加高斯噪声后的图像
	imshow("lena添加噪声", lena);
	imshow("equalLena添加噪声", equalLena);

	int k = waitKey(0); // Wait for a keystroke in the window
	return 0;
}

考虑到灰度值相加会超过255的情况,实际上如果值超过255会等于255:文章来源地址https://www.toymoban.com/news/detail-722060.html

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	Mat a = (Mat_<uchar>(2, 2) << 130, 125, 127, 129);
	Mat b = (Mat_<uchar>(2, 2) << 130, 125, 127, 129);
	Mat c = a + b;
	cout << "a: " << endl << a << endl;
	cout << "b: " << endl << b << endl;
	cout << "c: " << endl << c << endl;

	int k = waitKey(0); // Wait for a keystroke in the window
	return 0;
}
/*
a:
[130, 125;
 127, 129]
b:
[130, 125;
 127, 129]
c:
[255, 250;
 254, 255]
*/

到了这里,关于OpenCV13-图像噪声:椒盐噪声和高斯噪声的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv笔记:高斯滤波和中值滤波对椒盐噪声的处理

      目录 1. 椒盐噪声简介 2. 高斯滤波的原理和实现  2.1. 高斯滤波的原理    2.2. 高斯滤波的API  3. 中值滤波的原理和实现   3.1. 中值滤波的原理   3.2. 中值滤波的API 4. 高斯滤波和中值滤波对椒盐噪声的处理结果 数字图像处理中,噪声会导致图像质量下降和信息的丢失,因此

    2024年02月07日
    浏览(50)
  • 【数字图像处理】灰度图像中添加高斯噪声、椒盐噪声、斑点噪声以及利用不同方法(中值、排序、维纳滤波)去除各种噪声的matlab程序

    图像处理问题描述: 1、图像中分别加入不同方差的高斯噪声、不同噪声密度椒盐噪声和不同方差的斑点噪声(Gaussian noise, salt  pepper noise and speckle noise) 2、分别通过函数medfilt2、ordfilt2和 Wiener 2 去除图像中添加的一些噪声(Gaussian noise, salt  pepper noise and speckle noise)。 各部

    2024年02月07日
    浏览(57)
  • 01:高斯噪声和椒盐噪声

    记录一下手写椒盐噪声和高斯噪声的python程序。 效果图如下: 椒盐噪声和高斯噪声都是数字图像处理中常见的噪声类型。 1.椒盐噪声是 随机的黑色和白色像素点 混杂在图像中,使得图像中的一些像素点变得十分明显且不规则。椒盐噪声可能由于传感器损坏、传输错误、压缩

    2024年02月05日
    浏览(46)
  • 【OpenCV • c++】图像噪音 | 椒盐噪音 | 高斯噪音

      图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述, 也就是用它的概率分布函数和概率密度分布函数。图像噪声的产生来自图像获

    2024年02月08日
    浏览(34)
  • 计算机视觉学习笔记(图像的灰度与灰度级 图像的深度 图像噪声 图像处理)

    如果把白色和黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,0为黑色,灰度就是没有色彩,RGB色彩分量全部相等(150,150,150)就代表灰度为150. 一幅图像中不同位置的亮度是不一样的,可用f(x,y)来表示(x,y)上的亮度。由于光是一种能量形式,因此亮度是非负

    2024年02月01日
    浏览(60)
  • 计算机视觉--利用HSV和YIQ颜色空间处理图像噪声

    前言: Hello大家好,我是Dream。 今天我们将 利用HSV和YIQ颜色空间处理图像噪声 。在本次实验中,我们使用任意一张图片,通过 RGB转HSV和YIQ 的操作,加入了 椒盐噪声 并将其转 换回RGB 格式,最终实现对 图像的噪声处理 。一起来看看吧~ 首先,我们导入需要的库。包括numpy用

    2024年02月15日
    浏览(68)
  • Opencv-图像噪声(均值滤波、高斯滤波、中值滤波)

    图像噪声是图像处理中常见的问题,它是由于各种原因引入的不希望的随机变化或干扰,导致图像质量下降。噪声可以出现在图像的亮度、颜色和纹理等方面,对图像分析、计算机视觉和图像处理任务造成困难。为了减少或消除图像中的噪声,常常使用不同类型的滤波技术。

    2024年02月04日
    浏览(67)
  • 计算机图形图像技术(OpenCV核心功能、图像变换与图像平滑处理)

    1、显示图像 ①功能:在指定窗口中显示图像。 ②参数: name 为窗口的名字; image 为待显示的图像。 ③说明:可显示彩色或灰度的字节图像和浮点数图像,彩色图像数据按BGR顺序存储。 2、读入图像 ①功能:从指定文件读入图像。 ②参数: filename 为图像文件名,支持BMP、

    2024年02月03日
    浏览(49)
  • 【OpenCV】计算机视觉图像处理基础知识

    目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Canny边缘检测的函数及使用

    2024年02月05日
    浏览(57)
  • 计算机毕业分享(含算法) opencv图像增强算法系统

    今天学长向大家分享一个毕业设计项目 毕业设计 opencv图像增强算法系统 项目运行效果: 毕业设计 基于机器视觉的图像增强 项目获取: https://gitee.com/sinonfin/algorithm-sharing 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达

    2024年01月18日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包