浅谈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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
python numpy实现rolling滚动案例
Jun 08 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 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 5.3.0 安装分析心得
2009/08/07 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
浅谈angularjs中响应回车事件
2017/04/24 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python中多线程的创建及基本调用方法
2016/07/08 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
tensorflow 变长序列存储实例
2020/01/20 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
《春到梅花山》教学反思
2014/04/16 职场文书
租赁协议书范本
2014/04/22 职场文书
实验室的标语
2014/06/20 职场文书
雷峰塔导游词
2015/02/09 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL