OpenCV噪声分类

1、椒盐噪声

1.1、概念

椒盐噪声由图像传感器,传输通道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声的出现点是随机的,噪声的数值是固定的,要么是 0 (黑色),要么是 255 (白色)。

椒盐噪声是指2种噪声:

  • 盐噪声(salt noise 盐=白色255),高灰度噪声
  • 胡椒噪声(pepper noise 椒=黑色0),低灰度噪声

1.2、添加椒盐噪声

//盐噪声
void salt(cv::Mat image, int n/*噪点个数*/) {
 
	int i,j;
	for (int k=0; k<n/2; k++) {
 
		// rand() is the random number generator
		i = std::rand()%image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
		j = std::rand()%image.rows; 
 
		if (image.type() == CV_8UC1) { // gray-level image
 
			image.at<uchar>(j,i)= 255; //at方法需要指定Mat变量返回值类型,如uchar等
 
		} else if (image.type() == CV_8UC3) { // color image
 
			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; 
		}
	}
}
 
//椒噪声
void pepper(cv::Mat image, int n/*噪点个数*/) {
 
	int i,j;
	for (int k=0; k<n; k++) {
 
		// rand() is the random number generator
		i = std::rand()%image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
		j = std::rand()%image.rows; 
 
		if (image.type() == CV_8UC1) { // gray-level image
 
			image.at<uchar>(j,i)= 0; //at方法需要指定Mat变量返回值类型,如uchar等
 
		} else if (image.type() == CV_8UC3) { // color image
 
			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; 
		}
	}
}

2、高斯噪声

2.1、概念

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声宇宙噪声热噪声散粒噪声等。对高斯噪声的抑制方法常常采用数理统计方法。高斯噪声出现在图像的每一个点上,而的大小却是随机的。

产生原因为:

  • 图像传感器在拍摄时市场不够明亮、亮度不够均匀
  • 电路各元器件自身噪声和相互影响
  • 图像传感器长期工作,温度过高

2.2、添加高斯噪声函数

//------------【为图像添加高斯噪声】----------------
Mat addGuassianNoise(Mat& srcImage)
{
	Mat resultImage = srcImage.clone(); // 克隆一副与源图像尺寸类型一样的图像
	int channels = resultImage.channels();//获取图像的通道
	int nRows = resultImage.rows;	//图像的行数  
	int nCols = resultImage.cols*channels;//图像的总列数 
	//判断图像的连续性
	if (resultImage.isContinuous())	 //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
	{
		nCols *= nRows;
		nRows = 1;
	}
	//遍历图像中的像素
	for (int i = 0; i < nRows; ++i)
	{
		for (int j = 0; j < nCols; ++j)
		{
			//添加高斯噪声
			int val = resultImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;
			if (val < 0)
				val = 0;
			if (val > 255)
				val = 255;
			resultImage.ptr<uchar>(i)[j] = (uchar)val;
		}
	}
	return resultImage;
}
 
//-------------【生成高斯噪声】---------  
double generateGaussianNoise(double mu, double sigma)
{
	//定义一个特别小的值  
	const double epsilon = std::numeric_limits<double>::min();//返回目标数据类型能表示的最逼近1的正数和1的差的绝对值
	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为真,构造高斯随机变量X
	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;
}

3、泊松噪声

3.1、概念

何为泊松噪声,就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。

4、乘性噪声

4.1、概念

乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值