浅谈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函数式编程指南(二):从函数开始
Jun 24 Python
详解Python3中的Sequence type的使用
Aug 01 Python
python实现媒体播放器功能
Feb 11 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
python调用OpenCV实现人脸识别功能
May 25 Python
python使用Matplotlib画饼图
Sep 25 Python
Python函数式编程实例详解
Jan 17 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 Python
详解Python requests模块
Jun 21 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动态创建Flash动画
2006/10/09 PHP
Access数据库导入Mysql的方法之一
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
php获取参数的几种方法总结
2014/02/18 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
QML使用Python的函数过程解析
2019/09/26 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
NumPy排序的实现
2020/01/21 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
出纳工作岗位责任制
2014/02/02 职场文书
社区健康教育实施方案
2014/03/18 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS