//*************************************************************************** #include <iostream.h> #include <fstream.h> #include <stdlib.h> /* ANSI C standard library routines */ #include <string.h> /* ANSI standard string routines */ #include <limits.h> #include <math.h> #include <stdio.h> #include "image.h" //*************************************************************************** void GrayImage::addSaltandPepperNoise (double percent) { cout << " Adding " << percent << "% salt and pepper noise to the image..."; srand(1); int count = 0; double pr = 1.0-percent/100.0; for (int i = 0; i < width; ++i) for (int j = 0; j < height; ++j) { // Generate random number between -1.0 and +1.0 double random = 2.0*(rand()-RAND_MAX/2.0)/RAND_MAX; if (random > pr) { p[i][j] = 255; // Salt noise ++count; } else if (random < -pr) { p[i][j] = 0; // Pepper noise ++count; } } double actualpercent = 100.0*count/(width*height); cout << "done! (" << actualpercent << "%)" << endl; } //*************************************************************************** void GrayImage::addGaussianNoise (double mean, double variance) { cout << " Adding Gaussian noise with mean = " << mean << " and variance = " << variance << " to the image..."; cout.flush(); srand(1); #define unit_random() (1.0*rand()/RAND_MAX) #define TWO_PI 6.28318530717958647688 double temp, u1, u2; int ix, iy; int num = width*height; int tempint; u1=0.0; for(int i = 0; i < num/2; i++) { while (u1 == 0.0) u1 = unit_random(); u2 = unit_random(); temp = sqrt(-2.0*variance*log(u1)); ix = 2*i/width; iy = 2*i%width; tempint = p[ix][iy] + (int) (temp * cos(TWO_PI*u2) + mean); if (tempint > 255) p[ix][iy] = 255; else if (tempint < 0) p[ix][iy] = 0; else p[ix][iy] = (unsigned char) tempint; ix = (2*i+1)/width; iy = (2*i+1)%width; tempint = p[ix][iy] + (int) (temp * sin(TWO_PI*u2) + mean); if (tempint > 255) p[ix][iy] = 255; else if (tempint < 0) p[ix][iy] = 0; else p[ix][iy] = (unsigned char) tempint; u1 = 0.0; } u1=0.0; if(num & 1) // If num is odd { while (u1 == 0.0) u1 = unit_random(); u2 = unit_random(); temp = sqrt(-2.0*variance*log(u1)); ix = (num-1)/width; iy = (num-1)%width; tempint = p[ix][iy] + (int) (temp * cos(TWO_PI*u2) + mean); if (tempint > 255) p[ix][iy] = 255; else if (tempint < 0) p[ix][iy] = 0; else p[ix][iy] = (unsigned char) tempint; u1 = 0.0; } cout << "done!" << endl; } //***************************************************************************