【Emgu CV教程】6.4、图像平滑之Blur()均值滤波


一、介绍

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.运行结果

在这里插入图片描述

椒盐噪声已经变得很浅了,效果还可以,但是有一个问题:整体的图像都变模糊了,也就是向日葵的边缘不那么清晰了。这个就是均值滤波的特点:它可以同时去掉椒噪声、盐燥声,但是会让图像的细节信息变得更加模糊,滤波核越大越明显,读者们可以试一试。


原创不易,请勿抄袭。共同进步,相互学习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值