给定0-1矩阵求连通域_xunan003的博客-CSDN博客_连通域
求0-1矩阵连通域这篇文章方法讲的算是比较详细,但是程序由于我没学过C++,再加上编程经验很少,这篇博文给出的程序一致没怎么看懂,啃了两天终于有点眉目了,在此做一个总结,也跟小白们分享一下,希望也能对你们有帮助。
求连通域的方法分为三步
第一步:(打开冰箱)对一个二维矩阵,先求出每一行白色团的起始和终止坐标(列),并给每个团标记序列
第二步:合并密接团的标签,鉴别密接的方式是通过轨迹(列)重叠的方式,轨迹重叠,标签归化,若某团与两类不同的团发生密接,代表这两类团等价(初筛阶段以2个为标准),需要统一隔离。
第三步:对等价团进行汇总筛选,凡有交叠的统一归为一类,以此分为不同的感染群类。
给出了三段程序,分别对应上述的三个步骤。
void fillRunVectors(const Mat& bwImage, int& NumberOfRuns, vector<int>& stRun, vector<int>& enRun, vector<int>& rowRun)
void firstPass(vector<int>& stRun, vector<int>& enRun, vector<int>& rowRun, int NumberOfRuns,
vector<int>& runLabels, vector<pair<int, int>>& equivalences, int offset)
void replaceSameLabel(vector<int>& runLabels, vector<pair<int, int>>&
equivalence)
阅读程序的步骤
第一段程序
一、理解程序目的和实现方式
拿到每一段程序一定要完全搞清楚程序做了什么事情,是怎么实现的,如果没有详细说明怎么实现的,就需要猜测验证,否则程序会读的很痛苦,就像一篇不认识单词也不知所云的阅读理解。
第一段程序完成每一行白色团的起始和终止坐标,并给每个团标记序列。
1、如何标记坐标
第i行的第j1个点为白色团的起始坐标j2个点为终止坐标,就需要将j1压入start队列中,j2压入end队列中,并对应处其属于第i行。
2、如何分辨起始和终止坐标
起始点(1、第一列为白色像素;2、此列为白色像素,同时左列为黑色像素)
终止点(1、此列