给定01矩阵求连通域python_手写01矩阵连通域分析
连通域分析其实是一个路径搜索问题,搜索方式就看联通的规则(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矩阵连通域分析相关推荐
- python手写字体程序_深度学习---手写字体识别程序分析(python)
我想大部分程序员的第一个程序应该都是"hello world",在深度学习领域,这个"hello world"程序就是手写字体识别程序. 这次我们详细的分析下手 ...
- java 矩阵求秩_线性代数精华3——矩阵的初等变换与矩阵的秩
矩阵的初等变换这个概念可能在很多人听来有些陌生,但其实我们早在初中的解多元方程组的时候就用过它.只不过在课本当中,这种方法叫做消元法.我们先来看一个课本里的例子: 假设我们要解这个方程,怎么做呢? 首 ...
- 【机器学习中的矩阵求导】(七)矩阵向量化复习
学习总结 (1)矩阵乘法. Vec(ABC)=(C⊤⊗A)Vec(B)\operatorname{Vec}(\operatorname{ABC})=\left(\mathbf{C}^{\top} ...
- 矩阵生发java_使用java写的矩阵乘法实例(Strassen算法)
Strassen算法于1969年由德国数学家Strassen提出,该方法引入七个中间变量,每个中间变量都只需要进行一次乘法运算.而朴素算法却需要进行8次乘法运算. 原理 Strassen算法的原理如下 ...
- c语言矩阵求伪逆算法pinv,pinv--求矩阵的伪逆矩阵
pinv--求矩阵的伪逆矩阵 [功能简介]用于求矩阵的伪逆矩阵. [语法格式] 1.B=pinv(A) 函数返回矩阵A的伪逆矩阵.如果矩阵A是可逆(非奇异)的,那么pinv(A)与inv(A)的结果是 ...
- matlab里的矩阵和opencv里的矩阵的区别,opencv 矩阵相乘, matlab矩阵相乘,以及自己写的矩阵相乘的时间比较...
直接上代码吧 matlab clc close all clear all tic; c = rand(7500,7500)*rand(7500,1);toc; Elapsed time is2.57 ...
- LSTM预测MNIST手写数字张量流图分析
看LSTM的代码感觉封装的太厉害,看的有些模糊,现画了个MNIST的张量流图,便于分析代码 原始代码如下 # View more python learning tutorial on my Yout ...
- 手写及场景文字分析与识别的一些新尝试
本文为CSIG-DIAR 2020学术年会系列报道之一,转载自CSIG文档图像分析与识别专委会,为金连文老师最新分享.内容较多,建议先收藏再阅读. END 备注:ocr OCR交流群 文本检测.识别. ...
- 利用python实现简单的人工神经网络识别手写数字
利用 Python 搭建起了一个简单的神经网络模型,并完成识别手写数字. 1.前置工作 1.1 环境配置 这里使用scikit-learn库内建的手写数字字符集作为本文的数据集.scikit-lear ...
最新文章
- 关于学习Python的一点学习总结(4->成员资格->list->列表操作)
- 手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7
- python3精要(28)-filter
- 精通Android自定义View(九)绘制篇Canvas分析之绘制图片
- 【LeetCode】79-单词搜索
- FPGA时钟激励编写(方法二)
- 经过两个月的面试,我给你整理了这些面试考点(Java版)
- 在Tomcat 与weblogic 中的 日志(log4j) 配置系列二(weblogic 应用程序使用log4j)
- 2.7 HDFS的使用
- 涡CFTurbo 10.2.6 2017泵轮涡旋式机械设计
- linux文件系统程序设计实验报告,浙江大学Linux程序设计实验报告
- freeswitch拨打分机号
- 几种实现数据扁平化的方法
- Linux下ps参数详解
- Mysql连接1045错误解决
- 关于获取当前时间出现1970年问题的解决
- jwt无状态权限认证(pings-shiro-jwt)
- linux主机名(静态主机名、临时主机名)
- android 三星调用拍照功能吗,详解三星GALAXY Camera超方便的拍照功能
- matlab的图形功能主要包括,6、MATLAB图形功能