椒盐噪声
#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;
}