为图像添加椒盐噪声和高斯噪声

news/2024/7/21 7:26:53 标签: 图像处理, 高斯噪声, 椒盐噪声

 http://blog.csdn.net/qq_34784753/article/details/69379135

 

下面简单介绍两种图像噪声,即椒盐噪声高斯噪声

1.椒盐噪声

       椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。盐和胡椒噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。图像模拟添加椒盐噪声是通过随机获取像素点并设置为高亮度点和低灰度点来实现的

2.高斯噪声

       高斯噪声是指高绿密度函数服从高斯分布的一类噪声。特别的,如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度有事均匀分布的,则称这个噪声为高斯白噪声。高斯白噪声二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯噪声包括热噪声和三里噪声。高斯噪声万有由它的事变平均值和两瞬时的协方差函数来确定,若噪声是平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之差有关的相关函数,在意义上它等同于功率谱密度。高斯早生可以用大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个买充值与所有脉冲值得总和相比都可忽略不计。

        根据Box-Muller变换原理,建设随机变量U1、U2来自独立的处于(0,1)之间的均匀分布,则经过下面两个式子产生的随机变量Z0,Z1服从标准高斯分布。


上式中Z0,Z1满足正态分布,其中均值为0,方差为1,变量U1和U2可以修改为下式:


给图像添加两种噪声的程序如下:

#include <cstdlib>  
#include <iostream>  
#include <opencv2\core\core.hpp>  
#include <opencv2\highgui\highgui.hpp>  
#include <opencv2\imgproc\imgproc.hpp>  

using namespace cv;
using namespace std;

double generateGaussianNoise(double m, double sigma);
Mat addSaltNoise(const Mat srcImage, int n);
Mat addGaussianNoise(Mat &srcImag);

int main()
{
	Mat srcImage = imread("imL.png");
	if (!srcImage.data)
	{
		cout << "读入图像有误!" << endl;
		system("pause");
		return -1;
	}
	imshow("原图像", srcImage);
	Mat dstImage1 = addSaltNoise(srcImage, 3000);
	Mat dstImage2 = addGaussianNoise(srcImage);
	imshow("添加椒盐噪声的图像", dstImage1);
	imshow("添加高斯噪声的图像", dstImage2);
	//存储图像  
	imwrite("salt_pepper_Image.jpg", dstImage1);
	imwrite("GaussianNoise_Image.jpg", dstImage2);
	waitKey();
	return 0;
}

Mat addSaltNoise(const Mat srcImage, int n)
{
	Mat dstImage = srcImage.clone();
	for (int k = 0; k < n; k++)
	{
		//随机取值行列  
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//图像通道判定  
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 255;       //盐噪声  
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 255;
			dstImage.at<Vec3b>(i, j)[1] = 255;
			dstImage.at<Vec3b>(i, j)[2] = 255;
		}
	}
	for (int k = 0; k < n; k++)
	{
		//随机取值行列  
		int i = rand() % dstImage.rows;
		int j = rand() % dstImage.cols;
		//图像通道判定  
		if (dstImage.channels() == 1)
		{
			dstImage.at<uchar>(i, j) = 0;     //椒噪声  
		}
		else
		{
			dstImage.at<Vec3b>(i, j)[0] = 0;
			dstImage.at<Vec3b>(i, j)[1] = 0;
			dstImage.at<Vec3b>(i, j)[2] = 0;
		}
	}
	return dstImage;
}
//生成高斯噪声  
double generateGaussianNoise(double mu, double sigma)
{
	//定义小值  
	const double epsilon = numeric_limits<double>::min();
	static double z0, z1;
	static bool flag = false;
	flag = !flag;
	//flag为假构造高斯随机变量X  
	if (!flag)
		return z1 * sigma + mu;
	double u1, u2;
	//构造随机变量  
	do
	{
		u1 = rand() * (1.0 / RAND_MAX);
		u2 = rand() * (1.0 / RAND_MAX);
	} while (u1 <= epsilon);
	//flag为真构造高斯随机变量  
	z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI*u2);
	z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI*u2);
	return z0*sigma + mu;
}

//为图像添加高斯噪声  
Mat addGaussianNoise(Mat &srcImag)
{
	Mat dstImage = srcImag.clone();
	int channels = dstImage.channels();
	int rowsNumber = dstImage.rows;
	int colsNumber = dstImage.cols*channels;
	//判断图像的连续性  
	if (dstImage.isContinuous())
	{
		colsNumber *= rowsNumber;
		rowsNumber = 1;
	}
	for (int i = 0; i < rowsNumber; i++)
	{
		for (int j = 0; j < colsNumber; j++)
		{
			//添加高斯噪声  
			int val = dstImage.ptr<uchar>(i)[j] +
				generateGaussianNoise(0, 2.235) * 32;
			if (val < 0)
				val = 0;
			if (val>255)
				val = 255;
			dstImage.ptr<uchar>(i)[j] = (uchar)val;
		}
	}
	return dstImage;
}



http://www.niftyadmin.cn/n/1838300.html

相关文章

Java实现线程的方法

文章目录实现 Runnable 接口继承 Thread 类线程池创建线程有返回值的 Callable 创建线程定时器 Timer实现线程只有一种方式实现 Runnable 接口比继承 Thread 类实现线程要好为什么说本质上只有一种实现线程的方式&#xff1f;实现 Runnable 接口究竟比继承 Thread 类实现线程好…

韩红为什么要选择退出演艺圈?

文/邹邹有理 凭借宛若天籁的声线和独具风格的词曲创作赢得了众多歌迷的青睐的“重量级”歌手韩红日前透露&#xff0c;自己要退出喧闹复杂的演艺圈&#xff0c;做回普通人&#xff0c;只想为一日三餐忙碌&#xff0c;为花花草草陶冶情操。韩红的存在绝对是中国内地流行音乐的一…

MATLAB绘制二维高斯曲面

meshgrid函数用于根据给定的横纵坐标点生成坐标网格&#xff0c;以便计算二元函数的取值。 设二维高斯函数表达式为&#xff1a; 程序如下&#xff1a; clc; sig1.5; w_x(-5:0.1:5); w_y(-5:0.1:5); [X,Y]meshgrid(w_x,w_y); Wexp(-(X.^2Y.^2)./sig.^2); mesh(w_x,w_y,W); %绘…

喜欢Erlang的三大理由

喜欢Erlang的三大理由 erlang严谨的&#xff0c;有严格的理论基础。但erlang同时也是务实的&#xff0c;他不是实验产品。这和我发布的winx库理念一样&#xff1a;务实。一点都不喜欢防御式编程&#xff0c;所以看到erlang的fail fast理念&#xff0c;眼睛一亮。这几天实践下来…

四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

http://blog.csdn.net/youyoulg/article/details/6843332 C风格的强制类型转换(Type Cast)很简单&#xff0c;不管什么类型的转换统统是&#xff1a; TYPE b (TYPE)a C风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 const_cast&#xff0c;字面上理解就是去c…

AndroidStudio Gradle自定义Task实例

文章目录实现每次重新构建项目后&#xff0c;自动将版本号等信息写入release.xml文件中 在根目录下 新建 common.gradle //用来存放应用中的所有配置变量&#xff0c;统一管理&#xff0c;而不再是每个moudle里都自己写一份&#xff0c;修改起来更加的方便ext {android [comp…

HK-7710系列DTU 多中心.doc

HK-7710系列DTU 多中心说明文档北京环控科技有限公司2006年2月目 录1 名词解释. 42 进入配置菜单方法. 53 配置菜单总列表. 64 移动服务中心设置. 74.1 服务代码. 74.2 PPP用户名. 74.3 PPP密码. 74.4 SIM/UIM PIN 74.5 接入点名称(APN) 75 终端单元设置.…

腾讯技术开放日 | 保障视频连线画质清晰且流畅,腾讯会议有这些优化实践

腾讯会议自去年12月底推出&#xff0c;在疫情期间极速扩容&#xff0c;日活跃用户超过1000万。面对数量庞大的用户&#xff0c;以及他们背后网络、设备的多样性&#xff0c;该如何针对各个场景进行优化以提升用户体验&#xff1f;在【腾讯技术开放日 云视频会议专场】中&#…