连通域分析其实是一个路径搜索问题,搜索方式就看联通的规则(4联通:上下左右算是联通,8联通:上下左右还有四个对角)

01矩阵背景是0,黑色的,有色区域是1,白色的,从图像的左上角(最外围的边要去掉)进行遍历,将找到的第一个值为1的像素点作为起点,对他进行连通域搜寻,将搜寻到的整个连通域内的像素点标为2(为了避免与本来的颜色1冲突)

继续搜索像素值为1的点(之前联通域分析过的已经将像素值改为大于1的值,所以像素值为1的就是还没有分析过的),直到整个图像遍历完成

遍历方法:

找到起点后初始化一个栈,存放连通域的点坐标(pair),将起点的横纵坐标压入栈中,连通域的标记值自增(第一个连通域的标记值为2,从2开始,第二个连通域的标记值为3,以此类推)

当栈不为空时,从栈顶取点,读出他的横纵坐标,在Label图中,根据横纵坐标对连通域进行对应标记值的赋值,然后将该点出栈,同时按照联通规则,根据坐标找到它的相邻像素点,看相邻像素点的值是否为1,如果是1,则是连通域,将这个点入栈(判断时记得要加上边界条件,防止点下标溢出,我的代码偷懒了没有加,正常要加上 0<=Row

代码

void SeedFilling(const Mat &BinaryImg, Mat &LabelImg)

{if (BinaryImg.empty || BinaryImg.type() !=CV_8UC1)return;

BinaryImg.convertTo(LabelImg, CV_32SC1);int Label = 1;//从2开始,防止和二值图像的像素值重合

int Row = BinaryImg.rows - 1;int Col = BinaryImg.cols - 1;for (int i = 1; i < Row; ++i)

{int* data = LabelImg.ptr(i);for (int j = 1; j < Col - 1; ++j)

{if (data[j] == 1)

{

stack>NeighborPixel;

NeighborPixel.push(pair(i, j));++Label;//新标签

while (!NeighborPixel.empty)//栈不为空

{

pair CurPixel =NeighborPixel.top();int CurRow =CurPixel.first;int CurCol =CurPixel.second;

LabelImg.at(CurRow, CurCol) =Label;

NeighborPixel.pop();//出栈

if (LabelImg.at(CurRow, CurCol - 1) == 1)

NeighborPixel.push(pair(CurRow, CurCol - 1));if (LabelImg.at(CurRow, CurCol + 1) == 1)

NeighborPixel.push(pair(CurRow, CurCol + 1));if (LabelImg.at(CurRow - 1, CurCol) == 1)

NeighborPixel.push(pair(CurRow - 1, CurCol));if (LabelImg.at(CurRow + 1, CurCol) == 1)

NeighborPixel.push(pair(CurRow + 1, CurCol));

}

}

}return;

}

}

给定01矩阵求连通域python_手写01矩阵连通域分析相关推荐

  1. python手写字体程序_深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是"hello world",在深度学习领域,这个"hello world"程序就是手写字体识别程序. 这次我们详细的分析下手 ...

  2. java 矩阵求秩_线性代数精华3——矩阵的初等变换与矩阵的秩

    矩阵的初等变换这个概念可能在很多人听来有些陌生,但其实我们早在初中的解多元方程组的时候就用过它.只不过在课本当中,这种方法叫做消元法.我们先来看一个课本里的例子: 假设我们要解这个方程,怎么做呢? 首 ...

  3. 【机器学习中的矩阵求导】(七)矩阵向量化复习

    学习总结 (1)矩阵乘法. Vec⁡(ABC⁡)=(C⊤⊗A)Vec⁡(B)\operatorname{Vec}(\operatorname{ABC})=\left(\mathbf{C}^{\top} ...

  4. 矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)

    Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...

  5. c语言矩阵求伪逆算法pinv,pinv--求矩阵的伪逆矩阵

    pinv--求矩阵的伪逆矩阵 [功能简介]用于求矩阵的伪逆矩阵. [语法格式] 1.B=pinv(A) 函数返回矩阵A的伪逆矩阵.如果矩阵A是可逆(非奇异)的,那么pinv(A)与inv(A)的结果是 ...

  6. matlab里的矩阵和opencv里的矩阵的区别,opencv 矩阵相乘, matlab矩阵相乘,以及自己写的矩阵相乘的时间比较...

    直接上代码吧 matlab clc close all clear all tic; c = rand(7500,7500)*rand(7500,1);toc; Elapsed time is2.57 ...

  7. LSTM预测MNIST手写数字张量流图分析

    看LSTM的代码感觉封装的太厉害,看的有些模糊,现画了个MNIST的张量流图,便于分析代码 原始代码如下 # View more python learning tutorial on my Yout ...

  8. 手写及场景文字分析与识别的一些新尝试

    本文为CSIG-DIAR 2020学术年会系列报道之一,转载自CSIG文档图像分析与识别专委会,为金连文老师最新分享.内容较多,建议先收藏再阅读. END 备注:ocr OCR交流群 文本检测.识别. ...

  9. 利用python实现简单的人工神经网络识别手写数字

    利用 Python 搭建起了一个简单的神经网络模型,并完成识别手写数字. 1.前置工作 1.1 环境配置 这里使用scikit-learn库内建的手写数字字符集作为本文的数据集.scikit-lear ...

最新文章

  1. 关于学习Python的一点学习总结(4->成员资格->list->列表操作)
  2. 手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7
  3. python3精要(28)-filter
  4. 精通Android自定义View(九)绘制篇Canvas分析之绘制图片
  5. 【LeetCode】79-单词搜索
  6. FPGA时钟激励编写(方法二)
  7. 经过两个月的面试,我给你整理了这些面试考点(Java版)
  8. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列二(weblogic 应用程序使用log4j)
  9. 2.7 HDFS的使用
  10. 涡CFTurbo 10.2.6 2017泵轮涡旋式机械设计
  11. linux文件系统程序设计实验报告,浙江大学Linux程序设计实验报告
  12. freeswitch拨打分机号
  13. 几种实现数据扁平化的方法
  14. Linux下ps参数详解
  15. Mysql连接1045错误解决
  16. 关于获取当前时间出现1970年问题的解决
  17. jwt无状态权限认证(pings-shiro-jwt)
  18. linux主机名(静态主机名、临时主机名)
  19. android 三星调用拍照功能吗,详解三星GALAXY Camera超方便的拍照功能
  20. matlab的图形功能主要包括,6、MATLAB图形功能

热门文章

  1. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)
  2. 一曲清商 满墨柔情不知数
  3. 数字孪生流域建设是什么意思?它有哪些可行性关键技术?
  4. 利用ArcGIS结合DEM提取小流域单元
  5. 欧空局中国区域数据的筛选
  6. CLion 拼写错误 如何关闭拼写错误
  7. ANS应用交付助力“武当派招生”
  8. 远程网络教学系统--UML图
  9. 关于计算机毕业后能从事的岗位,以及工作内容。
  10. 推荐:电子日记本(EDiary)V2.53