OpenCV16-图像连通域分析

这篇具有很好参考价值的文章主要介绍了OpenCV16-图像连通域分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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;
}

OpenCV16-图像连通域分析,OpenCV,C++,opencv,计算机视觉文章来源地址https://www.toymoban.com/news/detail-736211.html

到了这里,关于OpenCV16-图像连通域分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉传统图像处理库opencv的使用

    人工智能领域的图像处理分支,整理了计算机视觉传统图像处理库opencv的使用网址链接。 opencv使用范围,主要用在计算机视觉、视频分析、机器学习、医学影像处理、自动驾驶、工业检测、游戏开发上。 1):opencv效果视频 opencv10个应用场景 - 知乎 2):opencv介绍 AI必备技能

    2024年02月09日
    浏览(46)
  • 深度学习图像风格迁移 - opencv python 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习图像风格迁移 - opencv python 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/danche

    2024年02月04日
    浏览(58)
  • 计算机毕设 python opencv 机器视觉图像拼接算法

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月07日
    浏览(63)
  • 计算机竞赛 opencv python 深度学习垃圾图像分类系统

    🔥 优质竞赛项目系列,今天要分享的是 🚩 opencv python 深度学习垃圾分类系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/p

    2024年02月13日
    浏览(80)
  • 计算机视觉基础【OpenCV轻松入门】:获取图像的ROI

    OpenCV的基础是处理图像,而图像的基础是矩阵。 因此,如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作,从而更好地实现对图像的处理。 ROI(Region of Interest)是指图像或视频中被选取或感兴趣的特定区域。ROI可以用矩

    2024年02月22日
    浏览(41)
  • 《OpenCV 计算机视觉编程攻略》学习笔记(一:图像编程入门)

    参考引用 OpenCV 计算机视觉编程攻略(第3版) 说明 本书结合 C++ 和 OpenCV 3.2 全面讲解计算机视觉编程 所有代码均在 Ubuntu 系统中用 g++ 编译执行 0. 安装 OpenCV 库 在Ubuntu上安装OpenCV及使用 OpenCV 库分为多个模块 ,常见模块如下 opencv_core 模块包含库的核心功能 opencv_imgproc 模块包

    2024年02月09日
    浏览(52)
  • 计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于图像识别的人脸识别与疲劳检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月12日
    浏览(74)
  • Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

    【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程 CSDN标题里个括号对应视频的分P OpenCV+Python CSDN专栏 Gitee 项目地址 Python:3.11.5 Anaconda:23.7.4 IDE:vscode 运行环境:Windows OpenCV:4.8.1 Python+OpenCV 零基础学习笔记(1-3):anaconda+vscode+jupyter环境配置 本节课来了解以下OpenCV的简单使用

    2024年02月03日
    浏览(80)
  • OpenCV处理图像和计算机视觉任务时常见的算法和功能

    当涉及到OpenCV处理图像和计算机视觉任务时,有许多常见的具体算法和功能。以下是一些更具体的细分: 图像处理算法: 图像去噪 :包括均值去噪、高斯去噪、中值滤波等,用于减少图像中的噪声。 直方图均衡化 :用于增强图像的对比度,特别适用于低对比度图像。 边缘

    2024年02月11日
    浏览(43)
  • 计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 人脸性别年龄识别系统 - 图像识别 opencv 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https

    2024年02月10日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包