4.3图像噪声

4.3.1 椒盐噪声

 1 /////////////////////////////4.3.1椒盐噪声/////////////////////////////
 2 ////////https://blog.csdn.net/qq_35724402/article/details/60347024
 3 #include <iostream>
 4 #include <opencv2/core/core.hpp>
 5 #include <opencv2/highgui/highgui.hpp>
 6 #include <opencv2/opencv.hpp>
 7 
 8 using namespace cv;
 9 using namespace std;
10 
11 //加入椒盐噪声
12 void salt(Mat image, int n)
13 {
14     int i, j;
15     for (int k = 0; k<n; k++)
16     {
17         // rand()是随机数生成器
18         i = rand() % image.cols;
19         j = rand() % image.rows;
20         if (image.type() == CV_8UC1)
21         { // 灰度图像
22             image.at<uchar>(j, i) = 255;
23         }
24         else if (image.type() == CV_8UC3)
25         { // 彩色图像
26             image.at<cv::Vec3b>(j, i)[0] = 255;
27             image.at<cv::Vec3b>(j, i)[1] = 255;
28             image.at<cv::Vec3b>(j, i)[2] = 255;
29         }
30     }
31 }
32 
33 
34 int main()
35 {
36     Mat image = imread("D:\彩色lena.jpg");
37     if (image.empty())
38     {
39         cout << "Error!cannot be read...../n";
40         return -1;
41     }
42     imshow("sourceimage", image);
43     salt(image, 5000);
44     //namedWindow("saltiamge");
45     imshow("saltimage", image);
46     waitKey(0);
47 
48 }
View Code

参考:https://blog.csdn.net/qq_34784753/article/details/69379135

 4.3.2 高斯噪声

 1 ////////https://blog.csdn.net/qq_34784753/article/details/69379135
 2 #include <cmath>
 3 #include <limits>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <opencv2corecore.hpp>
 7 #include <opencv2highguihighgui.hpp>
 8 
 9 using namespace cv;
10 using namespace std;
11 
12 double generateGaussianNoise(double m, double sigma);
13 Mat addGaussianNoise(Mat &srcImag);
14 
15 int main()
16 {
17     Mat srcImage = imread("D:\彩色lena.jpg");
18     if (!srcImage.data)
19     {
20         cout << "读入图片错误!" << endl;
21         system("pause");
22         return -1;
23     }
24     imshow("原图像", srcImage);
25     Mat dstImage = addGaussianNoise(srcImage);
26     imshow("添加高斯噪声后的图像", dstImage);
27     waitKey();
28     return 0;
29 }
30 
31 //生成高斯噪声
32 double generateGaussianNoise(double mu, double sigma)
33 {
34     //定义小值
35     const double epsilon = numeric_limits<double>::min();
36     static double z0, z1;
37     static bool flag = false;
38     flag = !flag;
39     //flag为假构造高斯随机变量X
40     if (!flag)
41         return z1 * sigma + mu;
42     double u1, u2;
43     //构造随机变量
44     do
45     {
46         u1 = rand() * (1.0 / RAND_MAX);
47         u2 = rand() * (1.0 / RAND_MAX);
48     } while (u1 <= epsilon);
49     //flag为真构造高斯随机变量
50     z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI*u2);
51     z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI*u2);
52     return z0*sigma + mu;
53 }
54 
55 //为图像添加高斯噪声
56 Mat addGaussianNoise(Mat &srcImag)
57 {
58     Mat dstImage = srcImag.clone();
59     int channels = dstImage.channels();
60     int rowsNumber = dstImage.rows;
61     int colsNumber = dstImage.cols*channels;
62     //判断图像的连续性
63     if (dstImage.isContinuous())
64     {
65         colsNumber *= rowsNumber;
66         rowsNumber = 1;
67     }
68     for (int i = 0; i < rowsNumber; i++)
69     {
70         for (int j = 0; j < colsNumber; j++)
71         {
72             //添加高斯噪声
73             int val = dstImage.ptr<uchar>(i)[j] +
74                 generateGaussianNoise(2, 0.8) * 32;
75             if (val < 0)
76                 val = 0;
77             if (val>255)
78                 val = 255;
79             dstImage.ptr<uchar>(i)[j] = (uchar)val;
80         }
81     }
82     return dstImage;
83 }
View Code

原文地址:https://www.cnblogs.com/thebreakofdawn/p/9532134.html