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、概念

乘性噪聲一般由信道不理想引起,它們與信號的關係是相乘,信號在它在,信號不在他也就不在

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章