opencv [c++] 连通域分析connectedComponentsWithStats() 和 connectedComponents()
1. API相关参数介绍:
labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3。。。的标签,同一个连通域的像素打上同样的标签。相当与对每一个像素进行了分类(分割)
int cv::connectedComponents (cv::InputArrayn image, // input 8-bit single-channel (binary)cv::OutputArray labels, // output label mapint connectivity = 8, // 4- or 8-connected componentsint ltype = CV_32S // Output label type (CV_32S or CV_16U)
);int cv::connectedComponentsWithStats (cv::InputArrayn image, // input 8-bit single-channel (binary)cv::OutputArray labels, // output label mapcv::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 componentsint ltype = CV_32S // Output label type (CV_32S or CV_16U)
);
参数介绍如下:
image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
connectivity:可选值为4或8,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 返回值:
返回值:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字1、2、3…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805
centroids:连通域的中心点
2.设置连通域 connectedComponentsWithStats()
cv::Mat src_img, img_bool, labels, stats, centroids, img_color, img_gray;int main()
{Mat src_img = imread("1.png", 0);threshold(src_img, img_bool, 75, 255, THRESH_BINARY);//连通域计算int n = cv::connectedComponentsWithStats(img_bool, //二值图像labels, //和原图一样大的标记图stats, //nccomps×5的矩阵 表示每个连通区域的外接矩形和面积(pixel)centroids //nccomps×2的矩阵 表示每个连通区域的质心);//显示原图统计结果char title[1024];sprintf_s(title, "原图中连通区域数:%d\n", n);cv::String num_connect(title);imshow(num_connect, img_bool);//去除过小区域,初始化颜色表vector<cv::Vec3b> colors(n);colors[0] = cv::Vec3b(0, 0, 0); // background pixels remain black.for (int i = 1; i < n; i++) {colors[i] = cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);//去除面积小于100的连通域if (stats.at<int>(i, cv::CC_STAT_AREA) < 800)colors[i] = cv::Vec3b(0, 0, 0); // small regions are painted with black too.}//按照label值,对不同的连通域进行着色img_color = cv::Mat::zeros(src_img.size(), CV_8UC3);for (int y = 0; y < img_color.rows; y++)for (int x = 0; x < img_color.cols; x++){int label = labels.at<int>(y, x);CV_Assert(0 <= label && label <= n);img_color.at<cv::Vec3b>(y, x) = colors[label];}//统计降噪后的连通区域cvtColor(img_color, img_gray, cv::COLOR_BGR2GRAY);threshold(img_gray, img_gray, 1, 255, cv::THRESH_BINARY);n = cv::connectedComponentsWithStats(img_gray, labels, stats, centroids);sprintf_s(title, "过滤小目标后的连通区域数量:%d\n", n);num_connect = title;imshow(num_connect, img_color);waitKey(0);}
}
精简版【参考网上资料】:
#include<opencv2\opencv.hpp>
#include<algorithm>
#include<iostream>
using namespace std;
using namespace cv;
Mat src, src_color,g_src, labels, stats, centroids;
int g_threshold = 30;
void trackbar(int, void*);
int main() {src = imread("133.png", 0);namedWindow("src", 1);createTrackbar("threshold", "src", &g_threshold, 255, trackbar);imshow("src", src);threshold(src, g_src, 170, 255, THRESH_BINARY);imshow("d", g_src);int num = connectedComponentsWithStats(g_src, labels, stats, centroids);cout <<"轮廓数" << num << endl;vector<Vec3b> color(num + 1);color[0] = Vec3b(0, 0, 0);//背景色for (int m = 1; m <=num ; m++) {color[m] = Vec3b(rand() % 256, rand() % 256, rand() % 256);if (stats.at<int>(m - 1, CC_STAT_AREA) < 100)//连通域面积小于100的区域,将其当作背景color[m] = Vec3b(0, 0, 0);}src_color=Mat::zeros(src.size(), CV_8UC3);for (int x = 0; x < src.rows; x++)for (int y = 0; y < src.cols; y++){int label = labels.at<int>(x, y);//注意labels是int型,不是uchar.src_color.at<Vec3b>(x, y) = color[label];}imshow("labelMap", src_color);waitKey(0);
}
void trackbar(int, void*) {threshold(src, g_src, g_threshold, 255, THRESH_BINARY_INV);imshow("d", g_src);int num = connectedComponentsWithStats(g_src, labels, stats, centroids);cout << "轮廓数" << num << endl;vector<Vec3b> color(num + 1);color[0] = Vec3b(0, 0, 0);//背景色for (int m = 1; m <= num; m++) {color[m] = Vec3b(rand() % 256, rand() % 256, rand() % 256);//if (stats.at<int>(m - 1, CC_STAT_AREA) < 30)//color[m] = Vec3b(0, 0, 0);}src_color = Mat::zeros(src.size(), CV_8UC3);for (int x = 0; x < src.rows; x++)for (int y = 0; y < src.cols; y++){int label = labels.at<int>(x, y);//注意labels是int型,不是uchar.src_color.at<Vec3b>(x, y) = color[label];}imshow("labelMap", src_color);}
opencv [c++] 连通域分析connectedComponentsWithStats() 和 connectedComponents()相关推荐
- opencv 图像连通域分析
一.简介 图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来.提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌 ...
- OpenCV二值图像连通域分析
版权声明:本文为博主原创文章,可以随意共享转载,注明来源即可 https://blog.csdn.net/qq_37059483/article/details/78018539 通域分析对于图像处理 ...
- OpenCV——二值图像连通域分析
通域分析对于图像处理后面涉及到模式识别的内容来说是基础 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Region,Blob).连 ...
- 基于连通域字符分割的流程_基于OpenCV及连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...
- matlab 连通域分割,基于OpenCV.Net连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,(见 https://www.cnblogs.com/BoyTNT/p/11812323.html )但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不 ...
- python opencv 连通域_基于OpenCV及连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...
- 【OpenCV 4开发详解】图像连通域分析
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- OpenCV3学习(9.2)连通域分析函数详解connectedComponents()和connectedComponentsWithStats()
在OpenCV 3中提供了两个很好的函数,在OpenCV 2中没有. (1)connectedComponents() (2)connectedComponentsWithStats() 对应的官方文 ...
- cv2.error: opencv(4.4.0)_【OpenCV 4开发详解】图像连通域分析
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
最新文章
- 堆(heap)和栈(stack)有什么区别??
- php拓展板块 按需开启,php如何按需加载方式来增加程序的灵活度
- 应力循环次数60ant_中国航发:金属粉末循环使用导致的成分及打印件性能变化...
- 通过Erlang构建TCP服务器
- Hadoop部署方式-高可用集群部署(High Availability)
- “BindingNavigator”如何在删除前弹出确认框?
- 更改计算机用户名后无法共享文件夹,怎样使文件夹不被共享
- 微软官方解读 Win11 操作系统
- 21天jmeter打卡 day1
- WebSphere的管理员界面
- java 1.7图片压缩_appium+java(七)图片的放到及缩小操作
- oracle 常用语句汇总
- 机票三字码,对应城市及机场一览表
- RocketMQ实战2
- 可替代50欧姆_50欧姆阻抗四层板射频信号隔层参考做不了吗?
- 从键盘读入一个字符串,若遇到字母,则输出0;若遇到数字则输出1;否则不输出。例如:输入ab@12c,输出00110
- 怎么用python画花瓣_使用Python画一朵美丽的玫瑰花
- WORD文档打开文件时老提示发送错误报告,或者打印不全
- SDKS企业级区块链应用平台
- Linux开发工具整理
热门文章
- 关系代数运算详细解释
- 【机器学习】svm模型训练后的参数说明
- 工信部:加快 IPv6 部署,阿里云、腾讯云、UCloud等完成CDN的IPv6改造
- 2.凯撒密码加密解密(C)
- 电脑经常卡死的原因 电脑经常卡死怎么解决
- 我的世界手机版未能链接服务器,我的世界手机版服务器连接教程图文讲解
- oracle跨数据库复制数据表-dblink
- 德沃夏克布局与快蹄布局的手指负荷统计
- 都快2023年了,想从事Android车载开发的还没看过这些吗?
- 东莞第七高级中学2021高考成绩查询,在高级,遇见最好的自己 ——记东莞高级中学2020-2021学年开学典礼...