OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

OpenCV学习(二十一) :计算图像连通分量:connectedComponents(),connectedComponentsWithStats()

1、connectedComponents()函数

Connected Components即连通体算法用id标注图中每个连通体,将连通体中序号最小的顶点的id作为连通体的id。如果在图G中,任意2个顶点之间都存在路径,那么称G为连通图,否则称该图为非连通图,则其中的极大连通子图称为连通体,如下图所示,该图中有两个连通体:
在这里插入图片描述
计算二值图像中为图像的连通分量标注(标记)

int  cv::connectedComponents(
cv::InputArrayn image,                // 输入8位单通道(二进制)
cv::OutputArray labels,               // 输出标签图
int             connectivity = 8,     // 4-或8-连接组件
int             ltype        = CV_32S // 输出标签类型 (CV_32S or CV_16U));

2、connectedComponentsWithStats()函数

这是一个重载的成员函数,它与上述函数的不同之处在于它只接受什么参数。
注意0的区域标识的是background,而centroids则对应的是中心点,而label则对应于表示是当前像素是第几个轮廓

int  cv::connectedComponentsWithStats (
cv::InputArrayn image,                // 输入8位单通道(二进制)
cv::OutputArray labels,               // 输出标签地图
cv::OutputArray stats,                // 统计量的Nx5矩阵(CV_32S):分别对应各个轮廓的包围框的起始点坐标x,y,// 各个轮廓的包围框的 width,height和面积:// [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中心矩阵:// [ cx0, cy0; ... ; cx(N-1), cy(N-1)]
int             connectivity = 8,     // 4-或8-连接组件
int             ltype        = CV_32S // 输出标签类型 (CV_32S or CV_16U)
);

3、示例:

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src =imread("F:/C++/2. OPENCV 3.1.0/TEST/test5.PNG",1);if(!src.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }imshow( "image", src );// 转灰度Mat src_gray;cvtColor( src, src_gray, CV_BGR2GRAY );cv::Mat  img_edge, labels, img_color, stats,centroids;// 二值化cv::threshold(src_gray, img_edge, 125, 255, cv::THRESH_BINARY);cv::imshow("Image before threshold", img_edge);// 白色代表有数据,黑色代表没有数据,所以图像输入之前要转换成”黑底白图“bitwise_not(img_edge,img_edge);     // 该函数计算输入数组的逐元素逐位反转:cv::imshow("Image after threshold", img_edge);// 计算连通分量//  labels 输出标签图// stats Nx5矩阵(CV_32S): 分别对应各个轮廓的x,y,width,height和面积int nccomps = cv::connectedComponentsWithStats ( img_edge, labels, stats, centroids);cout << "检测到总连接组件: " << nccomps << endl;vector<cv::Vec3b> colors(nccomps+1);colors[0] = Vec3b(0,0,0);                    // 背景像素保持黑色。for( int i = 1; i < nccomps; i++ )         // 为每个标签设置颜色{colors[i] = Vec3b(rand()%256, rand()%256, rand()%256);if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 )      // 面积小于200 的colors[i] = Vec3b(0,0,0);                                   // 小区域也被涂成黑色}//img_color = Mat::zeros(src.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 <= nccomps);img_color.at<cv::Vec3b>(y, x) = colors[label];}cv::imshow("Labeled map", img_color);waitKey(0);return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:
1、看输出参数stats:Nx5矩阵(CV_32S),其中第1 2 6 个的面积小于200:
在这里插入图片描述
2、labels 标签图中:
在这里插入图片描述

4、通过findContours(),drawContours()函数计算连通量

在以前,常用的方法是”是先调用 cv::findContours() 函数(传入cv::RETR_CCOMP 标志),随后在得到的连通区域上循环调用 cv::drawContours() “
示例:

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;// 寻找最大的轮廓、按面积排序 函数
vector<vector<Point>> connection_sort(Mat src)
{vector<vector<Point>>contours;findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);//由于给大的区域着色会覆盖小的区域,所以首先进行排序操作//冒泡排序算法,由小到大排序vector<Point> vptmp;for(size_t i=1;i<contours.size();i++){for(size_t j=contours.size()-1;j>=i;j--){if (contourArea(contours[j]) < contourArea(contours[j-1])){vptmp = contours[j-1];contours[j-1] = contours[j];contours[j] = vptmp;}}}// 绘制 轮廓Mat draw = Mat::zeros(src.size(),CV_8UC3);for( int index = 0; index < contours.size(); index ++ ) // 绘制所有内外轮廓{Scalar color( rand()&255, rand()&255, rand()&255 );drawContours( draw, contours, index, color, 1, LINE_8 );    //CV_FILLED -1// 添加标记char text[100];sprintf(text, "%d", index+1);RotatedRect box = minAreaRect(contours.at(index)); // 获取中心putText(draw, text, box.center, FONT_HERSHEY_SIMPLEX, 0.5, cvScalar(0,0,255),1.5);}imshow("contours_sort_drawing",draw);return contours; // 返回排序后的 轮廓集
}//  寻找并绘制出彩色联通区域
vector<Point> FindBigestContour(Mat src,int& imax, int& imaxcontour)
{
//     imax = 0; //代表最大轮廓的序号
//     imaxcontour = -1; //代表最大轮廓的大小vector<vector<Point>>contours,contour_max;findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);for (int i=0;i<contours.size();i++)	// 遍历每个轮廓点集{int itmp = contourArea(contours[i]);// 计算每个轮廓点集面积if (imaxcontour < itmp ){imax = i;imaxcontour = itmp;}}// 显示 最大轮廓Mat draw = Mat::zeros(src.size(),CV_8UC3);drawContours( draw, contours, imax, Scalar(0,255,0), 1, LINE_8 );imshow( "Contours_Max", draw );return contours[imax];
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Mat src =imread("F:/C++/2. OPENCV 3.1.0/TEST/test3.PNG",1);if(!src.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }imshow( "image", src );// 转灰度Mat src_gray;cvtColor( src, src_gray, CV_BGR2GRAY );src_gray = src_gray >1;imshow( "src_gray", src_gray );// 获得 新排序后轮廓、显示vector<vector<Point>> contours_sort;contours_sort = connection_sort(src_gray);    // 绘制最大轮廓// 显示 最大轮廓int imax=0,imax_area=0;vector<vector<Point>>contour_max;contour_max.push_back( FindBigestContour(src_gray,imax,imax_area)); // 获得最大轮廓点集printf("  %d 轮廓为面积最大轮廓=%d (面积)",imax,imax_area);waitKey(0);return a.exec();
}

