浅谈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 pyqt内存占用问题分析
Jun 09 Python
在Python中使用pngquant压缩png图片的教程
Apr 09 Python
在Python中使用SQLite的简单教程
Apr 29 Python
Python3实现转换Image图片格式
Jun 21 Python
Python装饰器基础概念与用法详解
Dec 22 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
django-allauth入门学习和使用详解
Jul 03 Python
Django中URL的参数传递的实现
Aug 04 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
Python实现石头剪刀布游戏
Jan 20 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
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
求职信模板怎么做
2014/01/26 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
承诺书样本
2014/08/30 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
员工辞职信范文
2015/03/02 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL