OpenCV16-图像连通域分析

news2025/1/12 19:08:13

OpenCV16-图像连通域分析

    • 1.图像连通域分析
    • 2.connectedComponents
    • 3.connectedComponentsWithStatus


1.图像连通域分析

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

4邻域与8邻域的概念:点 P 0 ( x , y ) P_0(x,y) P0(x,y) 的4邻域为其上下左右4个像素点,其8邻域为上下左右再加上对角线方向的4个点。

根据两个像素相邻定义方式不同,得到的连通区域也不相同,因此,在分析连通域的同时,一定要声明是在哪种邻域条件下分析得到的结果。

2.connectedComponents

OpenCV提供了用于提取图像中不同连通域的 connectedComponent() 函数:

int connectedComponents(
    InputArray image, 
    OutputArray labels, // 标记不同连通域后的输出图像
    int connectivity,   // 标记连通域时使用的邻域种类,4表示4邻域
    int ltype,   // 输出图像数据类型:CV_32S、CV_16U
    int ccltype  // 标记连通域时使用的算法类型
);

int connectedComponents(
    InputArray image, 
    OutputArray labels,
    int connectivity = 8, 
    int ltype = CV_32S
);

enum ConnectedComponentsAlgorithmsTypes {
    CCL_DEFAULT   = -1, // 8邻域使用SAUF、4邻域使用SAUF
    CCL_WU        = 0,  // 8邻域使用BBDT、4邻域使用SAUF
    CCL_GRANA     = 1,  // 8邻域使用BBDT、4邻域使用SAUF
    CCL_BOLELLI   = 2, 
    CCL_SAUF      = 3,  
    CCL_BBDT      = 4, 
    CCL_SPAGHETTI = 5, 
};

该函数用于计算二值图像中连通域的个数,并在图像中不同的连通域用不同的数字标签标记,其中标签0表示图像中的背景色。函数返回图像中连通域的数目。

示例代码:

3.connectedComponentsWithStatus

虽然 connectedComponents() 函数可以实现图像中多个连通域的统计,但是只能通过标签将图像中的不同连通域分开,无法得到更多的统计信息。有时,我们希望得到每个连通域中心位置或者在图像中标记出连通域所在的矩形区域, connectedComponents 便无法完成这个任务。

OpenCV中提供了 connectedComponentsWithStatus()函数用于在标记出图像中不同连通域的同时统计连通域的位置、面积的信息:

int connectedComponentsWithStats(
    InputArray image, 
    OutputArray labels, // 标记不同连通域后的输出图像
    OutputArray stats,  // 含有不同连通域统计信息的矩阵,CV_32S。矩阵第i行是标签为i的连通域的统计信息。
    OutputArray centroids, // 每个连通域质心坐标,CV_64F
    int connectivity, // 邻域种类
    int ltype,        // 输出图像数据类型
    int ccltype       // 标记连通域使用算法标志,同connectedComponents函数参数
);

int connectedComponentsWithStats(
    InputArray image, 
    OutputArray labels,
    OutputArray stats, 
    OutputArray centroids,
    int connectivity = 8, 
    int ltype = CV_32S
);

第三个参数为每个连通域统计信息矩阵:

enum ConnectedComponentsTypes {
    CC_STAT_LEFT   = 0, // 连通域内最左侧像素的x坐标,它是水平方向上的包含连通域边界框的开始
    CC_STAT_TOP    = 1, // 连通域内最上方像素的y坐标,它是垂直方向上的包含连通域边界框的开始
    CC_STAT_WIDTH  = 2, // 宽
    CC_STAT_HEIGHT = 3, // 高
    CC_STAT_AREA   = 4, // 连通域面积
#ifndef CV_DOXYGEN
    CC_STAT_MAX    = 5  // 统计信息种类数目,无实际含义
#endif
};

使用:stats.at<int>(i, CC_STAT_WIDTH)

第四个参数为每个连通域的质心坐标,使用:centroids.at<double>(i, 0)取得x坐标,centroids.at<double>(i, 1)取得y坐标。

示例代码:

#include <opencv2\opencv.hpp>
#include <opencv2/core/utils/logger.hpp> // debug no log

using namespace cv;
using namespace std;

int main()
{
	cout << "OpenCV Version: " << CV_VERSION << endl;
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);

	//对图像进行距离变换
	Mat img = imread("rice.png");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	imshow("原图", img);
	Mat rice, riceBW;

	//将图像转成二值图像,用于统计连通域
	cvtColor(img, rice, COLOR_BGR2GRAY);
	threshold(rice, riceBW, 50, 255, THRESH_BINARY);

	//生成随机颜色,用于区分不同连通域
	RNG rng(10086);
	Mat out, stats, centroids;
	//统计图像中连通域的个数
	int number = connectedComponentsWithStats(riceBW, out, stats, centroids, 8, CV_16U);
	vector<Vec3b> colors;
	for (int i = 0; i < number; i++)
	{
		//使用均匀分布的随机数确定颜色
		Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
		colors.push_back(vec3);
	}

	//以不同颜色标记出不同的连通域
	Mat result = Mat::zeros(rice.size(), img.type());
	int w = result.cols;
	int h = result.rows;
	for (int i = 1; i < number; i++)
	{
		// 中心位置
		int center_x = centroids.at<double>(i, 0);
		int center_y = centroids.at<double>(i, 1);
		//矩形边框
		int x = stats.at<int>(i, CC_STAT_LEFT);
		int y = stats.at<int>(i, CC_STAT_TOP);
		int w = stats.at<int>(i, CC_STAT_WIDTH);
		int h = stats.at<int>(i, CC_STAT_HEIGHT);
		int area = stats.at<int>(i, CC_STAT_AREA);

		// 中心位置绘制
		circle(img, Point(center_x, center_y), 2, Scalar(0, 255, 0), 2, 8, 0);
		// 外接矩形
		Rect rect(x, y, w, h);
		rectangle(img, rect, colors[i], 1, 8, 0);
		putText(img, format("%d", i), Point(center_x, center_y),
			FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1);
		cout << "number: " << i << "\tarea: " << area << endl;
	}
	//显示结果
	imshow("标记后的图像", img);

	waitKey(0);
	return 0;
}

在这里插入图片描述

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

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

相关文章

TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序

概述&#xff1a;TatukGIS Developer Kernel&#xff08;DK&#xff09;是一个用于开发自定义地理信息系统&#xff08;GIS&#xff09;应用程序以及解决方案的综合性软件开发工具包&#xff08;SDK&#xff09;。本篇文章主要介绍用DK11为FMX创建一个应用程序&#xff0c;现在…

solidworks 2024新功能之--保存为低版本 硕迪科技

大家期盼已久的SOLIDWORKS保存低版本文件功能来了&#xff0c;从SOLIDWORKS 2024 开始&#xff0c;您可以将在最新版本的SOLIDWORKS 中创建的SOLIDWORKS零件、装配体和工程图另存为SOLIDWORKS 早期版本的全功能文档&#xff08;完成的特征树与相关参数&#xff09;。 将文件另…

Spring Boot项目中使用 TrueLicense 生成和验证License

1、Linux 在客户linux上新建layman目录&#xff0c;导入license.sh文件&#xff0c; [rootlocalhost layman]# mkdir -p /laymanlicense.sh文件内容&#xff1a; #!/bin/bash # 1.获取要监控的本地服务器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {p…

Kubernetes简略架构

kubectl kubectl是Kubernetes的命令行工具。它的全称为Kubernetes Command Line Tool&#xff0c;是用于管理Kubernetes集群的工具。它可以用来创建、更新、删除资源对象、查看日志等操作 Node: Kubernetes 通过将容器放入在节点&#xff08;Node&#xff09;上运行的Pod 中…

5、使用 pgAdmin4 图形化创建和管理 PostgreSQL 数据库

通过上几篇文章我们讲解了如何安装 PostgreSQL 数据库软件和 pgAdmin4 图形化管理工具。 今天我们继续学习如何通过 pgAdmin4 管理工具图形化创建和管理 PostgreSQL 数据库。 一、PostgreSQL的基本工作方式 在学习如何使用PostgreSQL创建数据库之前&#xff0c;我们需要了解一…

C++学习: 文件I/O

作者: 苏丙榅 原文链接: https://subingwen.cn/c/file/ 文章目录 1. 文件概述1.1 什么是文件I/O1.2 磁盘文件分类 2. 文件的打开和关闭2.1 文件指针2.2 打开文件 2.3 关闭文件3. 文件的读写3.1 按照字符读写文件3.1.1 写文件3.1.2 读文件3.1.3 EOF 3.2 按照行读写文件3.2.1 写文…

华为交换机S5700系列产品命名规则

华为交换机的全系列产品命名规则如下&#xff1a; S系列&#xff1a;代表固定端口交换机。例如&#xff0c;S5720系列、S6720系列。CE系列&#xff1a;代表企业级交换机。例如&#xff0c;CE5800系列、CE6800系列。CloudEngine系列&#xff1a;代表华为云引擎交换机&#xff0c…

数据库系列之MySQL中Join语句优化问题

最近使用MySQL 8.0.25版本时候遇到一个SQL问题&#xff0c;两张表做等值Join操作执行很慢&#xff0c;当对Join连接字段添加索引优化后&#xff0c;执行效率反而变得更差&#xff0c;其中的原因值得分析。因此本文介绍下MySQL中常见的Join算法&#xff0c;并对比使用不同Join算…

【MATLAB源码-第47期】基于matlab的GMSK调制解调仿真,输出误码率曲线,采用相干解调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 GMSK&#xff08;高斯最小移相键控&#xff09;是数字调制技术的一种。下面是关于GMSK调制解调、应用场景以及其优缺点的详细描述&#xff1a; 1. 调制解调&#xff1a; - 调制&#xff1a;GMSK是一种连续相位调制技术&am…

03【彻底掌握Git的底层对象】

上一篇&#xff1a;02【Git的基本使用-快速上手Git】 下一篇&#xff1a;04【彻底掌握Git的底层对象】 目录&#xff1a;【Git系列教程-目录大纲】 文章目录 三、Git底层对象3.1 Blob对象3.1.1 Blob对象简介3.1.2 Blob对象的使用1&#xff09;写入数据2&#xff09;读取数据3…

Excel大量表格选择,快速定位表格

excel有大量表格&#xff0c;快速定位表格方法。 在这个区域电机鼠标右键 出现表格选择。&#xff08;此处方便查看15个表格&#xff09;&#xff0c;如果超过15个表格可以选择其他工资表。 选择其他工作表会弹出列表框如下图 特此记录 anlog 2023年10月12日

红队专题-从零开始VC++远程控制软件RAT-C/S-[4]客户端与服务端连接

红队专题 招募六边形战士队员服务端编写新建工程server函数创建主线程类获取配置信息command 命令startsocket 开始监听win32 类库/头文件 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 服务端编写 新建工程 server函数 // FackExec_…

Windows10用Navicat 定时备份报错80070057

直接按照网上的教程配置定时任务发现报错&#xff0c;提示参数非法之类的&#xff0c;80070057。 搜索加自己测试发现是用户权限问题。 设置任务计划的时候&#xff0c;我用了用户组&#xff0c;选了administors&#xff0c;在勾选上run with hightest privileges。 查找用户…

JVM第七讲:JVM 基础 - Java 内存模型详解

JVM 基础 - Java 内存模型详解 本文是JVM第七讲&#xff0c;JVM 基础 - Java 内存模型详解。主要转载自 Info 上深入理解Java内存模型, 作者程晓明。这篇文章对JMM讲的很清楚了&#xff0c;大致分三部分&#xff1a;1、重排序与顺序一致性&#xff1b;2、三个同步原语&#xff…

数据结构复盘——第二章:线性表

文章目录 第一部分:顺序表1、顺序表的定义2、顺序表的操作3、顺序表的优缺点第一部分习题第二部分:单链表1、单链表的定义2、单链表的结点知识3、单链表的操作4、单链表的优缺点第二部分习题第三部分:双链表1、双链表的结构2、双链表的操作第三部分习题第四部分:静态链表1、…

使用 Tkinter Canvas 小部件添加放大镜功能?

一、说明 据我所知&#xff0c;内置的 Tkinter Canvas 类比例不会自动缩放图像。如果您无法使用自定义小部件&#xff0c;则可以缩放原始图像并在调用缩放函数时将其替换在画布上。 二、实现图像放大镜技术细节 我如何将放大和缩小添加到以下脚本中&#xff0c;我想将其绑定到…

OpenCV 笔记(1):图像的读取、显示、创建

Part11. 数字图像的含义 OpenCV 中的图像&#xff0c;其实指的是数字图像。在介绍图像这个概念之前&#xff0c;先介绍几个基础的概念&#xff1a; 像素(Pixel)是图像的基本单元或者基本元素&#xff0c;亦或者是图像最小的单位。图像中的像素点包含不同的像素值。对于灰白图像…

Flume 整合 Kafka

1.背景 先说一下&#xff0c;为什么要使用 Flume Kafka&#xff1f; 以实时流处理项目为例&#xff0c;由于采集的数据量可能存在峰值和峰谷&#xff0c;假设是一个电商项目&#xff0c;那么峰值通常出现在秒杀时&#xff0c;这时如果直接将 Flume 聚合后的数据输入到 Storm 等…

Vue-props配置功能

Vue-props配置功能 props概述 功能&#xff1a;接收从其他组件传过来的数据&#xff0c;将数据从静态转为动态注意&#xff1a; 同一层组件不能使用props&#xff0c;必须是父组件传子组件的形式。父组件传数据&#xff0c;子组件接收数据。不能什么数据都接收&#xff0c;可…

【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念 关于微服务网关Gateway中有几十种过滤工厂&#xff0c;这一篇博文记录的是关于请求限流过滤工厂&#xff0c;也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理&#xff0c;如果不会被处理就会返回HTTP状态码为42…