OpenCv均值滤波

今天学习什么是均值滤波,主要学习一下基本问题。

问题1:什么是均值滤波?

均值均值就是计算求平均,是一个线性滤波算法。个人认为均值滤波也是也是基于核来运算的  只是这个核是变化的核,嘿嘿 可能理解的不到位。就一个一个n*n的区域中,n一般是奇数,这个区域中中心元素的像素值等于这个区域中所有像素值求和再除以像素值的个数,计算公式如下:g(x,y) = \sum f(x,y)/(n*n) (求和不包括其本身)哈哈 将就看吧,没有公式编辑器。

均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y)。

 

问题2:均值滤波是用来干啥的,有什么优点??

似乎没找到什么特别大的优点,平滑图像,速度较快,算法简单。均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。

均值滤波的代码实现:

#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void salt(Mat &image, Mat &result,int k)
{
	image.copyTo(result);
	for (; k > 0; k--)
	{
		int i = rand() % image.rows;
		int j = rand() % image.cols;
		if (image.channels() == 1)
		{
			result.at<uchar>(i, j) = 255;
		}
		if (image.channels() == 3)
		{
			result.at<Vec3b>(i, j)[0] = 255;
			result.at<Vec3b>(i, j)[1] = 255;
			result.at<Vec3b>(i, j)[2] = 255;
		}
	}
}
void averFiltering(Mat &image, Mat &result)
{
	if (image.data == NULL)
	{
		return;
	}
	image.copyTo(result);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if ((i - 1 >= 0) && (j - 1 >= 0) && (i < result.rows) && (result.cols))
			{
				result.at<Vec3b>(i, j)[0] = (result.at<Vec3b>(i, j)[0] + result.at<Vec3b>(i, j - 1)[0] + result.at<Vec3b>(i, j + 1)[0]
					+ result.at<Vec3b>(i - 1, j - 1)[0] + result.at<Vec3b>(i - 1, j)[0] + result.at<Vec3b>(i - 1, j + 1)[0]
					+ result.at<Vec3b>(i + 1, j - 1)[0] + result.at<Vec3b>(i + 1, j)[0] + result.at<Vec3b>(i + 1, j + 1)[0])/9;
				
				result.at<Vec3b>(i, j)[1] = (result.at<Vec3b>(i, j)[1] + result.at<Vec3b>(i, j - 1)[1] + result.at<Vec3b>(i, j + 1)[1]
					+ result.at<Vec3b>(i - 1, j - 1)[1] + result.at<Vec3b>(i - 1, j)[1] + result.at<Vec3b>(i - 1, j + 1)[1]
					+ result.at<Vec3b>(i + 1, j - 1)[1] + result.at<Vec3b>(i + 1, j)[1] + result.at<Vec3b>(i + 1, j + 1)[1]) / 9;

				result.at<Vec3b>(i, j)[2] = (result.at<Vec3b>(i, j)[2] + result.at<Vec3b>(i, j - 1)[2] + result.at<Vec3b>(i, j + 1)[2]
					+ result.at<Vec3b>(i - 1, j - 1)[2] + result.at<Vec3b>(i - 1, j)[2] + result.at<Vec3b>(i - 1, j + 1)[2]
					+ result.at<Vec3b>(i + 1, j - 1)[2] + result.at<Vec3b>(i + 1, j)[2] + result.at<Vec3b>(i + 1, j + 1)[2]) / 9;
			}
			else
			{
				result.at<Vec3b>(i, j)[0] = image.at<Vec3b>(i, j)[0];
				result.at<Vec3b>(i, j)[1] = image.at<Vec3b>(i, j)[1];
				result.at<Vec3b>(i, j)[2] = image.at<Vec3b>(i, j)[2];
			}
		}
	}
}
int main()
{
	Mat image, result1, result2;
	image = imread("Test.jpg", IMREAD_UNCHANGED);
	salt(image, result1, 3000);
	averFiltering(result1, result2);
	imshow("原始图像", image);
	imshow("椒盐噪声", result1);
	imshow("均值滤波", result2);
	waitKey(0);
	return 0;
}

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值