结果:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

github上只下载部分文件

有时候我们不想在github上下载整个压缩包&#xff0c;因为压缩包可能比较大&#xff0c;而我们只想要其中的代码文件&#xff0c;也就是只想下载部分文件&#xff0c;例如下面这个网页我们只想下载后缀名为py的文件&#xff0c;这可以通过tortoisesvn来完成 https://github.co…

【机器视觉】机器视觉产业链

来源&#xff1a;产业智能官机器视觉&#xff08;Machine Vision&#xff09;指的是通过光学的装置和非接触的传感器自动的接收和处理真实物体的图像&#xff0c;以获得所需信息或控制机器人运动的装置&#xff0c;通俗的说就是应用在工业领域的视觉应用。▲机器视觉系统组成另…

OpenCV学习笔记(十七):图像修补:inpaint()

OpenCV学习笔记&#xff08;十七&#xff09;&#xff1a;图像修补&#xff1a;inpaint() inpaint()函数 使用区域邻域在图像中还原选定区域。 void inpaint( InputArray src, // 表示要修复的图像,8位三通道或三通道 InputArray inpaintMask, // 表示修复模板(掩模)&a…

plt.errorbar画误差曲线

plt.errorbar(x, y, yerrNone, xerrNone, fmt, ecolorNone, elinewidthNone, capsizeNone, capthickNone ) 功能&#xff1a;画误差曲线&#xff0c;也可以用于画置信区间/标准差/方差参数&#xff1a;x&#xff1a;横坐标的值&#xff0c;y&#xff1a;纵坐标的值&#xff0c…

OpenCV学习(二十) :直方图匹配、对比:calcHist(),minMaxLoc(),compareHist()

直方图匹配、对比:calcHist ,minMaxLoc,compareHist1、calcHist()函数2、归一化&#xff1a;normalize()函数3、minMaxLoc()函数4、compareHist()函数5、示例一&#xff1a;H-S彩色图像的色调、饱和度二维直方图绘制6、示例二&#xff1a;灰度值一维直方图绘制7、示例三&#x…

Intel和IBM押重注的神经模态计算,会给行业带来什么样的变化

Intel发布的Pohoiki Beach加速卡&#xff0c;含有64块Loihi芯片来源&#xff1a; 半导体行业观察上周&#xff0c;Intel发布了基于其神经模态&#xff08;neuromorphic&#xff09;计算芯片Loihi的加速卡Pohoiki Beach&#xff0c;该加速卡包含了64块Loihi芯片&#xff0c;共含…

OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

OpenCV学习(二十二) &#xff1a;反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客&#xff1a; 反向投影backproject的直观理解 opencv 反向投影 颜色直方图的计算、显示、处理、对比及反向投影 一、概述 1、官方解释&#xff1a;反向投影是一种记录给定图像中的像…

美国正式宣告将在月球建立永久存在基地

来源&#xff1a;凤凰新闻央视网消息&#xff1a;7月20号是人类首次载人登陆月球50周年纪念日&#xff0c;美国公布了“阿尔忒弥斯计划”的官方标志图案&#xff0c;正式宣告将在月球建立永久存在基地。美国媒体直呼&#xff0c;美国要“占领”月球了。1969年&#xff0c;美国的…

