添加高斯噪声、椒盐噪声与均值、中值滤波处理

#include <iostream>
#include <opencv2/opencv.hpp>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace cv;
int Rows;//图像的行数
int Cols;//图像的列数

//生成高斯噪声
double generateGaussianNoise(const double &sigma,const double & mu)
{
	const double epsilon = std::numeric_limits<double>::min();//返回目标数据类型能表示的最逼近1的正数和1的差的绝对值
	static double z0, z1;
	//构造随机变量
	double u0, u1;
	do
	{
		u0 = rand()*(1.0 / RAND_MAX);
		u1 = rand()*(1.0 / RAND_MAX);
	} while (u0 <epsilon||u1<epsilon);

	z0 = sqrt(-2.0*log(u0))*cos(2 * CV_PI*u1);
	//z1 = sqrt(-2.0*log(u0))*sin(2 * CV_PI*u1);
	return z0 * sigma + mu;
}
//给图像添加高斯噪声
Mat addGaussianNoise(const Mat &grayImage)
{
	double sigma=2.0; //方差
	double mu=1;   //均值
	double k=10;  //比例系数
	Mat resultImage = grayImage.clone();   //图像的拷贝
	for (int i = 0; i < Rows; i++)
	{
		for (int j = 0; j < Cols; j++)
		{
			double temp= resultImage.at<uchar>(i, j) + generateGaussianNoise(sigma,mu) * k;
			if (temp < 0)
				temp= 0;
			if (temp> 255)
				temp= 255;
			resultImage.at<uchar>(i, j) = (uchar)temp;
		}
	}
	return resultImage;
}
//给图像添加椒盐噪声
Mat addSaltPepperNoise(const Mat &grayImage)
{
	Mat resultImage = grayImage.clone();   //图像的拷贝
	int sp = Rows * Cols;
	double snr = 0.9;
	int np = int(sp * (1 - snr));
	//std::cout << np << std::endl;
	for (int i = 0; i < np; i++)
	{
		//产生随机的位置
		int randx = rand()%Rows;
		int randy = rand()%Cols;
		int noise = rand() % 2;
		if (noise)
		{
			resultImage.at<uchar>(randx, randy) = 255;
		}
		else
		{
			resultImage.at<uchar>(randx, randy) = 0;
		}

	}
	return resultImage;
}
//给图像添加随机白噪声
Mat addRandWhiteNoise(const Mat &grayImage)
{
	Mat resultImage = grayImage.clone();   //图像的拷贝
	int sp = Rows * Cols;
	double snr = 0.8;
	int np = int(sp * (1 - snr));
	//std::cout << np << std::endl;
	for (int i = 0; i < np; i++)
	{
		//产生随机的位置
		int randx = rand() % Rows;
		int randy = rand() % Cols;
		resultImage.at<uchar>(randx, randy) = 255;

	}
	return resultImage;
}
//均值滤波
Mat meanFilter(const Mat &imageNoise,int m,int n)
{
	Mat resultImage = imageNoise.clone();
	//图像的边缘不做处理
	for (int i = m / 2; i < Rows - m / 2; i++)
	{
		for (int j = n / 2; j < Cols - n / 2; j++)
		{
			double temp = 0;
			for (int x = i - m / 2; x <= i + m / 2; x++)
			{
				for (int y = j - n / 2; y <= j + n / 2; y++)
				{
					temp += imageNoise.at<uchar>(x, y);
				}
			}
			resultImage.at<uchar>(i, j) = temp / (m*n);
		}
	}
	return resultImage;
}
//中值滤波
Mat medianFilter(const Mat &imageNoise,int m,int n)
{
	Mat resultImage = imageNoise.clone();
	for (int i = m / 2; i < Rows - m / 2; i++)
	{
		for (int j = n / 2; j < Cols - n / 2; j++)
		{
			std::vector<double>getNearPixel;
			double temp;
			for (int x = i - m / 2; x <= i + m / 2; x++)
			{
				for (int y = j - n / 2; y <= j + n / 2; y++)
				{
					temp=imageNoise.at<uchar>(x, y);
					getNearPixel.push_back(temp);
				}
			}
			std::sort(getNearPixel.begin(), getNearPixel.end());
			resultImage.at<uchar>(i, j) = getNearPixel[m*n/2];
		}
	}
	return resultImage;
}
int main()
{
	using namespace cv;
	//读入图像并创建图像矩阵
	Mat srcImage = imread("D:\\figure\\lena2.jpg");
	Mat grayImage;
	cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
	//imshow("grayImage", grayImage);
	//waitKey(0);
	Rows = grayImage.rows;//行数
	Cols = grayImage.cols;//列数

/*添加噪声处理*/
	//添加高斯噪声
	//Mat imageAddGn = addGaussianNoise(grayImage);
	//imshow("imageGuassionNoise", imageAddGn);
    //waitKey(0);

	//添加椒盐噪声
	//Mat imageAddSp = addSaltPepperNoise(grayImage);
	//imshow("addSaltPepperNoise", imageAddSp);
	//waitKey(0);

	//添加随机白噪声
	Mat imageAddRw = addRandWhiteNoise(grayImage);
	//imshow("addRandWhiteNoise",imageAddRw);
	//waitKey(0);

//去除噪声处理
	//去除高斯噪声
	//Mat imageDelGn1 = meanFilter(imageAddGn, 3, 3);
	//Mat imageDelGn2 = medianFilter(imageAddGn, 5, 5);
	//imshow("imageDelGn",imageDelGn2);
	//waitKey(0);

	//去除椒盐噪声
	//Mat imageDelSp1 = meanFilter(imageAddSp, 5, 5);
	//Mat imageDelSp2 = medianFilter(imageAddSp, 3, 3);
	//imshow("imageDesSp",imageDelSp2);
	//waitKey(0);

	//去除随机白噪声
	//Mat imageDelRw1 = meanFilter(imageAddRw, 5, 5);
	Mat imageDelRw2 = medianFilter(imageAddRw, 5, 5);
	imshow("imageDesRw", imageDelRw2);
	waitKey(0);
	return 0;
}
在MATLAB中使用图像处理工具包中的函数可以实现添加高斯噪声椒盐噪声,并进行均值滤波和中值滤波处理。 首先,使用imnoise函数来添加高斯噪声椒盐噪声。该函数需要输入原始图像和噪声类型参数。例如,要添加高斯噪声,可以使用以下代码: ```matlab img = imread('原始图像.jpg'); % 读取原始图像 noisy_img = imnoise(img, 'gaussian', 0, 0.02); % 添加高斯噪声,参数0和0.02分别表示噪声均值和方差 ``` 同样地,要添加椒盐噪声,可以使用以下代码: ```matlab noisy_img = imnoise(img, 'salt & pepper', 0.05); % 添加椒盐噪声,参数0.05表示噪声比例(图像总像素中噪声像素所占的比例) ``` 然后,可以使用均值滤波和中值滤波函数对加噪图像进行处理均值滤波使用了一个滤波模板,通过计算邻域像素的平均值来减小噪声。中值滤波使用了一个滤波模板,通过计算邻域像素的中值来减小噪声。以下是使用MATLAB中的函数进行均值滤波和中值滤波的代码示例: ```matlab mean_filtered_img = imfilter(noisy_img, fspecial('average', [3 3])); % 均值滤波,使用3x3大小的平均滤波器 median_filtered_img = medfilt2(noisy_img, [3 3]); % 中值滤波,使用3x3大小的滤波模板 ``` 上述代码中,imfilter函数使用了fspecial函数来创建一个平均滤波器。medfilt2函数直接对图像进行中值滤波,指定了滤波模板的大小为3x3。 最后,可以使用imshow函数显示原始图像、添加噪声后的图像以及经过均值滤波和中值滤波处理后的图像,观察滤波效果。例如: ```matlab subplot(2, 2, 1); imshow(img); title('原始图像'); subplot(2, 2, 2); imshow(noisy_img); title('添加噪声后的图像'); subplot(2, 2, 3); imshow(mean_filtered_img); title('均值滤波处理后的图像'); subplot(2, 2, 4); imshow(median_filtered_img); title('中值滤波处理后的图像'); ``` 上述代码将原始图像、添加噪声后的图像以及经过均值滤波和中值滤波处理后的图像显示在一个2x2的图像矩阵中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值