浅谈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 open读写文件实现脚本
Sep 06 Python
python选择排序算法的实现代码
Nov 21 Python
python基础教程之常用运算符
Aug 29 Python
Python多线程爬虫简单示例
Mar 04 Python
Python字符串处理实现单词反转
Jun 14 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
python+opencv实现阈值分割
Dec 26 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
用opencv给图片换背景色的示例代码
Jul 08 Python
Python如何执行精确的浮点数运算
Jul 31 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 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
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
详解Python sys.argv使用方法
2019/05/10 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
会议邀请函范文
2014/01/09 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
初中中等生评语
2014/12/29 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python