一文看懂5G芯片背后的明争暗斗

来源&#xff1a;鲜枣课堂6月6日工信部正式发放5G商用牌照之后&#xff0c;国内5G网络建设的步伐大幅加快了。越来越多的城市出现了5G基站和5G信号&#xff0c;5G离我们的距离更近了。面对激动人心的5G&#xff0c;我们普通用户最关心的问题&#xff0c;当然是什么时候才能用上…

OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

OpenCV学习(二十三) &#xff1a;模板匹配:matchTemplate() 1、概述 模板匹配是一种最原始、最基本的模式识别方法&#xff0c;研究某一特定对象物的图案位于图像的什么地方&#xff0c;进而识别对象物&#xff0c;这就是一个匹配问题。 它是图像处理中最基本、最常用的匹配方…

CSS3实现图形曲线阴形和翘边阴影

首先&#xff0c;来看看完成之后的效果图&#xff1a; 实现原理 ①曲线阴影实现&#xff1a; 多个阴影重叠&#xff0c;就是正常阴影曲线阴影 正常情况下&#xff0c;有个矩形有正常的阴影&#xff0c;作为主投影&#xff0c;这时候再定义一个有一定弧度圆角的圆角矩形&#xf…

腾飞资本任溶 :互联网大脑,新的天方夜谭?—评《崛起的超级智能》

作者&#xff1a;任 溶 腾飞资本董事长&#xff0c;城市大脑创新合伙人基金管理合伙人因为我做科技产业投资工作&#xff0c;投资领域涉及互联网等新经济、新模式和新技术等&#xff0c;所以这几年总是听到一些言论&#xff0c;诸如“互联网已死”&#xff0c;或者“互联网红利…

OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

OpenCV学习(二十四 &#xff09;&#xff1a;角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客&#xff1a; Harris角点检测原理详解 Harris角点检测原理及C实现 OpenCV亚像素角点cornerSubPixel()源代码分析 Taylor公式&#xff08;泰勒公式&#x…

无人驾驶技术的7大典型应用场景

来源 | 数据观综合无人驾驶风口来临&#xff0c;引得各方资本竞相追逐。据业内预测&#xff0c;2019年到2020年无人驾驶L3&#xff08;条件自动&#xff09;级别的汽车将实现量产化&#xff0c;2022年后部分企业将实现L4&#xff08;高度自动&#xff09;量产&#xff0c;若要实…

数字图像处理学习笔记(一):特征检测和匹配概述

数字图像处理学习笔记&#xff08;一&#xff09;&#xff1a;特征检测和匹配概述 参考博客&#xff1a; 特征点的匹配SIFT特征详解数字图像处理学习笔记&#xff08;二&#xff09;&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09;算法 1、特征点概述 如何高效且…

数字图像处理学习笔记(二):SIFT(尺度不变特征变换)算法

数字图像处理学习笔记&#xff08;二&#xff09;&#xff1a;SIFT&#xff08;尺度不变特征变换&#xff09;算法 一、概述&#xff1a; 提到特征点算法&#xff0c;首先就是大名鼎鼎的SIFT算法了。SIFT的全称是Scale Invariant Feature Transform&#xff0c;尺度不变特征变…

微软向马斯克的人工智能公司OpenAI投资10亿美元

来源: 新浪财经新浪美股讯微软(Microsoft)周一宣布&#xff0c;将向埃隆-马斯克(Elon Musk)的OpenAI投资10亿美元&#xff0c;打造能够处理更复杂任务的人工智能。根据声明&#xff0c;通过合作&#xff0c;两家公司将建立新的Azure AI超级计算技术&#xff0c;微软将成为OpenA…

数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF

数字图像处理学习笔记&#xff08;三&#xff09;&#xff1a;ORB算法&#xff08;尺度不变特征变换&#xff09;Oriented FAST and Rotated BRIEF 一、概述 参考&#xff1a;特征点匹配特征检测方法汇总 ORB的全称是Oriented FAST and Rotated BRIEF&#xff0c;是目前来说…

华为:对部分顶尖学生实行年薪制 最高200万元

来源&#xff1a;EETOP7月23日上午消息&#xff0c;据华为总裁办签发的电子邮件&#xff0c;华为对部分2019届顶尖学生实行年薪制管理。华为以电邮通知【2019】068号文发布了8名天才少年的年薪方案&#xff0c;这8名人员全部为2019届应届顶尖学生&#xff0c;其年薪的最低限为8…

matplotlib使用GridSpec自定义子图位置 (非对称的子图)

上图的结构可以用一下两种方式画&#xff1a; import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpecfig plt.figure(1) gs GridSpec(3, 3)ax1 plt.subplot(gs[0, :]) ax2 plt.subplot(gs[1, :2]) ax3 plt.subplot(gs[1:, 2]) ax4 plt.subplot(gs[…