浅谈OpenCV中的新函数connectedComponentsWithStats用法


Posted in Python onJuly 05, 2020

主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域。

关键字:connectedComponentsWithStats

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

比如,我在GOCVHelper中这样进行了实现

//寻找最大的轮廓
 VP FindBigestContour(Mat src){ 
  int imax = 0; //代表最大轮廓的序号
  int imaxcontour = -1; //代表最大轮廓的大小
  std::vector<std::vector<Point>>contours; 
  findContours(src,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;
   }
  }
  return contours[imax];
 }
 //寻找并绘制出彩色联通区域
 vector<VP> connection2(Mat src,Mat& draw){ 
  draw = Mat::zeros(src.rows,src.cols,CV_8UC3);
  vector<VP>contours; 
  findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
  //由于给大的区域着色会覆盖小的区域,所以首先进行排序操作
  //冒泡排序,由小到大排序
  VP vptmp;
  for(int i=1;i<contours.size();i++){
   for(int 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;
    }
   }
  }

在OpenCV3中有了新的专门的函数 cv::connectedComponents() 和函数 cv::connectedComponentsWithStats()

定义:

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

其中,新出现的参数

stats:长这样

浅谈OpenCV中的新函数connectedComponentsWithStats用法

分别对应各个轮廓的x,y,width,height和面积。注意0的区域标识的是background

而centroids则对应的是中心点

而label则对应于表示是当前像素是第几个轮廓

例子:

对于图像

浅谈OpenCV中的新函数connectedComponentsWithStats用法

Mat img = cv::imread( "e:/sandbox/rect.png",0); 
 cv::Mat img_edge, labels, img_color, stats,centroids;
 cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY);
 bitwise_not(img_edge,img_edge);
 cv::imshow("Image after threshold", img_edge);
 int i, nccomps = cv::connectedComponentsWithStats (
  img_edge, labels,
  stats, centroids
  );
 cout << "Total Connected Components Detected: " << nccomps << endl;
 vector<cv::Vec3b> colors(nccomps+1);
 colors[0] = Vec3b(0,0,0); // background pixels remain black.
 for( i = 1; i < nccomps; i++ ) {
  colors[i] = Vec3b(rand()%256, rand()%256, rand()%256);
  if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 )
   colors[i] = Vec3b(0,0,0); // small regions are painted with black too.
 }
 img_color = Mat::zeros(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 <= nccomps);
   img_color.at<cv::Vec3b>(y, x) = colors[label];
  }
 cv::imshow("Labeled map", img_color);
 cv::waitKey();

注意:

1、对于OpenCV来说,白色代表有数据,黑色代表没有数据,所以图像输入之前要转换成”黑底白图“

2、看labels 和 stats,其中第1 2 6 个的面积小于200

浅谈OpenCV中的新函数connectedComponentsWithStats用法

而labels中

浅谈OpenCV中的新函数connectedComponentsWithStats用法

完全对的上号,结果为

浅谈OpenCV中的新函数connectedComponentsWithStats用法

以上这篇浅谈OpenCV中的新函数connectedComponentsWithStats用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
python发送邮件接收邮件示例分享
Jan 21 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
Python高级用法总结
May 26 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
Python3匿名函数用法示例
Jul 25 Python
numpy矩阵数值太多不能全部显示的解决
May 14 Python
keras打印loss对权重的导数方式
Jun 10 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 Python
python怎么对数字进行过滤
Jul 05 #Python
python主要用于哪些方向
Jul 05 #Python
python右对齐的实例方法
Jul 05 #Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 #Python
python使用opencv resize图像不进行插值的操作
Jul 05 #Python
Python-openCV开运算实例
Jul 05 #Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 #Python
You might like
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
eclipse创建python项目步骤详解
2019/05/10 Python
Python实现最大子序和的方法示例
2019/07/05 Python
python 实现return返回多个值
2019/11/19 Python
Python 支持向量机分类器的实现
2020/01/15 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
python中time.ctime()实例用法
2021/02/03 Python
办公室文秘自我评价
2013/09/21 职场文书
党校学习自我鉴定
2014/02/24 职场文书
工地安全质量标语
2014/06/07 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
教师个人培训总结
2015/02/11 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
党员转正意见怎么写
2015/06/03 职场文书
大学生实习证明
2015/06/16 职场文书