一、介绍
1.原理
均值滤波是指用当前像素周围区域的平均值来代替每个像素的值,进而生成目标图像。均值滤波同样需要一个滤波核。假如这里有一张原始图片,是单通道的灰度图,某个像素点P(x,y)值是66,见下图:
设定滤波核是3*3,也就是以66这个像素点为中心,水平方向取3个邻域,垂直方向取3个邻域,那么取出来的数据就是:
均值滤波就是计算( 98 + 31 +238 + 151 +66 + 83 + 29 + 137 + 211) / 9 ,结果是 116,也就是输出的目标图像,在P(x,y)这个点的值就由66变成116了。如果滤波核是 5 * 5,提取出的数据就是下面这个
25个数值相加是3113,最后的目标值就是 3113 / 25 = 125 。同样:
1、选择不同的滤波核,有不同的结果。
2、滤波核越大,选取的范围越大,计算量也越大。
3、滤波核都是奇数,因为目标点是中心,左右的取值距离和上下的取值距离是相同的。
2.函数介绍
Emgu CV中,均值滤波的函数是Blur(),官方定义如下:
public static void Blur(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
Size ksize, // 滤波核的大小,也就是选取的邻域像素的高度和宽度。
Point anchor, // 锚点,默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。
BorderType borderType = BorderType.Reflect101 // 边界样式,一般选默认
)
注意:
1、滤波核ksize要定义成 new System.Drawing.Size(ksizeX, ksizeY) 这种样式,其中ksizeX和ksizeY都是大于0的奇数。
2、锚点anchor写成 new System.Drawing.Point(-1, -1) 这种样式,默认是中心点,一般没有特殊的需求,不要改。
二、举例
1.原始素材
原始素材定义为srcMat,如下:
还是这个有椒盐噪声的向日葵图片。
2.代码
Emgu CV均值滤波代码如下:
int ksizeX = 7;
int ksizeY = 7;
Mat dstMat = srcMat.Clone();
CvInvoke.Blur(dstMat, dstMat, new System.Drawing.Size(ksizeX, ksizeY), new System.Drawing.Point(-1, -1));
CvInvoke.Imshow("Blur image, " + dstMat.Size.ToString(), dstMat);
3.运行结果
椒盐噪声已经变得很浅了,效果还可以,但是有一个问题:整体的图像都变模糊了,也就是向日葵的边缘不那么清晰了。这个就是均值滤波的特点:它可以同时去掉椒噪声、盐燥声,但是会让图像的细节信息变得更加模糊,滤波核越大越明显,读者们可以试一试。
原创不易,请勿抄袭。共同进步,相互学习。