六、使用OpenCV实现:几何均值,算术均值,谐波,逆谐波

点击链接→【数字图像处理】简单实践汇总

1. 添加噪声:椒、盐、椒盐、高斯

椒、盐、椒盐噪声比较简单,随机加就行了,可以参考之前的一篇:使用OpenCV自己实现:加噪、平滑、锐化

这里给出高斯噪声的函数:

//高斯噪声
double generateGaussianNoise(double mu, double sigma)
{
	const double epsilon = numeric_limits<double>::min();
	static double z0, z1;
	static bool flag = false;
	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);
	z0 = sqrt(-2.0 * log(u1)) * cos(2 * CV_PI * u2);
	z1 = sqrt(-2.0 * log(u1)) * sin(2 * CV_PI * u2);
	return z0 * sigma + mu;
}

Mat addGaussianNoise(Mat& srcImag)
{
	Mat dstImage = srcImag.clone();
	for (int i = 0; i < dstImage.rows; i++)
	{
		for (int j = 0; j < dstImage.cols; j++)
		{
			int val = dstImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;
			if (val < 0) val = 0;				
			if (val > 255) val = 255;				
			dstImage.ptr<uchar>(i)[j] = (uchar)val;
		}
	}
	return dstImage;
}

2. 调用自己写的函数进行平滑处理

	//椒
	Mat srcImage_noise_jiao = imread(SRC_IMAGE_NOISE_jiao, 0);
	imshow(WIMDOW_NAME_NOISE_jiao, srcImage_noise_jiao);
	my_filter_1(srcImage_noise_jiao, "算数均值3*3");
	my_filter_2(srcImage_noise_jiao, "几何均值3*3");
	my_filter_3(srcImage_noise_jiao, "谐波均值3*3");
	my_filter_4(srcImage_noise_jiao, "逆谐波均值3*3");

	//盐
	Mat srcImage_noise_yan = imread(SRC_IMAGE_NOISE_yan, 0);
	imshow(WIMDOW_NAME_NOISE_yan, srcImage_noise_yan);
	my_filter_1(srcImage_noise_yan, "算数均值3*3");
	my_filter_2(srcImage_noise_yan, "几何均值3*3");
	my_filter_3(srcImage_noise_yan, "谐波均值3*3");
	my_filter_4(srcImage_noise_yan, "逆谐波均值3*3");

	//椒盐
	Mat srcImage_noise_jiaoyan = imread(SRC_IMAGE_NOISE_jiaoyan, 0);
	imshow(WIMDOW_NAME_NOISE_jiaoyan, srcImage_noise_jiaoyan);
	my_filter_1(srcImage_noise_jiaoyan, "算数均值3*3");
	my_filter_2(srcImage_noise_jiaoyan, "几何均值3*3");
	my_filter_3(srcImage_noise_jiaoyan, "谐波均值3*3");
	my_filter_4(srcImage_noise_jiaoyan, "逆谐波均值3*3");

	//高斯
	Mat srcImage_noise_gaosi = imread(SRC_IMAGE_NOISE_gaosi, 0);
	imshow(WIMDOW_NAME_NOISE_gaosi, srcImage_noise_gaosi);
	my_filter_1(srcImage_noise_gaosi, "算数均值3*3");
	my_filter_2(srcImage_noise_gaosi, "几何均值3*3");
	my_filter_3(srcImage_noise_gaosi, "谐波均值3*3");
	my_filter_4(srcImage_noise_gaosi, "逆谐波均值3*3");

3. 算数均值

//算术均值
void my_filter_1(Mat src, string window_name)
{
	Mat img = src.clone();
	for (int i = 1; i < img.rows - 2; i++)
	{
		for (int j = 1; j < img.cols - 2; j++)
		{
			img.at<uchar>(i, j) = (src.at<uchar>(i - 1, j - 1)
				+ src.at<uchar>(i - 1, j)
				+ src.at<uchar>(i - 1, j + 1)
				+ src.at<uchar>(i, j - 1)
				+ src.at<uchar>(i, j)
				+ src.at<uchar>(i, j + 1)
				+ src.at<uchar>(i + 1, j - 1)
				+ src.at<uchar>(i + 1, j)
				+ src.at<uchar>(i + 1, j + 1)) / 9;
		}
	}
	imshow(window_name, img);
}

4. 几何均值

//几何均值
void my_filter_2(Mat src, string window_name)
{
	Mat img = src.clone();
	for (int i = 1; i < img.rows - 2; i++)
	{
		for (int j = 1; j < img.cols - 2; j++)
		{
			img.at<uchar>(i, j) = pow(1.0 * src.at<uchar>(i - 1, j - 1), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i - 1, j), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i - 1, j + 1), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i, j - 1), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i, j), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i, j + 1), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i + 1, j - 1), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i + 1, j), 1.0 / 9)
				* pow(1.0 * src.at<uchar>(i + 1, j + 1), 1.0 / 9);
		}
	}
	imshow(window_name, img);
}

5. 谐波均值

//谐波均值
void my_filter_3(Mat src, string window_name)
{
	Mat img = src.clone();
	for (int i = 1; i < img.rows - 2; i++)
	{
		for (int j = 1; j < img.cols - 2; j++)
		{
			img.at<uchar>(i, j) = 9.0 / (1.0 / src.at<uchar>(i - 1, j - 1)
				+ 1.0 / src.at<uchar>(i - 1, j)
				+ 1.0 / src.at<uchar>(i - 1, j + 1)
				+ 1.0 / src.at<uchar>(i, j - 1)
				+ 1.0 / src.at<uchar>(i, j)
				+ 1.0 / src.at<uchar>(i, j + 1)
				+ 1.0 / src.at<uchar>(i + 1, j - 1)
				+ 1.0 / src.at<uchar>(i + 1, j)
				+ 1.0 / src.at<uchar>(i + 1, j + 1));
		}
	}
	imshow(window_name, img);
}

6. 逆谐波均值

//逆谐波均值
void my_filter_4(Mat src, string window_name)
{
	double q = 1.5;
	Mat img = src.clone();
	for (int i = 1; i < img.rows - 2; i++)
	{
		for (int j = 1; j < img.cols - 2; j++)
		{
			img.at<uchar>(i, j) =
				(pow(src.at<uchar>(i - 1, j - 1), q + 1)
					+ pow(src.at<uchar>(i - 1, j), q + 1)
					+ pow(src.at<uchar>(i - 1, j + 1), q + 1)
					+ pow(src.at<uchar>(i, j - 1), q + 1)
					+ pow(src.at<uchar>(i, j), q + 1)
					+ pow(src.at<uchar>(i, j + 1), q + 1)
					+ pow(src.at<uchar>(i + 1, j - 1), q + 1)
					+ pow(src.at<uchar>(i + 1, j), q + 1)
					+ pow(src.at<uchar>(i + 1, j + 1), q + 1)) /
					(pow(src.at<uchar>(i - 1, j - 1), q)
						+ pow(src.at<uchar>(i - 1, j), q)
						+ pow(src.at<uchar>(i - 1, j + 1), q)
						+ pow(src.at<uchar>(i, j - 1), q)
						+ pow(src.at<uchar>(i, j), q)
						+ pow(src.at<uchar>(i, j + 1), q)
						+ pow(src.at<uchar>(i + 1, j - 1), q)
						+ pow(src.at<uchar>(i + 1, j), q)
						+ pow(src.at<uchar>(i + 1, j + 1), q));
		}
	}
	imshow(window_name, img);
}

7. 效果展示


  • 在这里插入图片描述


  • 在这里插入图片描述

  • 椒盐
    在这里插入图片描述

  • 高斯
    在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值