一、图像连通区域

图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别。一般情况下,一个连通域内只包含一个像素值,因此为了防止像素值波动对提取不同连通域的影响,连通域分析常处理的是二值化后的图像

二、邻域

邻域即相邻得区域,opencv中有以下两种形式得领域

  • 4-邻域:必须在水平和垂直方向上相邻,相邻的两个像素坐标必须只有一位不同而且只能相差1个像素

  • 8-邻域: 九宫格形式,相邻的两个像素坐标必须只有一位不同而且只能相差1个像素

图示如下:

三、图像邻域分析法

两遍扫描法

两遍扫描法会遍历两次图像,第一次遍历图像时会给每一个非0像素赋予一个数字标签,当某个像素的上方和左侧邻域内的像素已经有数字标签时,取两者中的最小值作为当前像素的标签,否则赋予当前像素一个新的数字标签。第一次遍历图像的时候同一个连通域可能会被赋予一个或者多个不同的标签

种子填充法

首先将所有非0像素放到一个集合中,之后在集合中随机选出一个像素作为种子像素,根据邻域关系不断扩充种子像素所在的连通域,并在集合中删除掉扩充出的像素,直到种子像素所在的连通域无法扩充,之后再从集合中随机选取一个像素作为新的种子像素,重复上述过程直到集合中没有像素(类似DFS)

四、连通区域操作

不带统计信息的API

此处的OutputArray labels是不能直接imshow的,需要进行相应的转换,才能正常显示

int connectedComponents(InputArray image, OutputArray labels,int connectivity = 8, int ltype = CV_32S);
/*******************************************************************
*           image:                  输入二值图像
*           labels:                 输出图像
*           connectivity:            邻域
*           ltype:                   输出图深度
*********************************************************************/

带有统计信息的API

int connectedComponentsWithStats(InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids,int connectivity, int ltype, int ccltype);
/*******************************************************************
*           image:                  输入二值图像
*           labels:                 输出图像
*           stats:                   统计信息,包括每个组件的位置、宽、高与面积
*           centroids:               每个组件的中心位置坐标cx, cy
*           connectivity:            邻域
*           ltype:                   输出图深度
*           ccltype:                 连通组件算法
*********************************************************************/
//ccltype取值
enum ConnectedComponentsTypes {CC_STAT_LEFT   = 0, //        组件的左上角点像素点坐标的X位置             CC_STAT_TOP    = 1, //        组件的左上角点像素点坐标的Y位置CC_STAT_WIDTH  = 2, //        组件外接矩形的宽度CC_STAT_HEIGHT = 3, //        组件外接矩形的高度CC_STAT_AREA   = 4, //        当前连通组件的面积(像素单位)CC_STAT_MAX    = 5  //        最大枚举值,仅在内部用于内存分配(可忽略)
};

五、综合代码

注意at函数通过宏的设置获取Mat的一系列的属性(x,y,width,height)

