OpenCV:给图像加椒盐噪声和高斯噪声

椒盐噪声

#include<opencv2/opencv.hpp>
#include<quickopencv.h>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;

//椒盐噪声函数
void saltAndPepper(Mat image,int n) {
	for (int k = 0; k < n / 2; k++) {
		//随机确定图像中的位置
		int i, j;
		i = std::rand() % image.cols;		//取余运算,保证在图像的列数内
		j = std::rand() % image.rows;
		int write_black = std::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<Vec3b>(j, i)[0] = 255;		//Vec3b为OpenCV定义的3个值的向量类型
				image.at<Vec3b>(j, i)[1] = 255;		//[]指定通道 B0 G1 R2
				image.at<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<Vec3b>(j, i)[0] = 0;		
				image.at<Vec3b>(j, i)[1] = 0;		
				image.at<Vec3b>(j, i)[2] = 0;
			}
		}
		
	}
}

int main(int argc, char** argv) {
	Mat src = imread("D:/images/dog.png");//输入图片
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}

	Mat gary ;
	cvtColor(src, gary, COLOR_BGR2GRAY);
	imshow("原图", src);
	imshow("灰度图", gary);
	saltAndPepper(src, 10000);
	saltAndPepper(gary, 10000);
	imshow("原图+噪声", src);
	imshow("灰度图+噪声", gary);
	waitKey(0);//此时图片显示时间为一直停留。(x)为x毫秒
	destroyAllWindows();
	return 0;
}

高斯噪声

#include<opencv2/opencv.hpp>
#include<quickopencv.h>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;


int main(int argc, char** argv) {
	Mat src = imread("D:/images/dog.png");//输入图片
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}

	Mat gary ;
	cvtColor(src, gary, COLOR_BGR2GRAY);
	imshow("原图", src);
	imshow("灰度图", gary);
	//生成与原图尺寸、数据类型、通道数相同的矩阵
	Mat src_noise = Mat::zeros(src.rows, src.cols, src.type());
	Mat gary_noise = Mat::zeros(gary.rows, gary.cols, gary.type());
	RNG rng;		//创建一个rng类
	rng.fill(src_noise, RNG::NORMAL, 10, 20);		//生成三通道的高斯分布随机数
	rng.fill(gary_noise, RNG::NORMAL, 15, 30);		//生成单通道的高斯分布随机数
	imshow("三通道高斯噪声", src_noise);
	imshow("单通道高斯噪声", gary_noise);
	src = src + src_noise;
	gary = gary + gary_noise;
	imshow("原图+噪声", src);
	imshow("灰度图+噪声", gary);
	waitKey(0);//此时图片显示时间为一直停留。(x)为x毫秒
	destroyAllWindows();
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值