opencv连通域标记 connectedComponentsWithStats()函数

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

1.背景
由于需要将图像中的目标提取出来,采用了先分割得到二值化图,然后再进行连通域统计找到最大的连通域,计算其外接矩形作为目标框的方法。
2.函数定义
通过搜索,发现在OpenCV 3中提供了连通域标记相关的两个很好的函数,分别是

cv::connectedComponents() 和cv::connectedComponentsWithStats(),在OpenCV 2中没有这两个函数。
2.1 connectedComponents()
仅仅创建了一个标记图(图中不同连通域使用不同的标记,和原图宽高一致);
调用格式为:

int cv::connectedComponents (
    cv::InputArrayn image, // input 8-bit single-channel (binary)
    cv::OutputArray labels, // output label map
    int connectivity = 8, // 4- or 8-connected components
    int ltype = CV_32S // Output label type (CV_32S or CV_16U)
);

2.2 connectedComponentsWithStats()
也可以完成上面任务,除此之外,还可以返回每个连通区域的重要信息-- bounding box, area, and center of mass( centroid)。函数返回值为连通区域的总数N,范围为[0,N-1],其中0代表背景
调用格式为:

int cv::connectedComponentsWithStats (
    cv::InputArrayn image, // input 8-bit single-channel (binary)
    cv::OutputArray labels, // output label map
    cv::OutputArray stats, // Nx5 matrix (CV_32S) of statistics:
    // [x0, y0, width0, height0, area0;
    // ... ; x(N-1), y(N-1), width(N-1),
    // height(N-1), area(N-1)]
    cv::OutputArray centroids, // Nx2 CV_64F matrix of centroids:
    // [ cx0, cy0; ... ; cx(N-1), cy(N-1)]
    int connectivity = 8, // 4- or 8-connected components
    int ltype = CV_32S // Output label type (CV_32S or CV_16U)
);

参数介绍如下:
左侧返回值
num_labels:所有连通域的数目,注:第0个代表背景
右侧输入参数
image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的左上角坐标x、y,以及外接矩形的宽高width、height和面积area,
centroids:连通域的中心点
connectivity:可选值为4或8,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 返回值:

其中, stats包含了标签为i的连通域的一些信息,可以如下访问标签为i的连通域的面积

stats.at<int>(i, CC_STAT_AREA)

访问外接矩形的参数:

//矩形左上角x
x = stats.at<int>(max_idx, cv::CC_STAT_LEFT);
//矩形左上角y
y = stats.at<int>(max_idx, cv::CC_STAT_TOP);
//矩形高
h = stats.at<int>(max_idx, cv::CC_STAT_HEIGHT);
//矩形宽
w = stats.at<int>(max_idx, cv::CC_STAT_WIDTH);

3.过程
一开始再手机上查到这个函数,使用了索引0,结果直接把全图给框住了,后来仔细看了函数的定义,选择1,把除了背景以外的最大值给圈出来了。

Mat img = imread("F:\\C++_Project\\1.jpg",0);
Mat labels, stats, centroids,BW;
//对于OpenCV来说,白色代表有数据,黑色代表没有数据,所以图像输入之前要转换成”黑底白图“
threshold(img, BW, 11, 255, THRESH_BINARY);
int nccomps = connectedComponentsWithStats(BW, labels, stats, centroids);
int max_area=0, max_idx=0;
//找到最大的连通域区域和索引
for (int i = 1; i < stats.rows; i++)
{
	if (stats.at<int>(i, cv::CC_STAT_AREA)>max_area)
	{
		max_area = stats.at<int>(i, cv::CC_STAT_AREA);
		max_idx = i;
	}
}
//提取最大区域的外接矩形参数
int x0, y0, w, h, x1, y1;
x0 = stats.at<int>(max_idx, cv::CC_STAT_LEFT);
y0 = stats.at<int>(max_idx, cv::CC_STAT_TOP);
h = stats.at<int>(max_idx, cv::CC_STAT_HEIGHT);
w = stats.at<int>(max_idx, cv::CC_STAT_WIDTH);
//标记矩形
cv::Rect rect(x0, y0, w, h);
cv::rectangle(img, rect, cv::Scalar::all(int(255)), 1);
cv::imshow("BW img", img);
cv::waitKey(0);
return 0;

