【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

相关文章

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa