opencv图像处理之椒盐噪声

Hellow,我是jack,今天给大家分享的是椒盐噪声。话不多说,让我们直接进入正题。

在添加椒盐时,我们需要的是随机添加,所以我们先来介绍一个函数

int  rand(void);

rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。

rand()会返回一个范围在0RAND_MAX(至少是32767)之间的伪随机数(整数)。

在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。

接着,让我们在介绍一下添加椒盐噪声的函数 

cv::Mat addSaltNoise(const cv::Mat srcImage, int n)

//其中srcImage为原图片,n为椒盐噪声点的个数

知道了这些之后,那就让我们尝试一下代码实现吧!

int main() {
	cv::Mat srcimage, equ;
	cv::Mat blurimage, medianblurImage;

	cv::Mat addSaltNoise(const cv::Mat, int);
	cv::Mat image1 = cv::imread("D:\\桌面\\girl.jpg");
	//cv::imshow("原图", image1);
	//
	if (image1.empty())
		return -1;
	cv::Mat resultimage=addSaltNoise(image1,5000);


	cv::imshow("image",image1);
	cv::imshow("resultimage", resultimage);


	cv::waitKey (0);
	
}

//添加椒盐噪声
cv::Mat addSaltNoise(const cv::Mat image1, int n) {
	cv::Mat resultimage = image1.clone();
	for (int k = 0; k < n; k++) {
		//随机取值行列
		int i = rand() % resultimage.cols;
		int j = rand() % resultimage.rows;
		//图像通道判断
		if (resultimage.channels() == 1) {
			if (rand() % 2) {
				resultimage.at(j, i) = 255;
			}
			else {
				resultimage.at(j, i) = 0;
			}
		}
		else{
			if (rand() % 2) {
				resultimage.at(j, i)[0] = 255;
				resultimage.at(j, i)[1] = 255;
				resultimage.at(j, i)[2] = 255;
			}
			else {
				resultimage.at(j, i)[0] = 0;
				resultimage.at(j, i)[1] = 0;
				resultimage.at(j, i)[2] = 0;
			}
			
		}
	}
	//cv::imshow("resultimage", resultiamge);
	//cv::waitKey (0);
	return resultimage;
	}
opencv图像处理之椒盐噪声_第1张图片 源图像

 

opencv图像处理之椒盐噪声_第2张图片 结果图

 

你们学会了吗??有什么疑问可以一起探讨!

本章就和大家分享到这里,谢谢。

欢迎指正

你可能感兴趣的:(opencv,图像处理,计算机视觉)