【Emgu CV教程】9.2、形态学常用操作之膨胀

本文介绍了膨胀操作在图像处理中的作用,包括去除噪声、连接前景物体以及边缘扩张。通过EmguCV库的示例展示了如何使用结构元素和迭代次数控制膨胀效果。
摘要由CSDN通过智能技术生成


一、膨胀

1.什么叫膨胀

前面讲的是腐蚀,与其相反的操作,就是膨胀。二值化图片以黑色为背景,白色为前景物体。膨胀就是扩张前景物体的边缘。其原理是将一个结构元素在图像上滑动,选取原图中结构元素计算区域内最大值作为输出值。

假设有一副图像如下图,灰色底色是背景,黄色底色是前景物体。
在这里插入图片描述

定义一个结构元素,大小是3 * 3,也就是这样的
在这里插入图片描述

如果对左侧绿底色的0那个点做膨胀操作,根据结构元素大小,提取出的计算区域是
在这里插入图片描述

在这9个值中,最大值就是0,所以目标图像的输出结果也是0。如果对右边绿底色0进行膨胀呢,它提取出的计算区域是
在这里插入图片描述
因为9个值里面最大值是255,因此这个点的膨胀结果,是255。

2.膨胀的作用

膨胀操作可以去除白色前景物体内的黑色斑点,也可以连接两个白色前景。

3.膨胀的函数

Emgu CV中,膨胀的函数定义如下:

public static void Dilate(
	IInputArray src,  // 输入图像
	IOutputArray dst, // 输入图像
	IInputArray element, // 结构元素大小
	Point anchor, // 锚点位置,默认为中心new Point(-1, -1)
	int iterations, // 膨胀操作迭代次数
	BorderType borderType, // 边界填充方式,一般取默认
	MCvScalar borderValue // 边界值,使用时一般写成new MCvScalar()
)

三、演示

1.原始素材

原始素材定义为srcMat,是一张黑色背景,白色前景的图像,而且白色区域内有很多黑色胡椒噪声。
在这里插入图片描述

2.代码

Emgu CV膨胀演示代码如下:

Mat tempMat = srcMat.Clone();
Mat gray = new Mat();
Mat dstMat = new Mat();
int kernelX = Convert.ToInt16(TextBoxX.Text.Trim().ToString()); // structuring element结构元素 或者 kernel 内核的X值,水平方向
int kernelY = Convert.ToInt16(TextBoxY.Text.Trim().ToString()); // structuring element结构元素 或者 kernel 内核的X值,垂直方向
int iterations = Convert.ToInt16(TextBoxIterations.Text.Trim().ToString()); // 需要执行膨胀的次数

// 要转成灰度图
CvInvoke.CvtColor(tempMat, gray, ColorConversion.Bgr2Gray);

// 定义结构元素,其中元素的形状是矩形,size大小由两个文本框决定,默认锚点new Point(-1,-1)是指在中心
Mat element = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new System.Drawing.Size(kernelX, kernelY), new System.Drawing.Point(-1, -1));

// 开始膨胀,其中锚点位置new Point(-1, -1)代表中心
CvInvoke.Dilate(gray, dstMat, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Dilate, " + dstMat.Size.ToString(), dstMat);

注意哈,结构元素的内核要对水平方向和垂直方向分别定义。

3.运行结果

假设kernelX = 7,kernelY =7,iterations = 1, 其膨胀结果如下所示:

在这里插入图片描述

白色区域边缘往外扩张了,而且内部的黑色胡椒噪声也没有了,仔细看的话原始图像中不相连(中断)的两个前景也合并在一起了。假设kernelX = 17,kernelY =1,iterations = 1, 其膨胀结果如下所示:
在这里插入图片描述

水平方向的前景轮廓往外扩张的很多,导致Emgu这四个英文字母已经连载一起了,因为水平方向的计算区域是17,也就是17个邻域空间内,取最大值,当然会把更多的点变成255。垂直方向是1,也就是垂直方向的邻域空间只计算目标点本身。

膨胀操作记住结论:

1、结构元素水平方向值越大,目标图像中水平前景边缘扩张越大。
2、结构元素垂直方向值越大,目标图像中垂直前景边缘扩张越大。
3、iterations(执行次数)越大,目标图像边缘向外扩张越大。


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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值