C#描述-计算机视觉OpenCV(6):形态学

ops/2024/12/23 5:24:09/

C#描述-计算机视觉OpenCV(6):形态学

    • 前言
    • 阈值化二值图像
    • 腐蚀与膨胀算法
    • 形态学滤波器开启和闭合运算
    • 原理概括

前言

这是本系列第六节,主要是介绍基础的形态学运用。
形态学主要是分析图像中不同主题的形态,它定义了一系列运算,用预先定义的形状元素探测图像,从而实现图像的转换。这个形状元素与像素邻域的相交方式决定了运算的结果。从而可以进行切割、特征检测。

阈值化二值图像

因为形态学滤波器通常作用于二值图像,所以我们先对图像做阈值化的二值图像操作。我们以此图为例:
在这里插入图片描述
使用Threshold方法
res, dst = cv2.threshold(src, thresh, maxval, type)
来进行阈值化,参数详解:

src:输⼊图,只能输⼊单通道图像,通常是指灰度图
dst:输出图
thresh:阈值
maxval:当像素值超过了阈值(或⼩于阈值,根据type来决定),所赋予的值
type:⼆值化操作类型,包含以下五种类型:
cv2.THRESH_BINARY 超过阈值部分取maxval(最⼤值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY 上述反转
cv2.THRESH_TRUNC ⼤于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO ⼤于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV THRESH_TOZERO 上述反转

在阈值的选择上,我们需要观察原图的直方图(直方图算法详见:C#描述-计算机视觉OpenCV(5):直方图算法),根据直方图示,我们可以先选择中端峰值左侧的点,也就是100作为阈值参考。
在这里插入图片描述
代码:

Cv2.Threshold(img1, res, 100, 255,ThresholdTypes.Binary);
Cv2.ImShow("11", res);

生成图像:
在这里插入图片描述
一般来说,在形态学中,我们习惯用高像素值(白色)表示前景物体,用低像素值(黑色)表示背景物体,这张图的切割效果是大概符合我们的要求的(实际上是,测试了多个数值,基本这是最好效果)。

腐蚀与膨胀算法

腐蚀与膨胀是基本的形态学运算操作。
OpenCV 用简单的函数实现了腐蚀和膨胀运算,它们分别是 cv:erode 和 cv:dilate,用法也很简单:

Mat eroded = new Mat();
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(5, 5), new OpenCvSharp.Point(-1, -1));
Cv2.Erode(res, eroded,kernel);
Cv2.ImShow("12", eroded);
Mat dilated = new Mat();
Cv2.Dilate(res, dilated, kernel);
Cv2.ImShow("13", dilated);

通过腐蚀与膨胀运算,我们可以对图片中的物体形态进行突出、分割等操作。顾名思义,腐蚀就是从背景向前景物去侵蚀,膨胀就是前景物形态膨胀。
腐蚀图例:
在这里插入图片描述
膨胀图例:
在这里插入图片描述

形态学滤波器开启和闭合运算

调用以下方法对图像做闭合运算

Cv2.MorphologyEx(img, res, MorphTypes.Close,kernel);

其中,MorphTypes.Close为运算符
原理:
开启和闭合滤波器的定义只与基本的腐蚀和膨胀运算有关:闭合的定义是对图像先膨胀后腐蚀,开启的定义是对图像先腐蚀后膨胀。也就是等同于:
// 膨胀原图像
Cv2.Dilate(img, dilated, kernel);
// 就地腐蚀膨胀后的图像
Cv2.Erode(dilated, res,kernel);
调换这两个函数的调用次序,就能得到开启滤波器。
查看闭合滤波器的结果,可看到白色的前景物体中的小空隙已经被填满。闭合滤波器也会把邻近的物体连接起来。基本上,所有小到不能容纳完整结构元素的空隙或间隙都会被闭合滤波器消除。
与闭合滤波器相反,开启滤波器消除了背景中的几个小物体。所有小到不能容纳完整结构元素的物体都会被移除。
这些滤波器常用于目标检测。闭合滤波器可把错误分裂成小碎片的物体连接起来,而开启滤波器可以移除因图像噪声产生的斑点。因此最好按一定的顺序调用这些滤波器。如果优先考虑过滤噪声,可以先开启后闭合,但这样做的坏处是会消除掉部分物体碎片。
先使用开启滤波器,再使用闭合滤波器,会得到如下结果:
在这里插入图片描述

原理概括

数学形态学中最基本的概念是结构元素。结构元素可以简单地定义为像素的组合,在对应的像素上定义了一个原点(也称锚点)。形态学滤波器的应用过程就包含了用这个结构元素探测图像中每个像素的操作过程。把某个像素设为结构元素的原点后,结构元素和图像重叠部分的像素集就是特定形态学运算的应用对象。
在这里插入图片描述
当我们进行腐蚀与膨胀运算时,可考虑背景(黑色)和前景(白色)的物体。腐蚀时,如果结构元素放到某个像素位置时碰到了背景(即交集中有一个像素是黑色的),那么这个像素就变为背景;膨胀时,如果结构元素放到某个背景像素位置时碰到了前景物体,那么这个像素就被标为白色。正因如此,图像腐蚀后物体尺寸会缩小(形状被腐蚀),而图像膨胀后物体会扩大。
在腐蚀图像中,有些面积较小的物体(可看作背景中的“噪声”像素)会彻底消失。与之类似,膨胀后的物体会变大,而物体中一些“空隙”会被填满。
所以也在这里解释结果元素的生成,
Mat kernel = Cv2.GetStructuringElement
(MorphShapes.Rect,
new OpenCvSharp.Size(5, 5),
new OpenCvSharp.Point(-1, -1));

这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。
可以自行调整结构元素的设计来分析运用的效果。


http://www.ppmy.cn/ops/114263.html

相关文章

基于SpringBoot+Vue的宠物医院管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

unity 高性能对象池解决方案

对于一个高性能对象池应该有的功能: 支持多种对象、同步加载、异步加载、隐藏方式、自动收缩(使用LRU缓存机制,最近最久未使用来进行收缩)、异步删除 所以我针对这几个功能讲一下原理: 支持多种对象: G…

Spring Session

Session 共享问题 在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。 通常情况下 session 交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台 tomcat 中&#…

某文书网爬虫逆向

一、抓包分析 请求参数和响应数据都有加密 二、逆向分析 老方法、下xhr断点 加密实现逻辑都在这个方法里 执行到这的时候,在向下跟栈数据就已经渲染出来了,说明是在这个方法里进行的解密 解密方法,data.result为加密数据,data.s…

MyBatis 源码解析:Mapper 文件加载与解析

引言 在 MyBatis 中,Mapper 文件扮演了至关重要的角色,它通过 SQL 映射文件来定义数据库查询操作和 Java 对象之间的映射关系。Mapper 文件通常是以 XML 格式存储的,包含了 SQL 语句以及与 Java 对象的对应关系。在本篇文章中,我…

Java异常架构与异常关键字

1. Java异常简介 Java 异常是 Java 提供的一种识别及响应错误的一致性机制。 Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程 序健壮性。在有效使用异常的情况下,异常能清晰的回答 what, where,…

常见的限流算法

限流算法是用于控制访问频率、保护系统免受过载攻击的重要手段。常见的限流算法有以下几种,每种算法都有不同的应用场景和优缺点。下面是几种常见的限流算法的详细介绍: 1. 计数器算法(Counter) 原理 计数器算法是最简单的限流…

深入理解数据分析的使用流程:从数据准备到洞察挖掘

数据分析是企业和技术团队实现价值的核心。 5 秒内你能否让数据帮你做出决策? 通过本文,我们将深入探讨如何将原始数据转化为有意义的洞察,帮助你快速掌握数据分析的关键流程。 目录 数据分析的五个核心步骤1. 数据获取常用数据获取方式 2. 数…