用代码实现图像的去噪

              最近学了点图像处理,就顺带写了一个简易的图像处理的程序。这程序是用c++编写的,在这期博客中我主要说下图像的去噪。我程序中用了两种去噪的方法:1.加权滤波;2.中值滤波。从作品的最终效果来看,加权滤波的效果没有中值好,因此在这我着重说的是中值滤波。

        因为我们的图片都是网上找的,一般都没有噪点,所以我们第一步就是要堆图片进行加澡。我加噪使用随机函数来实现的,在图像上随机产生任意个数的噪声点。代码如下:

 

void jiazao( const Mat &img,Mat &img2)
{
	int img2_width,img2_height;
	img2_height = img.rows;
	img2_width = img.cols;
	img2= img.clone();
	srand((unsigned int)time(NULL));
	for(int i=0;i<100;i++)
	{
		int x=(int)rand()%img2_width;
		int y=(int)rand()%img2_height;
		if((x>0&&x<img.cols)&&(y>0&&y<img.rows))
		{
		  img2.at<uchar>(y, x) = 255;
		}
	
	}
}
        srand()是随机函数。

      给图像加上噪声有,接下来要做的就是去噪了。首先说下中值滤波中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。具体方法是用某种结构的二维滑动模板(我使用3*3的模板),将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。

      代码如下:

//中值滤波
void Zhongzhi(const Mat &img2, Mat &img3,int temp[])
{
	int width, height, img3_width, img3_height;
	int t = 1;
	img3_height = img2.rows;
	img3_width = img2.cols;
	width = img3_width - t;
	height = img3_height - t;
	img3.create(img3_height, img3_width, CV_8UC1);	
	int k;
	for (int i = 0; i < img3_width; i++)
	for (int j = 0; j < img3_height; j++)
	{
		if (i > t&&j > t&&i < width&&j < height)
		{
			k = 0;
			for (int m = i - t; m <= i + t; m++)
			for (int n = j - t; n <= j + t; n++)
			{
				temp[k] = img2.at<uchar>(n, m);
				k++;
			}
			int z = 8;	
			int swap = 0;
			for (int m = 0; m < z;m++)
			for (int n = 0; n < z - m; n++)
			{
				if (temp[n]>temp[n + 1])
				{
					swap = temp[n];
					temp[n] =temp[n + 1];
					temp[n + 1] = swap;
				}
					
			}
			img3.at<uchar>(j, i) = temp[z/2];
		}
		else
			img3.at<uchar>(j, i) = img3.at<uchar>(j, i);
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值