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

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

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

代码:

//高效均值滤波
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=image_Src.data+startY*width_Dst+startX;
	uchar *row_Dst=image_Dst.data+startY*width_Dst+startX;
	uchar *row_Aperture_Src=image_Src.data;
	for (int y=startY;y<=height_Dst-startY-1;++y)
	{
		//列
		uchar *col_Src=row_Src;
		uchar *col_Dst=row_Dst;
		uchar *col_Aperture_Src=row_Aperture_Src;

		//计算每列height_Aperture个像素的灰度值和
		//第一行,计算所有列的和
		if (y==startY)
		{

			for (int k=0;k<=width_Dst-1;++k)
			{
				sum_PerCol[k]=0;
				//每列第一个指针
				uchar *col_PerLine=col_Aperture_Src+k;
				for (int t=0;t<=height_Aperture-1;++t)
				{
					sum_PerCol[k]+=col_PerLine[0];
					col_PerLine+=width_Dst;//下一行
				}

			}
		}
		else//非第一行
		{
			for (int k=0;k<=width_Dst-1;++k)
			{
				//每列第一个指针
				uchar *col_=col_Aperture_Src+k;
				sum_PerCol[k]-=col_[0-width_Dst];//减上面
				sum_PerCol[k]+=col_[0+(height_Aperture-1)*width_Dst];//加下面
			}

		}

		//计算width_Aperture行的列总和
		int sum_Aperture=0;
		for (int x=startX;x<=width_Dst-startX-1;++x)
		{
			//每行第一个元素,求width_Aperture个列和
			if (x==startX)
			{
				for (int k=x-startX;k<=x+startX;++k)
				{
					sum_Aperture+=sum_PerCol[k];
				}
			}
			else//非第一个元素
			{
				//减去左边
				sum_Aperture-=sum_PerCol[x-1-startX];

				//加上右边
				sum_Aperture+=sum_PerCol[x+startX];
			}

			//求均值
			uchar meanValue=sum_Aperture/pixelCount;
			col_Dst[0]=meanValue;

			//滑动一个像素
			col_Dst++;
			col_Src++;
		}
		//下一行
		row_Dst+=width_Dst;
		row_Src+=width_Dst;
		row_Aperture_Src+=width_Dst;
	}
}

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

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

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

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

时间: 2024-10-14 06:30:54

高效均值滤波的方法与实现的相关文章

高效均值滤波(采用copyMakeBorder处理边界像素)

修改了之前的滤波算法,采用了copyMakeBorder扩充边界像素,给处理边界像素带来了很大的方便 <span style="font-size:14px;">void Blur(const Mat &image_Src, Mat &image_Dst, Size size_Aperture) { /////////////////////////////step 1.重新分配图像(如果需要)////////////////////////////////

基于FPGA的均值滤波算法实现

我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于FPGA的一系列图像处理基础算法. 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种因为信号脉冲强度引起的噪声,产生清楚该噪声的算法也比较简单. 均值滤波的方法将数据存储成3x3的矩阵

基于FPGA的均值滤波算法的实现

前面实现了基于FPGA的彩色图像转灰度处理,减小了图像的体积,但是其中还是存在许多噪声,会影响图像的边缘检测,所以这一篇就要消除这些噪声,基于灰度图像进行图像的滤波处理,为图像的边缘检测做好夯实基础. 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素.椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单. 均值滤波的方法将数据存储成3x3的矩阵,然后求这个矩阵.在图像上对目标像素给

学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤波","高斯滤波"三种常见的邻域滤波操作.而作为非线性滤波的"中值滤波"和"双边滤波",我们下次再分析. 因为文章很长,如果详细啃的话,或许会消化不良.在这里给大家一个指引,如果是单单想要掌握这篇文章中讲解的OpenCV线性滤波相关的三个函

均值滤波

学习DIP第1天 均值滤波,是比較简单的滤波方式.比較典型的是以3x3的模板对核心(或者称为锚点)的元素及其周围八个元素进行求和并除以元素个数(即9)得到的值将原值覆盖,主要的实现方法为四层循环,算法时间复杂度: O(w*h*m*n) 当中w,h为图像宽和长.m.n为模板宽和长. 该算法有优化方法,将在以后的博文中讨论. 代码使用OpenCV1.0编写,因为代码水平有限,望请见谅0.0 #include <cv.h> #include <highgui.h> #include &l

均值滤波,中值滤波,最大最小值滤波

http://blog.csdn.net/fastbox/article/details/7984721 讨论如何使用卷积作为数学工具来处理图像,实现图像的滤波,其方法包含以下几种,均值 滤波,中值滤波,最大最小值滤波,关于什么是卷积以及理解卷积在图像处理中作用参见这 里–http://blog.csdn.net/jia20003/article/details/7038938 均值滤波: 均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高 频信号将会去掉,因此可以

学习DIP第1天--均值滤波

均值滤波,是比较简单的滤波方式,比较典型的是以3x3的模板对核心(或者称为锚点)的元素及其周围八个元素进行求和并除以元素个数(即9)得到的值将原值覆盖,基本的实现方法为四层循环,算法时间复杂度: O(w*h*m*n) 其中w,h为图像宽和长,m,n为模板宽和长.该算法有优化方法,将在以后的博文中讨论. 代码使用OpenCV1.0编写,由于代码水平有限,望请见谅0.0 #include <cv.h> #include <highgui.h> #include <stdio.h&

opencv初学习-椒盐噪声-中值滤波-均值滤波-腐蚀膨胀

#include <opencv2\opencv.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgcodecs\imgcodecs.hpp>#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<iomanip>void salt(cv

图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现

图像平滑是指直接对源图像的每个像素数据做邻域运算以达到平滑图像的目的.实质上主要就是通达卷积核算子实现的,卷积核算子的相关知识大家可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51691410 图像平滑也称为模糊或滤波,是图像处理中常用的技术之一,进行平滑处理时需要用到滤波器核(其实就是卷积核算子),根据滤波器核函数来实现不同的滤波技术.下面介绍几种 常用的图像平滑方法的大概原理及OpenCV下的实现代码. 一.盒滤波(均值滤波)