1.椒盐噪声

又叫脉冲噪声,一般是0或255的黑或白色噪点。

  1. #include <opencv2\opencv.hpp>
  2. #include <iostream>
  3. using namespace cv;
  4. using namespace std;
  5. //盐噪声函数
  6. void saltAndPepper(cv::Mat image, int n)
  7. {
  8. for (int k = 0; k<n / 2; k++)
  9. {
  10. //随机确定图像中位置
  11. int i, j;
  12. i = std::rand() % image.cols; //取余数运算,保证在图像的列数内
  13. j = std::rand() % image.rows; //取余数运算,保证在图像的行数内
  14. int write_black = std::rand() % 2; //判定为白色噪声还是黑色噪声的变量
  15. if (write_black == 0) //添加白色噪声
  16. {
  17. if (image.type() == CV_8UC1) //处理灰度图像
  18. {
  19. image.at<uchar>(j, i) = 255; //白色噪声
  20. }
  21. else if (image.type() == CV_8UC3) //处理彩色图像
  22. {
  23. image.at<cv::Vec3b>(j, i)[0] = 255; //cv::Vec3b为opencv定义的一个3个值的向量类型
  24. image.at<cv::Vec3b>(j, i)[1] = 255; //[]指定通道,B:0,G:1,R:2
  25. image.at<cv::Vec3b>(j, i)[2] = 255;
  26. }
  27. }
  28. else //添加黑色噪声
  29. {
  30. if (image.type() == CV_8UC1)
  31. {
  32. image.at<uchar>(j, i) = 0;
  33. }
  34. else if (image.type() == CV_8UC3)
  35. {
  36. image.at<cv::Vec3b>(j, i)[0] = 0; //cv::Vec3b为opencv定义的一个3个值的向量类型
  37. image.at<cv::Vec3b>(j, i)[1] = 0; //[]指定通道,B:0,G:1,R:2
  38. image.at<cv::Vec3b>(j, i)[2] = 0;
  39. }
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. Mat lena = imread("lena.png");
  46. Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);
  47. if (lena.empty() || equalLena.empty())
  48. {
  49. cout << "请确认图像文件名称是否正确" << endl;
  50. return -1;
  51. }
  52. imshow("lena原图", lena);
  53. imshow("equalLena原图", equalLena);
  54. saltAndPepper(lena, 10000); //彩色图像添加椒盐噪声
  55. saltAndPepper(equalLena, 10000); //灰度图像添加椒盐噪声
  56. imshow("lena添加噪声", lena);
  57. imshow("equalLena添加噪声", equalLena);
  58. waitKey(0);
  59. return 0;
  60. }

图5-6.png
图5-7.png

2.高斯噪声

  1. #include <opencv2\opencv.hpp>
  2. #include <iostream>
  3. using namespace cv;
  4. using namespace std;
  5. int main()
  6. {
  7. Mat lena = imread("lena.png");
  8. Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);
  9. if (lena.empty() || equalLena.empty())
  10. {
  11. cout << "请确认图像文件名称是否正确" << endl;
  12. return -1;
  13. }
  14. //生成与原图像同尺寸、数据类型和通道数的矩阵
  15. Mat lena_noise = Mat::zeros(lena.rows, lena.cols, lena.type());
  16. Mat equalLena_noise = Mat::zeros(lena.rows, lena.cols, equalLena.type());
  17. imshow("lena原图", lena);
  18. imshow("equalLena原图", equalLena);
  19. RNG rng; //创建一个RNG类
  20. rng.fill(lena_noise, RNG::NORMAL, 10, 20); //生成三通道的高斯分布随机数
  21. rng.fill(equalLena_noise, RNG::NORMAL, 15, 30); //生成三通道的高斯分布随机数
  22. imshow("三通道高斯噪声", lena_noise);
  23. imshow("单通道高斯噪声", equalLena_noise);
  24. lena = lena + lena_noise; //在彩色图像中添加高斯噪声
  25. equalLena = equalLena + equalLena_noise; //在灰度图像中添加高斯噪声
  26. //显示添加高斯噪声后的图像
  27. imshow("lena添加噪声", lena);
  28. imshow("equalLena添加噪声", equalLena);
  29. waitKey(0);
  30. return 0;
  31. }

图5-8.png
图5-9.png