【Emgu CV教程】10.14、ConnectedComponents()函数计算连通区域

文章目录

  • 一、概念
    • 1.什么叫图像的连通区域
    • 2.提取连通区域的函数
  • 二、简单应用
    • 1.原始素材
    • 2.代码
    • 3.运行结果
    • 4.连通区域上色


一、概念

1.什么叫图像的连通区域

图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。

最简单的理解:灰度图中,黑色背景值为0,前景多是大于0的,当有一片区域值相同,而且像素点彼此相连,就是一个连通区域。比如下面这张图(默认是二值化图形),就有7个连通区域,分别是字母E、m、g、u、C、V和符号"."
在这里插入图片描述
它有什么用呢,经常进行算法设计的同学们应该能够理解,在图像分割、目标检测、形状分析都能用的到。

2.提取连通区域的函数

Emgu.CV中提取连通区域的函数是:

public static ConnectedComponentsWithStats
(IInputArray image, // 输入图像IOutputArray labels, // 输出标记图像,与输入图像大小一样,对应的联通区域会标记上对应的数字0为背景,其它数字为对应的联通区域IOutputArray stats, // 每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积IOutputArray centroids, // 连通区域的中心点LineType connectivity = LineType.EightConnected, // 线形DepthType labelType = DepthType.Cv32S, // 输出标记图像的类型ConnectedComponentsAlgorithmsTypes cclType = ConnectedComponentsAlgorithmsTypes.Default
)

函数返回的是一个int类型数值,代表有几个连通区域。

二、简单应用

1.原始素材

原始素材srcMat如下图:
在这里插入图片描述
图像宽737,长349。

2.代码

代码如下:

