opencv学习小结(5)- 使用高斯滤波来平滑图像

•对自备图片利用二维高斯模板,对其进行加权平滑滤波,并比较其效果

•高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程

高斯小狮子

程序如下:

//得到高斯小狮子噪声色色
double generateGaussianNoise(double mu, double sigma)
{
  //定义一个特别小的值
  const double epsilon = numeric_limits<double>::min();//返回目标数据类型能表示的最逼近1的正数和1的差的绝对值
  static double z0, z1;
  static bool flag = false;
  flag = !flag;
  //flag为假,构造高斯随机变量
  if (!flag)
    return z1 * sigma + mu;
  double u1, u2;
  //构造随机变量
 
  do
  {
    u1 = rand()*(1.0 / RAND_MAX);
    u2 = rand()*(1.0 / RAND_MAX);
  } while (u1 <= epsilon);
  //flag为真构造高斯随机变量X
  z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI * u2);
  z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI * u2);
  return z1 * sigma + mu;
}
//为图像添加高斯噪声
Mat addGaussianNoise(Mat& srcImage)
{
  Mat resultImage = srcImage.clone();    //深拷贝,克隆
  int channels = resultImage.channels();    //获取图像的通道
  int nRows = resultImage.rows;    //图像的行数
 
  int nCols = resultImage.cols*channels;   //图像的总列数
  //判断图像的连续性
  if (resultImage.isContinuous())    //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组 
  {
    nCols *= nRows;
    nRows = 1;
  }
  for (int i = 0; i < nRows; i++)
  {
    for (int j = 0; j < nCols; j++)
    {	//添加高斯噪声
      int val = resultImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;
      if (val < 0)
        val = 0;
      if (val > 255)
        val = 255;
      resultImage.ptr<uchar>(i)[j] = (uchar)val;
    }
  }
  return resultImage;
}
 
int main()
{
        Mat srcImage = imread("1.jpg");
        namedWindow("均鞭图", 1);
  imshow("均鞭图", srcImage);
  /*********************对图像添加高斯噪声并进行高斯滤波**************/
   Mat GaussianshowImage,GaussianshowImage_1;
   GaussianshowImage_1 = addGaussianNoise(srcImage);
   imshow("高斯噪声小狮子的色图", GaussianshowImage_1);
   GaussianBlur(GaussianshowImage_1, GaussianshowImage, Size(3, 3), 1);
   imshow("高斯滤波小狮子的色图", GaussianshowImage);
}

程序例程如上,可自行shiy

发表评论

邮箱地址不会被公开。 必填项已用*标注

8 + 17 =