浅谈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创建关联数组(字典)的方法
May 04 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
Django 2.0版本的新特性抢先看!
Jan 05 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
django数据库自动重连的方法实例
Jul 21 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
python解析yaml文件过程详解
Aug 30 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 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绘制在图片上的正余弦曲线
2013/06/08 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
实现python版本的按任意键继续/退出
2016/09/26 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
个人简历自我评价
2014/01/06 职场文书
10的分与合教学反思
2014/04/30 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技