浅谈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 相关文章推荐
浅谈Python单向链表的实现
Dec 24 Python
qpython3 读取安卓lastpass Cookies
Jun 19 Python
python使用str &amp; repr转换字符串
Oct 13 Python
Django视图和URL配置详解
Jan 31 Python
python如何从文件读取数据及解析
Sep 19 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 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
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
php与php MySQL 之间的关系
2009/07/17 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
jQuery $.each的用法说明
2010/03/22 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
input框中的name和id的区别
2016/11/16 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
koa-router源码学习小结
2018/09/07 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
大学生职业生涯规划范文
2014/01/22 职场文书
学校教师安全责任书
2014/07/23 职场文书
关于运动会的广播稿
2014/09/22 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
5行Python代码实现一键批量扣图
2021/06/29 Python