浅谈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的Django框架使用的一些实用建议
Apr 03 Python
linux下python抓屏实现方法
May 22 Python
python安装与使用redis的方法
Apr 19 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
对于Python中RawString的理解介绍
Jul 07 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
python 从文件夹抽取图片另存的方法
Dec 04 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Python字符串三种格式化输出
Sep 17 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
php批量删除数据
2007/01/18 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
jquery获取radio值实例
2014/10/16 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
Python的Lambda函数用法详解
2019/09/03 Python
python超时重新请求解决方案
2019/10/21 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Python基于Faker假数据构造库
2020/11/30 Python
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
优秀的应届生自荐信
2014/05/23 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
新郎答谢词
2015/01/04 职场文书
张思德观后感
2015/06/09 职场文书