Mat tempMat = srcMat.Clone();
Mat dstMat = srcMat.Clone();
Mat gray = new Mat();
int threshold = 40;// 1.转换图像
CvInvoke.CvtColor(tempMat, gray, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(gray, gray, threshold, 255, ThresholdType.Binary);// 2.利用ConnectedComponentsWithStats计算连通区域参数
Mat labels = new Mat(); // 对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割)
var stats = new Mat(); // 每一连通域的信息,表示每个连通区域的外接矩形(起始点的x、y、宽和高)和面积
var centroids = new Mat(); // 连通区域的中心点int a = CvInvoke.ConnectedComponentsWithStats(gray, labels, stats, centroids, LineType.EightConnected, DepthType.Cv16U);
Int32[,] intStatus = (Int32[,])stats.GetData(); // x,y,width,height,area四个参数有可能超过255,所以要转换成int32数组,不能转成Image<Gray, byte> img

3.运行结果

运行结果:
int a = 8;
Int32[,] intStatus如下所示:
在这里插入图片描述
a是代表连通区域个数,应该是7个,为什么结果是8呢???请看intStatus[0, 0]、intStatus[0, 1]、intStatus[0, 2]、intStatus[0, 3]的值,它代表了第0个连通区域的外接矩形,从左上角的[0,0]点开始,宽度737,长度349。intStatus[0, 4]好像是代表外接矩形面积,它不就是原始图片的尺寸吗??所以Int32[,] intStatus得出来的矩形组合,第一个不能用,其余的才是。

intStatus[1, 0]、intStatus[1, 1]、intStatus[1, 2]、intStatus[1, 3]代表从点[503,123]开始,宽度90,长度108的矩形,读者们可以试一试,它其实框起来的是字母C。

4.连通区域上色

根据网上最流行的说法,连通区域找到以后,最简单的一个应用就是给不同的区域上色,找连通区域的代码就是上面的,上色的代码就更简单了,如下:


// 接上面的连通区域查找
List<int[]> listColors = new List<int[]>();
Random random = new Random(); // 定义一个随机类的对象,目的是每个连通区域都有不同的颜色
for (int i = 0; i < a; i++)
{int[] color = new int[] { random.Next(0, 255), random.Next(0, 255), random.Next(0, 255) };listColors.Add(color);
}// 以不同颜色标记出不同的连通域
Mat result = new Mat(tempMat.Size, DepthType.Cv8U, 3);
result.SetTo(new MCvScalar(0, 0, 0));
Image<Bgr, int> img = result.ToImage<Bgr, int>();Int16[,] intLabels = (Int16[,])labels.GetData();
int w = result.Cols;
int h = result.Rows;
for (int i = 0; i < h; i++)
{for (int j = 0; j < w; j++){int label = intLabels[i, j];if (label == 0 || label >= listColors.Count) // 背景的黑色不改变{continue;}img.Data[i, j, 0] = listColors[label][0];img.Data[i, j, 1] = listColors[label][1];img.Data[i, j, 2] = listColors[label][2];}
}result = img.Mat;
result.ConvertTo(result, DepthType.Cv8U);CvInvoke.Imshow("gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Final result image, " + result.Size.ToString(), result);

这里注意的就是这句话:

Int16[,] intLabels = (Int16[,])labels.GetData();

labels是连通区域查找中,返回的标签记号,也就是这个函数

int a = CvInvoke.ConnectedComponentsWithStats(gray, labels, stats, centroids, LineType.EightConnected, DepthType.Cv16U);

它的大小就是图像大小,作用就是对像素的每一个像素都打上标签,背景为0,连通域打上1,2,3… …,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类,利用这个值,遍历图像的时候,判断它的值是多少,就在listColors中选择对应颜色。最终实现原始图像连通区域上色。效果如下:
在这里插入图片描述


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

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

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

相关文章

云工场上市在即:资产负债比率飙升,巨额分红3000万远超净利润

《港湾商业观察》施子夫 今年5月底&#xff0c;冲刺港交所上市的云工场科技控股有限公司&#xff08;以下简称&#xff0c;云工场&#xff09;通过聆讯。 6月5日&#xff0c;云工场宣布将于2024年6月5日至6月11日进行招股&#xff0c;预计在6月14日上市。公司计划发售1.15亿股…

【UE5.1 角色练习】11-坐骑——Part1(控制大象移动)

前言 在上一篇&#xff08;【UE5.1 角色练习】10-物体抬升、抛出技能 - part2&#xff09;基础上创建一个新的大象坐骑角色&#xff0c;并实现控制该角色行走的功能。 效果 步骤 1. 在商城中下载“African Animal Pack”资产和“ANIMAL VARIETY PACK”资产导入工程中 2. 复…

【deepin 邀您体验】玲珑 10 分钟快速构建指南!

玲珑 作为一种新型的独立包管理工具集&#xff0c;玲珑主要提供分层与隔离的运行环境&#xff0c;解决传统包管理系统强依赖导致的兼容性问题&#xff0c;以及权限松散导致的安全问题。当前&#xff0c;玲珑已支持 4 个发行版&#xff0c;包括 deepin、统信 UOS 以及 Debian 和…

golang 中的复合类型

前言 所有的api文档都可以使用bash命令 go doc 查看文档的帮助信息 从 Go 1.13 开始&#xff0c;godoc 不再随 Go 发行版一起安装&#xff0c;你需要单独安装它。 需要单独安装 1. go install golang.org/x/tools/cmd/godoclatest 2执行命令 godoc -http:1111 打开浏览器 http:…

java之基础2笔记

1 类型转换 1.1 自动类型转换&#xff08;隐式类型转换&#xff09; 从小的数据类型到大的数据类型的转换&#xff08;如 int 到 long&#xff09;。 从低精度的数据类型到高精度的数据类型的转换&#xff08;如 float 到 double&#xff09;。 1.2 强制类型转换&#xff0…

儿童护眼灯哪个好?带你了解适合儿童的护眼灯款式分享

儿童护眼灯哪个好&#xff1f;作为我们日常生活中极为实用的小家电&#xff0c;为了确保使用台灯时的舒适性并且保护视力&#xff0c;选择一款专业的护眼台灯成为了一个明智的决定。这样的台灯能够提供更舒适、均匀的照明环境&#xff0c;那么到底儿童护眼灯哪个好你&#xff1…

实现手机空号过滤或手机号码有效性验证

手机空号过滤或手机号码有效性验证通常涉及使用专门的API接口来查询手机号码的状态。这些API接口通常由第三方服务提供商提供&#xff0c;它们会与电信运营商合作或利用自己的数据库来验证手机号码是否真实存在、是否已被分配、是否处于空号状态等。 以下是一些步骤和考虑因素…

爬虫——有道云翻译

废话不多说直接上代码 固定文本内容 import timefrom selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWai…

Day 41 NGINX详解

Nginx详解 一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 1、HTTP 工作原理 HTTP协议通信流程 WEB Server&…

超维小课堂 | 6、MAVROS与机载电脑Jetson nano通信

MAVROS与机载电脑Jetson nano通信 ROS系统镜像——Jetson nano b01 4G 链接: 百度云镜像链接 链接&#xff1a;https://pan.baidu.com/s/1NoIEvVdsiYLPvVOWM98hjQ 提取码&#xff1a;cwkj 简介&#xff1a;MAVROS和Jetson nano通信&#xff0c;设置飞控参数和MAVROS文件&am…

程序猿大战Python——了解Python

了解Python 编程语言的发展 目标&#xff1a;了解编程语言。 我们知道&#xff0c;咱们的日常沟通交流使用的语言&#xff1a;普通话。 那什么是编程语言呢&#xff1f; 【官方解释】编程语言是用来定义程序的语言形式&#xff0c;也就是说&#xff0c;我们可以通过编程语言…

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的&#xff0c;点击选择 输入密码 然后就ok了 ✅ 总结 只能说&#xff1a;玄学&#xff01;

剪画小程序:自媒体必备神器:【视频翻译】自动识别语言、翻译、配音,让外语视频秒变母语!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 今天给大家带来一款敲实用的视频翻译工具一一 小程序【剪画】 我们有很小伙伴在学习他国语言时&#xff0c;最大的障碍就是语言的问题了&#xff0c;想要 理解其中的内容&#xff0c;在这之前要下很大的功夫去掌握…

创业新风口:智能售货机的崛起

随着科技的飞速发展&#xff0c;智能售货机已经不再是简单的自动贩卖机&#xff0c;它们变得更加智能、灵活&#xff0c;能够适应各种场景需求&#xff0c;从传统的饮料、零食到新鲜水果、便当、甚至是电子产品&#xff0c;无所不包。这种24小时无人值守的商业模式&#xff0c;…

居民社区团购小程序源码系统 拼团管理+团长管理功能 带完整的安装代拿代码包以及搭建教程

系统概述 居民社区团购小程序源码系统是一款专为社区团购打造的一站式解决方案。它整合了拼团管理和团长管理等核心功能&#xff0c;能够帮助企业和创业者快速搭建自己的社区团购平台&#xff0c;实现高效运营和便捷管理。 代码示例 系统特色功能 1.拼团管理&#xff1a;支持…

工业互联网基本概念及关键技术(295页PPT)

资料介绍&#xff1a; 工业互联网的核心是通过工业互联网平台把设备、生产线、工厂、供应商、产品和客户紧密地连接融合起来。这种连接能够形成跨设备、跨系统、跨厂区、跨地区的互联互通&#xff0c;从而提高效率&#xff0c;推动整个制造服务体系智能化。同时&#xff0c;工…

Java环境配置(超详细)

Java环境配置&#xff08;超详细&#xff09; 引言1、安装 JDK1.1、下载安装JDK1.2、配置环境变量&#xff1a;JAVA_HOME1.3、将JAVA_HOME添加到Path中 2、安装 Maven2.1、下载安装Maven2.2、配置maven的环境变量: M2_HOME2.3、将Maven变量添加到Path中 引言 Java开发环境的配…

PyTorch 相关知识介绍

一、PyTorch和TensorFlow 1、PyTorch PyTorch是由Facebook开发的开源深度学习框架&#xff0c;它在动态图和易用性方面表现出色。它以Python为基础&#xff0c;并提供了丰富的工具和接口&#xff0c;使得构建和训练神经网络变得简单快捷。 发展历史和背景 PyTorch 是由 Fac…

创建采购订单免费行项目,注意事项

1.我在使用bapi&#xff08;BAPI_PO_CREATE1&#xff09;创建采购订单免费行项目的时候&#xff0c;还是报错了请输入净价格。 解决方式&#xff1a;把这些数据都赋值好&#xff0c;那么你的采购订单行项目就是免费项目。 BAPIMEPOITEM-IR_IND 空 &#xff08;发票收据标识&am…

文件传输新体验,这些中转站工具让你的职场生活更轻松

不知道大家有没有体验过华为手机的中转站功能&#xff0c;可以一键抓取图片或文件&#xff0c;暂时放在中转站中然后可以再拖到指定文件夹中。 华为手机的中转站功能&#xff0c;以其独特的跨应用文件传输能力&#xff0c;为用户带来了极大的便利。无论是图片、视频还是文档&am…