首页 > 代码库 > 高效均值滤波的方法与实现

高效均值滤波的方法与实现

均值滤波的基本原理很简单,就是用滑动窗口内所有像素的平均值代替窗口中心像素的灰度值


高效均值滤波的原理如下:

wKiom1SOzwKyBjkQAAEOXumd4Eo206.jpg

wKioL1SOz6DhvqB9AAFUR8_YdWM428.jpg




代码:

//高效均值滤波
void Blur(const Mat &image_Src, Mat &image_Dst, Size size_Aperture)
{
	//////////step 1.重新分配图像(如果需要)/////////////////
	//新图像的大小
	int width_Dst=image_Src.cols;
	int height_Dst=image_Src.rows;
	image_Dst.create(Size(width_Dst,height_Dst),CV_8UC1);//如果重新分配,之前的空间会扔掉
	image_Dst.setTo(Scalar(0));

	//滑动窗口
	int width_Aperture=size_Aperture.width;
	int height_Aperture=size_Aperture.height;
	int pixelCount=width_Aperture*height_Aperture;
	int *sum_PerCol=new int[width_Dst];//每列的灰度值


	//计算起点坐标
	int startX=width_Aperture>>1;
	int startY=height_Aperture>>1;

	//第一行
	//三个关键的指针,这三个指针绑定在一起,一起滑动
	//1.2:需要被处理的像素
	//3:滑动窗口第一个元素,用来操作滑动窗口
	uchar *row_Src=http://www.mamicode.com/image_Src.data+startY*width_Dst+startX;>


使用大小为3行5列的窗口,运行效果图:

wKioL1SO0NrTst0xAAIjCcxKUGI750.jpg

wKiom1SO0DyQExnjAAGaB-AqlSk441.jpg


运行这段代码之前,需要配置一下OpenCV,算法核心和OpenCV没有太大关联。

注意:算法没有处理边界的情况,还不太清楚怎么处理边界,有会的朋友,希望能够一起分享一下边界处理的一些技巧

代码写的不是特别规范,大家有什么看不懂的地方,可以提出来

本文出自 “QQ” 博客,请务必保留此出处http://qianqing13579.blog.51cto.com/5255432/1590213

高效均值滤波的方法与实现