-
Notifications
You must be signed in to change notification settings - Fork 2
/
noise.cpp
66 lines (54 loc) · 1.96 KB
/
noise.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "noise.h"
using namespace std;
using namespace cv;
/*
* function to add gaussian noise to an image
* params : CV::Mat object type image, double mean, double variance
* first we clone the image then we create a gaussian noise and finally we add this noise to the image
*/
void Add_gaussian_Noise(Mat& img, double mean, double sigma)
{
Mat noise(img.size(),img.type());
randn(noise, mean, sigma);
img += noise;
}
/*
* function to add salt and paper noise to an image
* params : CV::Mat object type image
* first we clone the image then we create a gaussian noise and finally we add this noise to the image
*/
void Add_salt_pepper_Noise(Mat& img, float pSalt, float pPaper)
{
RNG rng;
// Calculating the percentage of pixels user want to convert to salt or paper
int amount1 = img.rows * img.cols * (pSalt/100);
int amount2 = img.rows * img.cols * (pPaper/100);
// Choosing random index -in the boundary of the rows and columns of course- and then put to 0 or 255
for (int counter = 0; counter < amount1; ++counter)
img.at<uchar>(rng.uniform(0, img.rows), rng.uniform(0, img.cols)) = 255;
for (int counter = 0; counter < amount2; ++counter)
img.at<uchar>(rng.uniform(0, img.rows), rng.uniform(0, img.cols)) = 0;
}
/*
* function to average noise to an image
* params : CV::Mat object type image
* first we clone the image then we create a uniform noise and finally we add this noise to the image
*/
void add_uniform_noise(Mat& img)
{
// Convert image to the double
Mat out_img;
Mat norm_img;
img.convertTo(img, CV_64FC1);
norm_img = img / 255;
// Generate uniform noise
Mat noise(norm_img.size(), CV_64FC1);
randu(noise, 0, 1);
// Adding noise to the image
out_img = norm_img + noise;
// Convert double to the 8-bit unsigned
normalize(out_img, out_img, 0.0, 1.0, cv::NORM_MINMAX, CV_64FC1);
out_img *= 255;
out_img.convertTo(out_img, CV_8UC1);
img = out_img;
}