基于c++的均值滤波程序编写

opencv中的blur函数用c++实现


1、均值滤波原理
均值滤波方法是,对待处理的当前像素,选择一个窗口模板,以该窗口为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。

在这里插入图片描述
选取一个奇数的窗口模板(如3*3)
在这里插入图片描述
代码编程

void cblur(const Mat& src, Mat& dst, Size wsize)
{
	if (wsize.width % 2 == 0 || wsize.height % 2 == 0)
	{
		cout << "please input odd parame" << endl;
		exit(-1);
	}
	//边缘扩大
	int hw = (wsize.width - 1) / 2;
	int hh = (wsize.height - 1) / 2;
	Mat newsrc;
	copyMakeBorder(src, newsrc, hw, hw, hh, hh, BORDER_DEFAULT);
	if (src.channels() == 3)
	{

		for (int i = hh; i < src.rows + hh; i++)
		{
			for (int j = hw; j < src.cols + hw; j++)
			{
				int sum[3] = { 0 };
				int mean[3] = { 0 };
				for (int l = i - hh; l < i + hh; l++)
				{
					for (int m = j - hw; m < j + hw; m++)
					{
						sum[0] += newsrc.at<Vec3b>(l, m)[0];
						sum[1] += newsrc.at<Vec3b>(l, m)[1];
						sum[2] += newsrc.at<Vec3b>(l, m)[2];
					}
				}
				mean[0] = sum[0] / (wsize.area());
				mean[1] = sum[1] / (wsize.area());
				mean[2] = sum[2] / (wsize.area());
				dst.at<Vec3b>(i - hh, j - hw)[0] = mean[0];
				dst.at<Vec3b>(i - hh, j - hw)[1] = mean[1];
				dst.at<Vec3b>(i - hh, j - hw)[1] = mean[2];
			}
		}
	}
	if (src.channels()==1)
	{
		for (int i = hh; i < src.rows + hh; i++)
		{
			for (int j = hw; j < src.cols + hw; j++)
			{
				int sum = 0 ;
				int mean =  0;
				for (int l = i - hh; l < i + hh; l++)
				{
					for (int m = j - hw; m < j + hw; m++)
					{
						sum += newsrc.at<uchar>(l, m);
					}
				}
				mean = sum / (wsize.area());
				
				dst.at<uchar>(i - hh, j - hw)= mean;
			}
		}
	}
}
发布了6 篇原创文章 · 获赞 0 · 访问量 508

猜你喜欢

转载自blog.csdn.net/qq_43702097/article/details/103906355