4.小结
一个小问题,但由于没有理清函数定义和用法,就直接用了,导致查bug花了不少时间。以后遇到一个新的函数时,应该先看定义,输入、输出的含义,再应用。
————————————————
参考:1.CSDN博主「i_chaoren」
2.CSDN博主「NCUTer」文章来源地址https://www.toymoban.com/news/detail-602017.html

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

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

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

相关文章

  • OpenCV16-图像连通域分析

    连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域。连通域分析是指在图像中寻找彼此互相独立的连通域并将其标记出来。 4邻域与8邻域的概念:点 P 0 ( x , y ) P_0(x,y) P 0 ​ ( x , y ) 的4邻域为其上下左右4个像素点,其8邻域为上下左右再加上对角线方向的4个点。

    2024年02月06日
    浏览(31)
  • opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

    本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代

    2024年02月04日
    浏览(54)
  • 10---OpenCV:图像进阶操作之连通区域分析

    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来 。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别

    2024年02月16日
    浏览(35)
  • Opencv 基本操作五 各种连通域处理方法

    在深度学习中,尤其是语义分割模型部署的结果后处理中,离不开各类形态学处理方法,其中以连通域处理为主;同时在一些传统的图像处理算法中,也需要一些形态学、连通域处理方法。为此,整理了一些常用的连通域处理函数:查找图像中最大的连通域、删除图像中小面

    2024年02月02日
    浏览(38)
  • c++ opencv将彩色图像按连通域区分

    要将彩色图像按连通域区分,您可以使用 OpenCV 中的  cv::connectedComponents  函数。 下面是一个简单的示例代码,说明如何使用  cv::connectedComponents  函数来检测并标记图像中的连通域: 这段代码首先读取彩色图像,然后将其转换为灰度图像。接下来,使用  cv::threshold  函数将

    2024年02月10日
    浏览(36)
  • OPENCV C++(四)形态学操作+连通域统计

    第一个是形状 第二个是卷积核大小 tips:这些都是针对于二值化图像操作的 单独的也有 例如腐蚀函数 这个-1 -1是默认的 不变 2是做两次腐蚀的意思 先定义返回的值 stats :记录了每个连通区域的信息,是一个5列的矩阵,每一行对应一个连通区域,分别为连通区域外接矩形的

    2024年02月14日
    浏览(30)
  • [C++]使用OpenCV去除面积较小的连通域

    这是后期补充的部分,和前期的代码不太一样 效果图 源代码 前期做的,方法可能不太一样 一,先看效果图 原图 处理前后图   二,实现源代码      

    2024年04月10日
    浏览(33)
  • OpenCV 笔记(6):像素间的基本关系——邻域、邻接、通路、连通、距离

    像素是图像的基本元素,像素与像素之间存在着某些联系,理解像素间的基本关系是数字图像处理的基础。常见的像素间的基本关系包括:邻域、邻接、通路、连通、距离。 邻域表示了像素之间的连接关系。 像素(x,y)的 邻域 ,是指与像素(x,y)对应的点的集合{(x+p,y+q)} ,其中

    2024年02月04日
    浏览(32)
  • OpenCV 通过计算连通域面积过滤面积小的区域–Python

    代码参考:https://blog.csdn.net/u014264373/article/details/119486850 通过卷积神经网络预测图像的分割结果时,会发现分割外部出现了小面积的连通域。 常识告诉我们,这么小的物体一定不是我们的分割目标,因此,我们通过后处理的方法把它过滤掉,可以提高分割准确度。 这种小面积

    2024年02月08日
    浏览(45)
  • 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测面部标记

    3、我们将看一些将面部标记检测应用于图像的结果。 什么是面部标记? =================================================================== 人脸标记点检测是形状预测问题的一个子集。给定一个输入图像(通常是一个指定感兴趣对象的ROI),形状预测器尝试沿形状定位感兴趣的关键点。 在

    2024年04月13日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包