#include <iostream>
#include <string>
#include <time.h>
#include <map>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Connection
{
public:Connection() :img(imread("text.jpg",IMREAD_GRAYSCALE)){//在构造函数中进行二值化处理.result["原图"] = img;threshold(img, result["阈值化"], 200, 255, THRESH_BINARY_INV);}//着色void DrawColor(Mat& src, Mat& result, int nCount){vector<Vec3b> colors(nCount);for (int i = 1; i < nCount; i++){colors[i] = Vec3b(rand() % 256, rand() % 256, rand() % 256);}//连通区域着色result = Mat::zeros(img.size(), CV_8UC3);//这里的CV_8UC3实际上就是完成了输出图片格式的转换。for (int y = 0; y < img.rows; y++){for (int x = 0; x < img.cols; x++){int label = src.at<int>(y, x);if (label > 0 && label <= nCount){//着色result.at<Vec3b>(y, x) = colors[label];}if (label == 0){//黑色部分直接用白色来填充(一开始用的反二值化--->见下面的原理图)result.at<Vec3b>(y, x) = Vec3b(255, 255, 255);}}}
​}void NoCount(){Mat temp;int nCount = connectedComponents(result["阈值化"], temp);//temp不能直接显示,需要转换后才能显示(在DrawColor里面res的CV_8UC3完成转换) DrawColor(temp, result["不统计"], nCount);}void Count() {Mat stats, center, temp;int nCount = connectedComponentsWithStats(result["阈值化"], temp, stats, center, 8, CC_STAT_AREA);DrawColor(temp, result["统计"], nCount);//利用统计信息标记连通域for (int i = 1; i < nCount; i++) {int x = stats.at<int>(i, CC_STAT_LEFT);int y = stats.at<int>(i, CC_STAT_TOP);int w = stats.at<int>(i, CC_STAT_WIDTH);int h = stats.at<int>(i, CC_STAT_HEIGHT);rectangle(result["统计"], Rect(x, y, w, h), Scalar(0, 0, 0), 2);}}void Show() {for (auto& v : result) {imshow(v.first, v.second);}waitKey(0);}
protected:Mat img;map<string, Mat> result;
};
​
int main()
{srand((unsigned int)time(nullptr));Connection* p = new Connection;p->NoCount();p->Count();p->Show();return 0;
}

10---OpenCV:图像进阶操作之连通区域分析相关推荐

  1. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  2. opencv(十三)-快速连通区域分析

    索引目录 1.连通区域标记算法 2.剔除小连通区域 参考 1.连通区域标记算法 连接区域标记算法(connected component labeling algorithm)是图像分析中最常用的算法 ...

  3. OpenCV二值图像处理——阈值,连通区域分析(C++)

    阈值 阈值又叫临界值,是指一个效应能够产生的最低值或最高值 对于图像的直方图存在明显边界的图像,我们可以很容易找到这个阈值,但是如果图像直方图分界不明显,那么这个阈值的寻找将变得十分困难.因此我们存在 ...

  4. opencv笔记(十八)——连通区域分析

    本文主要介绍在CVPR和图像处理领域中较为常用的一种图像区域(Blob)提取的方法--连通性分析法(连通区域标记法).文中介绍了两种常见的连通性分析的算法:1)Two-pass:2)Seed-Fill ...

  5. VTK修炼之道51:图形基本操作进阶_连通区域分析

    1.连通区域分析 许多图形数据中,并非只包含一个对象(连通区域).而在处理这些图形数据时,有时需要对每一个对象单独处理或者让其单独显示.比如,利用MarchingCube方法提取三维图像中的等值面,得 ...

  6. OpenCv连通区域分析——Two-Pass 算法区域生长算法

    连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域.连通区域分析是指将图像中的各个连通区域找出并标记,通常连通区域分析处理的对象是一张二 ...

  7. opencv 最大连通域_opencv 查找连通区域 最大面积实例

    今天在弄一个查找连通的最大面积的问题. 要把图像弄成黑底,白字,这样才可以正确找到. 然后调用下边的方法: RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构(two-level hierar ...

  8. matlab连通区边界_Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI...

    本博客主要记录我学习运用matlab进行一些基本的图像处理的一些笔记,如果有不当的地方,欢迎批评指正,一起学习,一起进步. 本篇是第一篇,只涉及到一些基本的操作,涉及到的知识点如下: 1.二值化 2. ...

  9. opencv 最大连通域_opencv 查找连通区域 最大面积

    今天在弄一个查找连通的最大面积的问题. 要把图像弄成黑底,白字,这样才可以正确找到. 然后调用下边的方法: RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构(two-level hierar ...

  10. 第三章 Opencv图像像素操作

    目录 1.像素 1-1.确定像素位置 1-2.获取指定像素的像素值 1-3.修改像素的BGR值 2.用numpy模块操作像素 2-1.创建图像 1.创建黑白图像 2.创建彩色图像 3.创建随机图像 2 ...

最新文章

  1. xshell连接Linux、ngix部署
  2. 目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结
  3. Matlab | Matlab从入门到放弃(1)——变量
  4. windows下搭建Vagrant+Virtualbox环境
  5. JFinal常量配置学习笔记
  6. 花高价招来的阿里P8,我从他那里总结了8大硬核能力,4个经典案例,真香
  7. postgresql授权和撤销
  8. 算法第四版C++算法实现全集
  9. 服务器的硬盘内存型号大小怎么查看,怎么查服务器硬盘和内存大小
  10. 计算机文化基础知识点第十一版,计算机文化基础知识点总结(经典版) 考试专用.doc...
  11. 45个实用的前端开发工具汇总
  12. 关于验证码错误的解决办法
  13. LaTex - PPT 模板-2 (亲测可用)
  14. 基于区块链技术的航运贸易流程研究
  15. 推荐一本书:清华出版的《Modbus软件开发实战指南》
  16. 国内哪家公司做网站最好?
  17. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化
  18. 上有尧舜之君,下有尧舜之民
  19. HTML开发者工具抓取所有图片,利用Chrome开发者工具功能进行网页整页截图的方法...
  20. C语言经典100例(6)——用*号输出字母C的图案。

热门文章

  1. csdn七牛云存储作为网站的图片外链
  2. Hbuilder开发APP(一)——底部导航条简单实现
  3. Ubuntu .desktop 文件编写
  4. Android应用: 3D旋转球
  5. Python 爬取“微博树洞”详细教程
  6. 什么是双机热备?双机热备软件介绍
  7. 双机热备概念原理及实现步骤
  8. submit 和 button的区别
  9. Coldfusion的基础知识
  10. 年薪90万的阿里p7和副处级干部选哪个?