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

news/2024/7/21 4:08:32 标签: c#, Emgu CV, 图像处理, 计算机视觉, 图像分析

文章目录

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


一、相关概念

1.什么叫闭运算

上一篇讲开运算,这一篇讲闭运算。与开运算相反,闭运算是先进行膨胀后进行腐蚀。回忆一下,膨胀有什么特点???去除白色前景物体内的黑色斑点,也可以连接两个白色前景。 再腐蚀一下呢,前景物体是不是又回到了原来的大小。所以闭运算能够除去前景物体内部的小黑点、胡椒噪声,而前景的位置、形状、大小保持不变。

2.闭运算的函数

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

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

注意哈,开运算和闭运算,都是同一个函数MorphologyEx(),但是闭运算的参数MorphOp operation,要指定为MorphOp.Close;开运算的参数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.Close, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Close, " + dstMat.Size.ToString(), dstMat);

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

3.运行结果

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

英文字母j的大小、形状、位置都没有变化,但是其内部黑色的胡椒噪声已经消失了。我们再换一张图,并且设kernelX = 19,kernelY =1,iterations = 1, 其灰度图和闭运算结果如下所示:
在这里插入图片描述

原始图像有很多黑色胡椒噪声,而且水平、垂直方向都有前景,经过闭运算后,胡椒噪声没了,但有多个前景物体已经连接在一起了。就是因为它第一步膨胀操作的特性:膨胀时结构元素水平方向值越大,目标图像中水平前景边缘扩张越大。 膨胀的结果会导致多个本来独立的前景物体连载一起,即使再执行腐蚀时,也无法分开相连的前景物体了。

如果假设kernelX = 1,kernelY =19,iterations = 1 ,输出的图像是这样:
在这里插入图片描述

去除黑色胡椒噪声的同时,垂直方向多个前景物体连接在一起了,就是因为kernelY =19的原因。


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


http://www.niftyadmin.cn/n/5427051.html

相关文章

Python常用语法汇总(三):函数、类

9. 函数 #例1def greet_user(username): # 定义函数 """显示简单的问候语""" print(Hello, username.title() !) greet_user(Jesse) # 调用函数 #例2 def get_formatted_name(first_name,last_name): """返回整洁的姓名&q…

算法基础精选题3.13 模拟

第一题 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题号:NC16644 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 在初…

浅谈HTTP 和 HTTPS (中间人问题)

前言 由于之前的文章已经介绍过了HTTP , 这篇文章介绍 HTTPS 相对于 HTTP 做出的改进 开门见山: HTTPS 是对 HTTP 的加强版 主要是对一些关键信息 进行了加密 一.两种加密方式 1.对称加密 公钥 明文 密文 密文 公钥 明文 2.非对称加密 举个例子就好比 小区邮箱 提供一…

EditText不显示系统键盘,可用来显示自定义的键盘

系统键盘 包含普通键盘和现在很多ROM定制的密码安全键盘 调用已下方法即可解决: https://developer.android.google.cn/reference/android/widget/TextView#setShowSoftInputOnFocus(boolean) 但是,此方法是API 21Android 5.0加入的, 所以为了兼容低版本, 建议使用已下方法: p…

FPGA - 单总线协议(one-wire)

1,简介 单总线(one-wire)是美国 DALLAS 公司推出的外围串行扩展总线技术,与 SPI、I2C 等串行数据通信方式不同,它采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的。它具有节省 I/O口…

MySQL是什么

MySQL 是一种广泛使用的关系型数据库管理系统(RDBMS),它是由瑞典MySQL AB公司开发的,并在后续被Sun Microsystems收购,最终在2010年归入Oracle公司麾下。MySQL设计用来高效处理大规模的数据库工作负载,尤其…

springboot的maven多模块如何混淆jar包

springboot的maven多模块如何混淆jar包 一.简介二. 示例2.1 基本配置2.2 结果 三. 错误3.1 错误13.2 错误2 四. 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一.简介 …

微服务技术栈之rabbitMQ高级(二)

我们该如何确保MQ消息的可靠性? 如果真的发送失败,有没有其它的兜底方案? 这些问题,在这一次的学习中都会找到答案。 生产者的可靠性 首先,我们一起分析一下消息丢失的可能性有哪些。 消息从发送者发送消息&#…