【Emgu CV教程】9.3、形态学常用操作之开运算

news2024/12/30 1:43:14

文章目录

  • 一、相关概念
    • 1.什么叫开运算
    • 3.开运算的函数
  • 二、演示
    • 1.原始素材
    • 2.代码
    • 3.运行结果


一、相关概念

1.什么叫开运算

腐蚀、膨胀已经讲完,这两个是最基础的形态学操作。这次讲的是开运算,它是一个先腐蚀、后膨胀的过程。原始图像先被腐蚀,这一步去除了白色前景物体的边缘毛刺、雪花噪声。然后再进行膨胀操作,回复原始前景物体的大小、或者连接因为腐蚀而断开的前景物体。

它就是用同一个结构元素,连续进行两次操作,所以开运算能够除去雪花噪声、毛刺,而前景物体的位置、形状、大小保持不变。

3.开运算的函数

Emgu CV中,开运算的函数定义如下:

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

注意哈,开运算和后面将要讲的闭运算,都是同一个函数MorphologyEx(),但是开运算的参数MorphOp operation,要指定为MorphOp.Open

二、演示

1.原始素材

原始素材srcMat是OpenCV官方使用的一张图片,图片内有不少的雪花噪声,如下图:
在这里插入图片描述

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

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

3.运行结果

假设kernelX = 9,kernelY =9,iterations = 1, 开运算结果如下所示:
在这里插入图片描述

是不是雪花噪声没了,但是英文字母j的大小、形状、位置都没有变化?????。我们再换一张图,并且设kernelX = 19,kernelY =1,iterations = 1, 其灰度图和开运算结果如下所示:
在这里插入图片描述
原始图像有很多雪花噪声,而且水平、垂直方向都有前景,经过开运算后,雪花噪声没了,垂直方向的前景也消失了。就是因为它第一步腐蚀操作的特性:腐蚀时结构元素水平方向值越大,目标图像中竖向前景越容易被腐蚀。 。虽然后面执行了膨胀操作,但是因为上一步腐蚀时,垂直方向大片区域都已经变成0了,再膨胀也救不回来了。

如果假设kernelX = 1,kernelY =19,iterations = 1 ,输出的图像是这样:
在这里插入图片描述
去除雪花噪声的同时,消除了前景物体的水平区域,保留了前景物体的垂直区域,读者们能理解吧。


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对GIS与游戏引擎(UE4 或 U3D)结合的看法

GIS与游戏引擎结合,这在6年前就已经很多公司在进行探索了,经过这几年的发展,结合当前的政策,从以下几方面说一下我的看法: 1.GIS客户都是特殊单位及领域。2018年后,国内已经对国产化有明确要求了&#xff0…

Spring中使用自带@Autowired注解实现策略模式

场景 SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else: SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_springboot编写策略工厂-CSDN博客 设计模式…

BUUCTF-----[SWPU2019]Web1

打开页面,原本以为是二次注入,结果不是,先注册一个账户 在申请发布广告中,发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试,发现系统过滤了#,or,空格 orde…

【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言vector容器代码实现内…

xss.haozi.me靶场“0x0B-0x12”通关教程

君衍. 一、0x0B 实体编码绕过二、0x0C script绕过三、0x0D 注释绕过四、0X0E ſ符号绕过五、0x0F 编码解码六、0x10 直接执行七、0x11 闭合绕过八、0x12 闭合绕过 一、0x0B 实体编码绕过 我们首先构造payload进行测试: 这里我们可以看到全部转为了大写&#xff0c…

低压线性恒流LED恒流驱动芯片SM15633EH:用于洗墙灯和线条灯

洗墙灯和线条灯是两种常见的LED照明产品,它们都需要使用LED恒流驱动芯片来确保稳定、可靠的电流供应,从而保证LED的使用寿命和亮度。 对于洗墙灯而言,由于其发出的光线需要覆盖较大的区域,因此需要使用较大功率的LED芯片&#xf…

rust入门(1)创建项目

安装 vscode 安装插件 rust-analyzerNative Debug vscode 配置自动格式化代码 settings.json{"editor.defaultFoldingRangeProvider": null,"[rust]": {"editor.defaultFormatter": "rust-lang.rust-analyzer", // Makes the magi…

mysql5.6---windows和linux安装教程和忘记密码怎么办

一、windows安装 1.完成解压 解压完成之后将其放到你喜欢的地址当中去,这里我默认放在了D盘,这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境变量->系统变量 选择PATH,在其后面添加: (注意自己的安装地址) D:\mysql-5.6.49…

在域控批量导出用户及其所在路径的信息

在Windows Server的Active Directory环境中,要批量导出用户及其所在OU(组织单位)的信息,可以使用PowerShell命令来实现。以下是一个简单的示例: Get-ADUser -Filter * -Properties CanonicalName | Select-Object Nam…

CCCorelib 点云球形特征(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的球形几何特征的点,计算方式如下图所示: 二、实现代码 // CloudCompare #include <CCCoreLib/PointCloudTpl.h> #include <CCCoreLib/

数据库基础理论知识

1.基本概念 数据(Data)&#xff1a;数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB)&#xff1a;在计算机内&#xff0c;永久存储、有组织、可共享的数据集合数据库管理系统(DBMS)&#xff1a;管理数据库的系统软件数据库系统(DBS):DBDBMSDBADBAP 数…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑碳捕集机组与氢储能系统协调运行的源荷储低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

机器人ChatGPT来了,80亿参数、前OpenAI人员经数年打造

严格地说&#xff0c;是“拾取与放置任务”版本的ChatGPT来了。除了自然语言交流&#xff0c;还能像Sora一样生成视频。 有了机器人基础模型RFM-1&#xff0c;使用简单英语就能指导机器人完成拣选工作。 机器人 AI 公司 Covariant CEO Peter Chen ‍坐在一个聊天机器人面前&…

图像分割损失函数

为什么要乘以2&#xff0c;是为了让DICE的值域在0和1之间 优化&#xff1a;两种LOSS相加 Focus loss:

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

摘要&#xff1a;开发用于田间杂草识别的系统对提高农业运营效率和提升作物产出至关重要。本篇文章详尽阐述了如何应用深度学习技术开发一个用于田间杂草识别的系统&#xff0c;并附上了完备的代码实现。该系统基于先进的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5…

提前爆料:绝地求生七周年预告片餐厅改版,七周年主题战术手套

七周年预告片刚刚在官博上线&#xff0c;让我们一起逐帧分析一下都有哪些皮肤吧。 开局就是一个七周年喷漆 然后出生岛手里会拿着七周年的蛋糕&#xff0c;互相丢。 艾伦格的餐厅们进行改版&#xff0c;成为七周年主题 餐厅内有一个七周年的饮料机&#xff0c;不知道是不是和米…

浅淡 C++ 与 C++ 入门

我们知道&#xff0c;C语言是结构化和模块化的语言&#xff0c;适用于较小规模的程序。而当解决复杂问题&#xff0c;需要高度抽象和建模时&#xff0c;C语言则不合适&#xff0c;而C正是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库…

C++的类和对象(六):友元、内部类

目录 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 再次理解类和对象 友元 基本概念&#xff1a;友元提供了一种突破封装的方式&#xff0c;有时提供了便利&#xff0c;但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多用&…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据&#xff1a;是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt

【YOLOv9】训练模型权重 YOLOv9.pt 重新参数化轻量转为 YOLOv9-converted.pt 1. 模型权重准备2. 模型重新参数化2.1 文件准备2.2 参数修改2.3 重新参数化过程 3. 重新参数化后模型推理3.1 推理超参数配置3.2 模型推理及对比 4. onnx 模型导出&#xff08;补充内容&#xff09;4…