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

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

教程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.rhkb.cn/news/405243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是黄金期权?黄金期权合约详解

想要了解什么是黄金期权首先要了解一下黄金期货。黄金期货是以现货黄金为标的物的期货品种&#xff0c;其交易代码通常为Au。而黄金期权&#xff0c;又称为黄金期货期权&#xff0c;是一种期权合约&#xff0c;其标的物是黄金期货合约本身&#xff0c;而非黄金现货。这意味着期…

设计模式22-迭代器模式

设计模式22-迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;动机定义结构定义结构结构图解释注意事项 C代码推导多态属性&#xff08;虚函数&#xff09;实现迭代器1. **返回值问题**2. **对象切割问题**3. **内存管理问题**4. **迭代器生命周期问题**5. **接口…

【保姆级教程】5分钟上手 Coze 自建插件,把 AI 接入个人微信

上篇&#xff0c;给大家介绍了一款搭建微信机器人的开源项目&#xff1a; 搭建微信机器人的第4种方式&#xff0c;我造了一个摸鱼小助手 不同于需要付费的项目&#xff0c;它的定制化程度非常高~ 问题来了&#xff1a;怎么接入 AI 能力呢&#xff1f; 考虑到大家对 Coze 智能…

(第三期)书生大模型实战营——OpenXLab部署InternLM2实践——上传模型

OpenXLab 部署 InternLM2 实践指南 上传模型 初始化git设置 # install git sudo apt-get update sudo apt-get install git# install git lfs sudo apt-get update sudo apt-get install git-lfs# use git install lfs git lfs installOpenXLab 使用你在平台的用户名作为 Git…

如何使用midjourney?MidJourney订阅计划及国内订阅教程

国内如何订阅MidJourney 第三方代理 参考&#xff1a; zhangfeidezhu.com/?p474 使用信用卡订阅教程 办理国外信用卡&#xff1a; 这个各自找国外的银行办理就好了。 登录MidJourney&#xff1a; 登录MidJourney网站&#xff0c;进入订阅中心。如果是在Discord频道&#x…

MySQL 高阶三 (索引性能分析)

执行过程 Explain explain select * from student s, course c , student_coure sc where s.id sc.studentid and c.id sc.courseid;EXPLAIN执行计划各字段含义: 【ld】 id相同&#xff0c;执行顺序从上到下; id不同&#xff0c;值越大&#xff0c;越先执行)。 【select_type…

C语言程序设计(初识C语言后部分)

1024M1GB&#xff0c;1GB1级棒。关爱一级棒的程序员们&#xff0c;宠TA没商量&#xff01; 5&#xff09;函数的嵌套调用和链式访问 函数和函数之间可以根据实际的需求进行组合的&#xff0c;也就是相互调用的。 1.嵌套调用 函数可以嵌套调用&#xff0c;但不可以嵌套定义&a…

作业帮 TiDB 7.5.x 使用经验

作者&#xff1a; 是我的海 原文来源&#xff1a; https://tidb.net/blog/5f9784d3 近期在使用 TiDB 时遇到的一些小问题的梳理总结&#xff0c;大部分版本都在6.5.6和7.5.2 1、limit 导致的扫描量过大的优化 研发定时任务每天需要扫描大量数据&#xff0c;到时机器网卡被…

TCP并发服务器模型

1.阻塞IO CPU占用率低,等待资源时将任务挂起,不占用CPU资源,等到拿到资源后继续向下执行 向管道中写入数据 write.c #include "../head.h" int main() {int fd;mkfifo("/tmp/myfifo",0777);char tmpbuff[100]{0};fdopen("/tmp/myfifo",O_WRON…

三十八、【人工智能】【机器学习】【监督贝叶斯网络(Bayesian Networks)学习】- 算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

39_WAF的概念、功能,ModSecurity部署配置、LAMP环境部署、Ubuntu搭建DVWA靶机测试、测试WAF防御、OWASP规则集的部署

一、WAF的概念 WAF&#xff08; Web Application Firewall &#xff09;&#xff0c;即Web应用防火墙 通过执行一系列HTTP/HTTPS&#xff08;应用层的协议&#xff09;的安全策略为Web应用提供保护的一种网络安全产品。增加攻击者的难度和成本&#xff0c;但不是100%安全。工…

halcon的HObject被释放

经过简述 某项目由我统一管理HObject(区域和图像)的释放。发现某区域被系统外部所释放。可能有两种情况&#xff1a;a&#xff0c;区域交给我后&#xff0c;释放了。b&#xff0c;获取我的区域后释放了。 最终证明是第二种情况&#xff0c;证明如下&#xff1a; a&#xff0c;…

Python数据分析:Pandas与NumPy结合,实现高效数值计算,提升数据分析效率的最佳实践

目前小编的借调任务已经完成&#xff0c;借调到其他组完成了自己的工作&#xff0c;有需要的同学可以看下相关的文章&#xff1a;Python&#xff08;Flask&#xff09; React && Golang&#xff08;Gin&#xff09; Vue(Element)&#xff0c;然后小编认为可以回到原来的…

深入探讨 Nginx:安装、配置及优化指南

一、Nginx 概述及编译安装 1、概述 Nginx是一个高性能的开源HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3邮件代理服务器。它最初由Igor Sysoev于2002年开发&#xff0c;并于2004年首次发布。Nginx以其高并发性、低资源消耗和灵活的配置能力而受到广泛关注&#x…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 近期&#xff0c;微软披露了一个最…

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor

双亲委派机制的优势与劣势

三次双亲委派机制的破坏

反向代理:定义与核心作用

反向代理&#xff1a;定义与核心作用 一、反向代理的定义二、反向代理的核心作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 反向代理&#xff0c;作为网络架构中的重要组件&#xff0c;扮演着关键角色。本文将简洁介绍反向代理的定义及…

整体思想以及取模

前言&#xff1a;一开始由于失误&#xff0c;误以为分数相加取模不能&#xff0c;但是其实是可以取模的 这个题目如果按照一般方法&#xff0c;到达每个节点再进行概率统计&#xff0c;但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…