【Emgu CV教程】9.1、形态学常用操作之腐蚀

2024-03-11 08:36

本文主要是介绍【Emgu CV教程】9.1、形态学常用操作之腐蚀,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、相关概念
    • 1.什么叫形态学
    • 2.形态学操作的目的
    • 3.形态学都包含哪些操作
    • 4.结构元素StructuringElement
  • 二、腐蚀
    • 1.什么叫腐蚀
    • 2.腐蚀的作用
    • 3.腐蚀的函数
  • 三、演示
    • 1.原始素材
    • 2.代码
    • 3.运行结果


一、相关概念

1.什么叫形态学

形态学,英文名称morphology,根据网络上专业的说法,它是一种基于形状的图像处理技术,通过结构元素与图像进行特定运算的方式来改变图像的形态和特征。结构元素是一种小型、预定义的形状,通常是矩形、圆形或者椭圆形。

形态学操作的对象,一般是 二值化后的灰度图,对于普通灰度图、彩色图像,一般不用形态学操作。

2.形态学操作的目的

形态学操作后,可以保留二值化图像主要特征,消除噪点、孤立点的影响,更容易的获取到目标区域。这个操作在图像处理里面非常重要,基本上50%的图像处理例子都会用到。

3.形态学都包含哪些操作

腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽、黑帽,击中与击不中,名字是不是听起来都挺特殊的,别着急,咱们一个一个的举例子。

4.结构元素StructuringElement

在正式讲各种形态学操作之前,还有一个名字要解释一下,就是结构元素(Structuring Element),也可以叫卷积核。可以理解为结构元素是由值为1的矩阵组成,假设是7 * 7 的结构元素,那就是以目标点P(x,y)为中心,对周边邻域7 * 7 大小的范围内进行计算,得到的结果就是输出图像P(x,y)点的值。

二、腐蚀

1.什么叫腐蚀

二值化图片以黑色为背景,白色为前景物体。腐蚀就是收缩前景物体的边缘。其原理是将一个结构元素在图像上滑动,如果结构元素对应的原图的所有像素值为1(或者255),那么中心元素就保持原来的值,否则变为零。

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

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

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

在这9个值中,存在等于0的点,因此输出图像中,这个绿底色255点的值就是0。如果对右边绿底色255进行腐蚀呢,它提取出的计算区域是
在这里插入图片描述

因为9个值都是255,因此这个点的腐蚀结果,还是255。

2.腐蚀的作用

腐蚀操作可以去除白色前景物体的边缘毛刺,也可以断开相连的白色前景。 各种形态学操作的作用要记清楚了。

3.腐蚀的函数

Emgu CV中,腐蚀的函数定义如下:

public static void Erode(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.Erode(gray, dstMat, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Erode, " + dstMat.Size.ToString(), dstMat);

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

3.运行结果

假设kernelX = 3,kernelY =3,iterations = 1, 其腐蚀结果如下所示:

在这里插入图片描述
白色区域是不是变细了,而且白色矩形的边缘毛刺,也被腐蚀掉了。假设kernelX = 9,kernelY =1,iterations = 1, 其腐蚀结果如下所示:

在这里插入图片描述
这次就是水平方向的前景形状还能保留,垂直方向的直线(或者曲线形状),很多都被腐蚀没了,为什么呢?就是因为结构元素,其X方向是9,也就是水平方向以目标点为中心,左右9个计算区域内,有值为0的就输出。水平方向计算区域大了,只有横向的白色区间越大,目标点是255的可能性才越大。而结构元素Y方向是1,也就是垂直方向计算区域只有目标点,目标点是255结果就输出255;目标点是0结果就输出0。假设kernelX = 1,kernelY =13,iterations = 1, 其腐蚀结果如下所示:
在这里插入图片描述
是不是水平方向的前景被腐蚀了很多,但垂直方向的前景基本保留了。这个原理需要仔细理解一下,先记住腐蚀操作的结论:

1、结构元素水平方向值越大,目标图像中竖向前景越容易被腐蚀。
2、结构元素垂直方向值越大,目标图像中水平前景越容易被腐蚀。
3、iterations(执行次数)越大,目标图像被腐蚀的越多。


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

这篇关于【Emgu CV教程】9.1、形态学常用操作之腐蚀的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/797268

相关文章

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

Mysql数据库中数据的操作CRUD详解

《Mysql数据库中数据的操作CRUD详解》:本文主要介绍Mysql数据库中数据的操作(CRUD),详细描述对Mysql数据库中数据的操作(CRUD),包括插入、修改、删除数据,还有查询数据,包括... 目录一、插入数据(insert)1.插入数据的语法2.注意事项二、修改数据(update)1.语法2.有

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg