连通域与相距变换

news2024/9/24 13:17:35

1、连通域

   

//连通域
int test1()
{
	//对图像进行距离变换
	Mat img = imread("F:/testMap/rice.png");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat rice, riceBW;

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

	//生成随机颜色,用于区分不同连通域
	RNG rng(10086);
	Mat out;

	int number = connectedComponents(riceBW, out, 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 row = 0; row < h; row++)
		{
			for (int col = 0; col < w; col++)
			{
				int label = out.at<uint16_t>(row, col);
				if (label == 0)//背景的黑色不改变
				{
					continue;
				}
				result.at<Vec3b>(row, col) = colors[label];
			}
		}

		//显示结果
		imshow("原图", img);
		imshow("标记后的图像", result);
		cout << "接下来统计连通域信息" << endl;
		waitKey(0);

		Mat stats, centroids;

		number = connectedComponentsWithStats(riceBW, out, stats, centroids, 8, CV_16U);
		vector<Vec3b> colors_new;
		for (int i = 0; i < number; i++)
		{
			//使用均匀分布的随机数确定颜色
			Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
			colors_new.push_back(vec3);
		}

		//以不同颜色标记出不同的连通域
		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_new[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 << " , area: " << area << endl;
		}
		//显示结果
		imshow("标记后的图像", img);

		waitKey(0);
		return 0;
	}
}

1.1 连通域分割原理

1.2 连通域分割函数

 

 

2、相距变换

2.1 像素间距离

2.2 距离变换函数

 

//图像距离变换
int test2()
{
	//构建建议矩阵,用于求取像素之间的距离
	Mat a = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
		1, 1, 1, 1, 1,
		1, 1, 0, 1, 1,
		1, 1, 1, 1, 1,
		1, 1, 1, 1, 1);

	Mat dist_L1, dist_L2, dist_C, dist_L12;

	//计算街区距离
	distanceTransform(a, dist_L1, 1, 3, CV_8U);
	cout << "街区距离:" << endl << dist_L1 << endl;

	//计算欧式距离
	distanceTransform(a, dist_L2, 2, 5, CV_8U);
	cout << "欧式距离:" << endl << dist_L2 << endl;

	//计算棋盘距离
	distanceTransform(a, dist_C, 3, 5, CV_8U);
	cout << "棋盘距离:" << endl << dist_C << endl;

	cout << "对图像进行距离变换" << endl; waitKey(0);

	Mat rice = imread("F:/testMap/rice.png", IMREAD_GRAYSCALE);
	if (rice.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat riceBW, riceBW_INV;

	//将图像转成二值图像,同时把黑白区域颜色互换
	threshold(rice, riceBW, 50, 255, THRESH_BINARY);
	threshold(rice, riceBW_INV, 50, 255, THRESH_BINARY_INV);

	//距离变换
	Mat dist, dist_INV;
	distanceTransform(riceBW, dist, 1, 3, CV_32F);

	//为了显示清晰,将数据类型变成	CV_32F
	distanceTransform(riceBW_INV, dist_INV, 1, 3, CV_8U);

	//显示变换结果
	imshow("riceBW", riceBW);
	imshow("dist", dist);
	imshow("riceBW_INV", riceBW_INV);
	imshow("dist_INV", dist_INV);

	waitKey(0);
	return 0;
}

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

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

相关文章

王道考研数据结构第五章知识点

5.1.1 树的定义和基本术语 祖先节点&#xff1a;(对于你来说),父亲和爷爷都是祖先节点 子孙节点&#xff1a;对于父亲来说&#xff0c;父亲下面所有的节点都叫子孙节点 双亲节点(父节点)&#xff1a;一个节点的直接前驱就是它的父节点 兄弟节点&#xff1a;例如二叔&#xf…

MYSQL定义及操作

1、显示所有职工的基本信息 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号 3、求出所有职工的人数 4、列出最高工和最低工资 5、列出职工的平均工资和总工资 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表 7、显示所有女职工的年龄…

jvm新生代调优

5-4 新生代调优 只有排除了自己代码的问题后&#xff0c;再进行内存调优&#xff0c;内存调优都是从新生代开始&#xff0c;因为新生代优化空间更大一些 新生代的特点 所有的new操作分配内存都是非常廉价的&#xff0c;非常快 TLAB&#xff1a;thread-local allocation buf…

go-zero微服务实战——服务构建

目录介绍 接上一节go-zero微服务实战——基本环境搭建。搭建好了微服务的基本环境&#xff0c;开始构建整个微服务体系了&#xff0c;将其他服务也搭建起来。 order的目录结构&#xff0c;如下 根目录 api服务rpc服务自定义逻辑层logic自定义参数层models自定义工具层util …

RAR Extractor Max - Unzip for Mac(简单易用的压缩软件)

RAR Extractor Max是一个软件应用程序&#xff0c;旨在从RAR档案中提取文件。RAR是一个流行的归档文件解压软件&#xff0c;广泛用于压缩和归档文件。RAR Extractor Max是专门为处理RAR文件而设计的&#xff0c;对于任何经常处理这种文件格式的人来说&#xff0c;这是一个有用的…

【运维工程师学习四】Web服务之Apache

【运维工程师学习四】Web服务之Apache 1、查询、安装apacherpm命令使用 2、验证httpd是否启动成功&#xff08;1&#xff09;、查看是否有httpd的进程&#xff08;2&#xff09;、查看是否有80端口在监听中&#xff08;3&#xff09;、CentOS7默认不带netstat命令&#xff0c;通…

