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 }
参考: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 }