浅谈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中dict(字典)的使用方法示例
Mar 22 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
Python logging模块用法示例
Aug 28 Python
Python实现图片添加文字
Nov 26 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Python执行时间的几种计算方法
Jul 31 Python
解决Python安装cryptography报错问题
Sep 03 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
python利用后缀表达式实现计算器功能
Feb 22 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防注入类实例
2014/12/05 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
javascript之函数直接量(function(){})()
2007/06/29 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python中List.count()方法的使用教程
2015/05/20 Python
Python判断Abundant Number的方法
2015/06/15 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python查看微信撤回消息代码
2018/06/07 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
在python中修改.properties文件的操作
2020/04/08 Python
Python urllib.request对象案例解析
2020/05/11 Python
pandas针对excel处理的实现
2021/01/15 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
"引用"与多态的关系
2013/02/01 面试题
培训演讲稿范文
2014/01/12 职场文书
教师校本培训方案
2014/02/26 职场文书
设计专业自荐信
2014/06/19 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
党员带头倡议书
2015/04/29 职场文书
用Python实现Newton插值法
2021/04/17 Python
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS