EmguCV学习笔记 VB.Net 4.5 像素距离和连通区域

news2024/12/28 4:36:11

  版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

教程VB.net版本请访问:
EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: https://blog.csdn.net/uruseibest/article/details/69663231

 学习C#知识,请移步:https://blog.csdn.net/uruseibest/article/details/136127499

4.5 像素距离和连通区域

4.5.1 DistanceTransform 像素距离

在VB.NET中使用EmguCV,可以通过`CvInvoke.DistanceTransform`函数进行距离变换操作。

Public Shared Sub DistanceTransform(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, labels As Emgu.CV.IOutputArray, distanceType As Emgu.CV.CvEnum.DistType, maskSize As Integer, Optional labelType As Emgu.CV.CvEnum.DistLabelType = 0)

参数说明:

  1. src:输入图像,类型为单通道CV8U的Mat。
  2. dst:输出图像,类型为CV8U或者CV32F的Mat。与输入图像具有相同的尺寸和类型,用于存储距离变换结果,它的每个像素的值表示该像素与0像素的最小距离。
  3. labels:输出图像,类型为CV32S的Mat。用于存储每个前景像素所属的连通域标签。
  4. distanceType:指定计算距离所使用的度量类型,类型为DistanceType,主要成员包括:
    1. L1:曼哈顿距离,也称为城市街区距离,表示两点之间在水平和垂直方向上的距离之和。
    2. L2:欧几里得距离,表示两点之间的直线距离,即两点之间的最短距离。
    3. C:Chebyshev距离,表示两点之间在水平、垂直和对角线方向上的最大距离。
  5. maskSize:指定掩膜大小,即要使用的邻域尺寸,常见的有3、5、7等,3表示3x3的掩膜,5表示5x5的掩膜,以此类推。
  6. labelType:指定计算连通域标签所使用的算法类型,可选值为DistLabelType.CComp或DistLabelType.Pixel。

【代码位置:frmChapter4】Button18_Click、printMatSingle

    'DistanceTransform

    Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click

        Dim bte(,) As Byte

        bte = {

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0}

        }

        Dim matr As New Matrix(Of Byte)(bte)

        Dim m As New Mat(matr.Size, DepthType.Cv8U, 1)

        m = matr.Mat

        Dim mdistance As New Mat(m.Size, DepthType.Cv8U, 1)

        Dim labels1 As New Mat()

        CvInvoke.DistanceTransform(m, mdistance, labels1, DistType.L2, 3)

        '如果参数labels使用nothing,那么 mdistance 中的元素类型是single

        'CvInvoke.DistanceTransform(m, mdistance, Nothing, DistType.L2, 3)

        Call printMatSingle(mdistance)

    End Sub

    '输出single类型Mat的元素的值

    Private Sub printMatSingle(ByVal m As Mat)

        Dim matr As New Matrix(Of Single)(m.Rows, m.Cols, m.NumberOfChannels)

        m.CopyTo(matr)

        For i As Integer = 0 To matr.Rows - 1

            For j As Integer = 0 To matr.Cols - 1

                Console.Write(matr(i, j))

                If j <> matr.Cols - 1 Then

                    Console.Write(",")

                End If

            Next

            Console.WriteLine()

        Next

End Sub

运行后如下图所示:

图4-18 像素间距离

4.5.2 connectedComponents 图像连通区域

ConnectedComponents方法是EmguCV中用于实现连通区域分析的函数。在图像处理中,经常需要对图像中的连通区域进行分析和处理,如区域标记、分割、形状识别等。ConnectedComponents函数可以将图像中的连通区域分析出来,并返回每个连通区域的标记和属性信息。声明如下:

Public Shared Function ConnectedComponents(image As Emgu.CV.IInputArray, labels As Emgu.CV.IOutputArray, Optional connectivity As Emgu.CV.CvEnum.LineType = 8, Optional labelType As Emgu.CV.CvEnum.DepthType = 4, Optional cclType As Emgu.CV.CvEnum.ConnectedComponentsAlgorithmsTypes = -1) As Integer

参数说明:

  1. image:输入图像,类型为Mat。
  2. labels:输出一个单通道Mat。连通区域标记的结果将存储在该Mat中。背景一般存储为0,相同连通区域的值相同。
  3. connectivity:连通区域的连接方式,类型为LineType。指定连通区域的连接方式,常见的有4连通(LineType.FourConnected)和8连通(LineType. Eight Connected)。
  4. ltype:labels图像的深度类型,类型为DepthType。可以选择浮点型(DepthType.Cv32F)或整型(DepthType.Cv32S)。
  5. ccltype:连通区域标签类型,类型为ConnectedComponentsAlgorithmsTypes,这是一个枚举类型,它表示连通区域分析算法的类型。连通区域分析是一种将二值图像中的像素划分为不同连通区域的技术。在EmguCV中,提供了多种不同的算法来进行连通区域分析,每种算法都有其特点和适用范围。ConnectedComponentsAlgorithmsTypes枚举类型定义了可用的连通区域分析算法类型,主要包括:
    1. CCL_GRANA:Grana算法,一种基于扫描线的算法,适用于较小的图像。
    2. CCL_WU:Wu算法,一种基于扫描线的算法,适用于较大的图像。
    3. CCL_DEFAULT:默认算法,使用基于扫描线的算法,但会根据图像大小和特征动态选择算法。

返回值:

分析出的连通区域的数量。

【代码位置:frmChapter4】Button19_Click

   'connectedComponents

    Private Sub Button19_Click(sender As Object, e As EventArgs) Handles Button19.Click

        Dim m1 As New Mat("C:\learnEmgucv\shape.jpg", CvEnum.ImreadModes.Grayscale)

        ImageBox1.Image = m1

        '二值化

        Dim mid1 As New Mat

        CvInvoke.Threshold(m1, mid1, 150, 255, ThresholdType.BinaryInv)

        '连通区域分析结果存储到result

        Dim result As New Mat

        Dim num As Integer

        '获得连通区域

        num = CvInvoke.ConnectedComponents(mid1, result, LineType.FourConnected, DepthType.Cv16U)

        Console.WriteLine("连通区域数量:" & num)

        '在本代码中使用的图像,获得的连通区域为12(含背景),result中像素的值从0-11

        '所以这里看到的是全黑色的图

        ImageBox2.Image = result

        Dim img As New Image(Of Gray, Byte)(m1.Size)

        img = result.ToImage(Of Gray, Byte)

        Dim img1 As New Image(Of Bgr, Byte)(m1.Size)

        Dim maxsize As Integer = 0

        '使用循环遍历分析出的连通区域,这里对非背景(0)的区域着相同颜色

        For i As Integer = 0 To img.Rows - 1

            For j As Integer = 0 To img.Cols - 1

                '0的区域作为背景

                If img.Data(i, j, 0) = 0 Then

                    img1.Data(i, j, 0) = 0

                    img1.Data(i, j, 1) = 0

                    img1.Data(i, j, 2) = 0

                Else

                    Console.WriteLine(img.Data(i, j, 0))

                    maxsize = IIf(maxsize > img.Data(i, j, 0), maxsize, img.Data(i, j, 0))

                    img1.Data(i, j, 0) = 0

                    img1.Data(i, j, 1) = 255

                    img1.Data(i, j, 2) = 255

                End If

            Next

        Next

        ImageBox3.Image = img1

        '为什么差1,因为包含了背景部分。

        MessageBox.Show("num  " & num & "   maxsize  " & maxsize)

End Sub

运行后如下图所示:

 

图4-19 连通区域

4.5.3 connectedComponentsWithStats

ConnectedComponentsWithStats方法是用于进行连通区域分析的函数,它可以分析二值图像中的连通区域,并返回每个连通区域的标记值、面积、重心和边界框等信息。声明如下:

Public Shared Function ConnectedComponentsWithStats(image As Emgu.CV.IInputArray, labels As Emgu.CV.IOutputArray, stats As Emgu.CV.IOutputArray, centroids As Emgu.CV.IOutputArray, Optional connectivity As Emgu.CV.CvEnum.LineType = 8, Optional labelType As Emgu.CV.CvEnum.DepthType = 4, Optional cclType As Emgu.CV.CvEnum.ConnectedComponentsAlgorithmsTypes = -1) As Integer

参数说明(其余参数请参看4.4.2节【connectedComponents 图像连通区域】):

  1. stats:统计信息,类型为Mat。用于存储每个连通区域的统计信息,如面积、位置、宽度、高度等。它是一个5列的矩阵, 每一行对应一个连通区域,分别为连通区域外接矩形的x、y、width、height和面积。
  2. centroids:质心坐标,类型为Mat。用于存储每个连通组件的质心坐标。

【代码位置:frmChapter4】Button20_Click

    '连通区域的统计信息自定义结构,

    '包含xywidthheight和面积,

    '由于Rectangle已经包含xywidthheight

    '所以这里的结构是RectangleInteger

    Public Structure sstats

        Dim rec As Rectangle

        Dim area As Integer

    End Structure

    '连通区域分析

    '注意:白色255代表有数据,黑色0代表没有数据,

    '所以要根据图像实际情况,确保图像输入之前转换成黑底白图

    Private Sub Button20_Click(sender As Object, e As EventArgs) Handles Button20.Click

        Dim m1 As New Mat("C:\learnEmgucv\shape.jpg", CvEnum.ImreadModes.Grayscale)

        ImageBox1.Image = m1

        '二值化

        Dim mid1 As New Mat

        '这里过滤了一部分连通区域

        CvInvoke.Threshold(m1, mid1, 150, 255, ThresholdType.BinaryInv)

        ImageBox2.Image = mid1

        Dim result As New Mat

        Dim mstats As New Mat

        Dim mcentroids As New Mat

        Dim num As Integer

        num = CvInvoke.ConnectedComponentsWithStats(mid1, result, mstats, mcentroids, LineType.EightConnected, DepthType.Cv16U)

        Dim stats(num - 1) As sstats

        '拷贝到sstats数组

        mstats.CopyTo(stats)

        Dim centroids(num - 1) As MCvPoint2D64f

        '拷贝到点数组

        mcentroids.CopyTo(centroids)

        '载入彩色图像

        Dim m2 As New Mat("C:\learnEmgucv\shape.jpg", CvEnum.ImreadModes.AnyColor)

        '总的面积,算下来就是mid1或者result点的数量。

        Dim allpoints As Integer = 0

        For i As Integer = 0 To num - 1

            '画出每个连通区域的中心点

            CvInvoke.Circle(m2, New Point(CInt(centroids(i).X), CInt(centroids(i).Y)), 10, New MCvScalar(0, 255, 255), -1)

            '画出每个连通区域的外接矩形

            CvInvoke.Rectangle(m2, stats(i).rec, New MCvScalar(255, 0, 0), 2)

            '在本例中,使用的图像高度486,宽度537,即总的像素数量486*537=260982

            '这里计算出的面积(总的点的数量)=260982

            allpoints += stats(i).area

        Next

        ImageBox3.Image = m2

End Sub

运行后如下图所示:

 

图4-20 绘制连通区域的中心和外接矩形

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

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

相关文章

【数据结构与算法 | 图篇】最小生成树之Kruskal(克鲁斯卡尔)算法

1. 前言 克鲁斯卡尔算法&#xff08;Kruskals algorithm&#xff09;是一种用于寻找加权图的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的经典算法。这种算法是由约瑟夫克鲁斯卡尔&#xff08;Joseph Kruskal&#xff09;提出的&#xff0c;并且适用于所有…

七夕情人节动态花瓣表白网页源码

软件介绍 七夕情人节动态花瓣表白网页源码是一款功能强大的表白网页程序&#xff0c;拥有超级好看的花瓣表白效果和多种不同的动态切换效果&#xff0c;非常适合七夕表白活动。 拥有独特的设计风格和花瓣表白效果&#xff0c;可以让用户在表白过程中更加浪漫和温馨。该程序还…

Seaborn:基于 Matplotlib 的高级绘图库,提供了更高级的接口来绘制吸引人的统计图形。

引言 Seaborn 是基于 Matplotlib 的高级数据可视化库&#xff0c;专为绘制统计图形而设计。相比于 Matplotlib&#xff0c;Seaborn 提供了更高级的接口&#xff0c;简化了绘图过程&#xff0c;同时默认的美观配色和样式使得图形更加吸引人。Seaborn 特别适合用于探索性数据分析…

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁)

Cesium 实战 - 自定义纹理材质系列之 - 半球雷达效果(力场闪烁) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材…

springsecurity 登录认证一(ajax)

一、准备工作 1.1 导入依赖 因springboot 3.0 以上版本只能支持java17 顾使用2.5.0 版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><…

CSDN AI-WEB-1.0 攻略

找到一个目标靶场的IP &#xff0c; 这里以172.16.1.98 为例 1、使用命令 /robots.txt 来确定目录 2、分别测试两个文件 均无法访问&#xff0c;可返回其根目录查询 3、到根目录&#xff0c;出现搜索框 4、输入ID为1 5、使用虚拟机kali的终端 搜索命令 dirsearch -u http:…

Python青少年简明教程:基础知识

Python青少年简明教程&#xff1a;基础知识 Python是大小写敏感的语言。编程语言中的“大小写敏感”意味着该语言在识别标识符、关键字或者其他语法元素时&#xff0c;会区分字母的大小写。在这种语言中&#xff0c;大写字母和小写字母被视为不同的字符&#xff0c;因此&#x…

[论文翻译]使用 BERT 检测安卓恶意软件

Android Malware Detection Using BERT Souani B, Khanfir A, Bartel A, et al. Android malware detection using bert[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2022: 575-591. 摘要 在本文…

cad文件被写保护怎么解除保护?

CAD文件被写保护怎么解除保护?四五设计网小编给大家整理出的方法希望能够帮助到大家&#xff01; 解除CAD文件写保护的最简单方法是创建一个文件的副本&#xff0c;并在副本上进行编辑。 原文件可能因为文件属性或权限设置而被设置为写保护。创建副本不会改变原始文件的保护…

指针详解(六)

目录 1. sizeof 和 strlen 1&#xff09;sizeof 2&#xff09;strlen 3&#xff09;sizeof 和 strlen的区别 2. 数组和指针试题解析 1&#xff09;一维数组 2&#xff09;字符数组 3&#xff09;二维数组 3. 指针运算试题解析 1. sizeof 和 strlen 1&#xff09;sizeo…

【hot100篇-python刷题记录】【全排列】

R5-回溯篇 思路也是如下&#xff1a; 层层固定 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:#x代表当前固定/选择的数的下标def dfs(x):if xlen(nums)-1:ret.append(list(nums))returnfor i in range(x,len(nums)):#交换&#xff0c;将nums[i]固…

SAP_MM模块-MASS批量操作技巧

业务背景: 现在想要获得平台的流量券,每天必须要发两篇文章才行,但是一天发两篇的话,按照我的写作风格,很难写得出来~~我又不想把原本一篇完整的文章给拆分开来,那怎么办呢??今天就讲一下我常用的批量操作事务码MASS吧。 一、功能概述; MASS是系统标准的批量操作程序,…

HCIP第十一(生成树基础知识点)

企业网三层架构-冗余&#xff08;线路&#xff0c;设备&#xff0c;网关&#xff0c;电源Ups&#xff09; 三层架构-冗余&#xff0c;线路冗余&#xff1a;二层桥接技术 一台交换机上的一个接口可以映射多个MAC地址&#xff0c;但是一个MAC地址只能对应一个接口 当交换机触环…

2024.8.19 学习记录 —— 作业

一、TCP机械臂测试 #include <myhead.h>#define SER_PORT 8888 // 与服务器保持一致 #define SER_IP "192.168.0.114" // 服务器ip地址int main(int argc, const char *argv[]) {// 创建文件描述符打开键盘文件int fd open("/dev/input/event1…

设备实时数据采集:开启制造业智能化、自动化的新篇章

传统制造业在进行生产过程中&#xff0c;会涉及到设备实时数据采集需求&#xff0c;这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求&#xff1a; 1.生产数据&#xff1a;包括生产数量、生产批次、生产速度等&…

Facebook与区块链:社交网络如何融入去中心化技术

随着区块链技术的飞速发展&#xff0c;去中心化理念逐渐渗透到各个领域&#xff0c;社交网络也不例外。作为全球领先的社交平台&#xff0c;Facebook在这一趋势下开始积极探索区块链技术的潜力&#xff0c;希望利用这一前沿技术来提升平台的安全性、透明度和用户控制权。本文将…

Maven-02.介绍安装

一.介绍 首先从本地仓库中寻找所需要的jar包&#xff0c;如果没有就从中央仓库中寻找。然后从中央仓库中下载使用。但是中央仓库的服务器在国外&#xff0c;因此速度和稳定性都不好&#xff0c;因此我们在中间设立远程仓库&#xff08;私服&#xff09;&#xff0c;远程仓库一般…

光伏气象站——提升光伏发电效率和稳定运行

光伏气象站作为现代光伏电站的必备组成部分&#xff0c;‌特别适用于地理分布广泛、‌气象条件复杂多变的地区&#xff0c;‌如山区、‌森林或分散的屋顶安装等。‌这些地方由于可能存在微气候差异&#xff0c;‌对光伏系统的运行效率和性能有着显著影响。‌因此&#xff0c;‌…

LeetCode:3148. 矩阵中的最大得分(DP Java)

目录 3148. 矩阵中的最大得分 题目描述&#xff1a; 实现代码与解析&#xff1a; DP 原理思路&#xff1a; 3148. 矩阵中的最大得分 题目描述&#xff1a; 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧…

STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略

STM32线程安全问题 术语“线程” 和“多线程” 适用于裸机和基于RTOS的应用程序&#xff0c;线程安全问题并不只存在于基于RTOS的应用程序中&#xff1b;裸机应用程序中也存在这个问题&#xff0c;在裸机应用程序中&#xff0c;中断服务程序允许调用C库函数。线程安全问题可能…