自定义TagViewGroup

来看看如何实现最最基本的TagGroupView&#xff0c;该视图作为ViewGroup的作用是实现其中的子视图的自动换行&#xff0c;保证子视图能够按照在xml中传入的顺序来相对合理地显示到界面上。 注意&#xff1a;其实在Android技术已经非常完善的当下&#xff0c;其实我们已经不怎么…

【k8s】k8s的yaml文件解释,如何部署一个java.jar包

前言&#xff1a; k8s的yaml文件解释&#xff0c;如何部署一个java,jar包 YAML语法格式&#xff1a; 大小写敏感&#xff1b;使用缩进表示层级关系&#xff1b;不支持Tab键制表符缩进&#xff0c;只使用空格缩进&#xff1b;缩进的空格数目不重要&#xff0c;只要相同层级的元…

Imx6ull linux 设备树

一 linux设备树简介 1.1 linux设备树 Linux设备树是一种用于描述硬件设备信息的数据结构&#xff0c;它在Linux内核中发挥着越来越重要的作用 在系统上电后&#xff0c;BootLoader会将设备树传递给Linux内核&#xff0c;内核根据识别的树信息展开为platform_device、spi_dev…

如何用爬虫实现GPT功能

如何用爬虫实现GPT功能&#xff1f; GPT&#xff08;Generative Pre-trained Transformer&#xff09;和爬虫是两个完全不同的概念和技术。GPT是一种基于Transformer模型的自然语言处理模型&#xff0c;用于生成文本&#xff0c;而爬虫是一种用于从互联网上收集数据的技术。 …

贝叶斯 A/B 测试解释与Python实现

一、说明 A / B测试在各个行业中有许多应用。从试图确定最佳市场群体到医疗药物测试&#xff0c;它具有各种应用&#xff0c;并允许企业根据结果做出决策。有两种常见的A/B检验方法&#xff0c;频率主义方法和贝叶斯方法&#xff0c;两者都是从假设检验的基础出发的。在本文中&…

819. 递归求阶乘

链接&#xff1a; 819.递归求阶乘 题目&#xff1a; 请使用递归的方式求 nn 的阶乘。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 nn 的阶乘的值。 数据范围 1≤n≤101≤n≤10 输入样例&#xff1a; 3输出样例&am…

【Linux】查看系统各种信息的常用命令 (CPU、内存、进程、网口、磁盘、硬件、等等)

Linux是一种开源的类Unix操作系统&#xff0c;它有很多不同的发行版&#xff0c;如Ubuntu、CentOS、Debian等。Linux系统提供了很多命令行工具&#xff0c;可以让用户方便地查看和管理系统的各种信息&#xff0c;如硬件配置、内存使用、进程状态、网络连接等。本文将介绍一些常…

解决IDEA项目external libraries依赖包消失的问题

有时候电脑重启后&#xff0c;再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况&#xff0c;只剩下了一个JDK的包 网上说可以通过刷新IDEA的缓存解决&#xff0c;但我试了没有效果&#xff0c;最后使用如下办法解决&#xff1a; 1.删除项目目录下的…

python接口自动化(二十五)--unittest断言——下(详解)

简介 本篇还是回归到我们最初始的话题&#xff0c;想必大家都忘记了&#xff0c;没关系看这里&#xff1a;传送门 没错最初的话题就是登录&#xff0c;由于博客园的登录机制改变了&#xff0c;本篇以我找到的开源免费的登录API为案例&#xff0c;结合 unittest 框架写 2 个用例…

MySQL原理探索——26 备库为什么会延迟好几个小时

在上一篇文章中&#xff0c;介绍了几种可能导致备库延迟的原因。你会发现&#xff0c;这些场景里&#xff0c;不论是偶发性的查询压力&#xff0c;还是备份&#xff0c;对备库延迟的影响一般是分钟级的&#xff0c;而且在备库恢复正常以后都能够追上来。 但是&#xff0c;如果备…

nvm的安装与使用5分钟极速上手

nvm的安装与使用5分钟极速上手 下载 nvm 并安装 nvm官网下载地址推荐下载 nvm-setup.zip 这一个&#xff0c;nvm-noinstall.zip下载之后不用安装&#xff0c;但是得自己配置setting.txt文件&#xff0c;以及环境变量&#xff0c;过于麻烦。nvm-setup.zip 会直接帮我们把环境变…

开篇(变量、运算符、进制)

一、Java简介 JDK&#xff08;JRE&#xff08;JVM & API&#xff09;、Java language&#xff08;tools & APIs&#xff09;&#xff09;&#xff1b;java源文件 → javac的编译 → class类&#xff08;会生成一个或多个class文件&#xff09;&#xff1b; * 使用 jav…

什么是Qt Widgets?一组创建经典桌面应用UI的界面组件!

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Qt Widgets模块提供…

QGIS 根据点位批量出图

背景 在工作中&#xff0c;当有大量项目点位需要结合地图介绍时&#xff0c;则需要批量截图。于是有了今天的教程。 一 工具及材料准备 QGIS 插件 QuickMapServices 点位集合 CSV文件 其他图层文件 二 导入图层 这里根据实际需要导入自己对应格式的就好。 图层-添加…