基于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 )[2] = 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;
			}
		}
	}
}
以下是一个简单C++ 实现均值滤波算法的示例代码: ```c++ #include <iostream> #include <vector> using namespace std; // 定义均值滤波函数 vector<vector<int>> meanFilter(vector<vector<int>> img, int kernel_size) { int height = img.size(); int width = img[0].size(); vector<vector<int>> filtered_img(height, vector<int>(width, 0)); int k = kernel_size / 2; int sum, count; for (int i = k; i < height - k; i++) { for (int j = k; j < width - k; j++) { sum = 0; count = 0; for (int m = -k; m <= k; m++) { for (int n = -k; n <= k; n++) { sum += img[i + m][j + n]; count++; } } filtered_img[i][j] = sum / count; } } return filtered_img; } int main() { // 定义一个 5*5 的图像 vector<vector<int>> img = { {2, 3, 4, 3, 2}, {3, 4, 5, 4, 3}, {4, 5, 6, 5, 4}, {3, 4, 5, 4, 3}, {2, 3, 4, 3, 2} }; // 对图像进行均值滤波,kernel_size 为 3 vector<vector<int>> filtered_img = meanFilter(img, 3); // 输出滤波后的图像 for (int i = 0; i < filtered_img.size(); i++) { for (int j = 0; j < filtered_img[0].size(); j++) { cout << filtered_img[i][j] << " "; } cout << endl; } return 0; } ``` 上面的代码中,`meanFilter` 函数接受一个图像和一个 kernel_size,然后返回一个经过均值滤波处理后的图像。在函数中,我们首先计算出 kernel 的一半 k,然后对图像进行遍历,对于每个像素,计算它周围 kernel_size * kernel_size 个像素的均值,并将计算结果赋值给滤波后的图像。最后,返回滤波后的图像。 在 `main` 函数中,我们定义了一个 5*5 的图像,然后对它进行了均值滤波,kernel_size 为 3。最后输出了滤波后的图像。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值