Two-pass连通域标记中的union-find结构
2013-10-31 23:38
363 查看
在Two-pass连通域标记中,第一次标记(first pass)时从左向右,从上向下扫描,会将各个有效像素置一个label值,判断规则如下(以4邻域为例):
1)
当该像素的左邻像素和上邻像素为无效值时,给该像素置一个新的label值,label ++;
2)
当该像素的左邻像素或者上邻像素有一个为有效值时,将有效值像素的label赋给该像素的label值;
3)
当该像素的左邻像素和上邻像素都为有效值时,选取其中较小的label值赋给该像素的label值。
此时,还需维护一个关系表,记录哪些label值属于同一个连通域。这个关系表通常用union-find数据结构来实现。
在union-find结构中,属于同一个连通域的label值被存储到同一个树形结构中,如图1所示,{1,2,3,4,8}属于同一个连通域,{5,6,7}属于同一个连通域。同时,树形结构的数据存储到一个vector或array中,vector的下标为label值,vector的存储值为该label的父节点label值,当vector的存储值为0时,说明该label是根节点。这样,对于任意一个label,我们都可以寻找其根节点,作为所在连通域的label值,即某一连通域所有像素都被置为同一个label值,即根节点label值。对给定的任意一个label,我们可以通过find算法寻找其根节点,如图2所示。
如果知道两个label同属于一个连通域,要如何在vector中实现其存储关系呢?首先,各自寻找两个label的根节点,如果二者的根节点相同,则二者已经属于同一个连通域;如果二者的根节点不同,那么把其中一个根节点作为另一个的父节点即可,即将两个label划入同一个连通域,或者叫做连通域合并,算法如图3所示。
那么这个存储label值的vector要如何初始化呢?将vector初始化为0即可,即各个label值都是根节点,大家互不相连。同时注意,vector[0]不使用。
实现代码如下:
reference: Shapiro, L., and Stockman, G. (2002). Computer Vision.
Prentice Hall. pp. 69–73.
1)
当该像素的左邻像素和上邻像素为无效值时,给该像素置一个新的label值,label ++;
2)
当该像素的左邻像素或者上邻像素有一个为有效值时,将有效值像素的label赋给该像素的label值;
3)
当该像素的左邻像素和上邻像素都为有效值时,选取其中较小的label值赋给该像素的label值。
此时,还需维护一个关系表,记录哪些label值属于同一个连通域。这个关系表通常用union-find数据结构来实现。
在union-find结构中,属于同一个连通域的label值被存储到同一个树形结构中,如图1所示,{1,2,3,4,8}属于同一个连通域,{5,6,7}属于同一个连通域。同时,树形结构的数据存储到一个vector或array中,vector的下标为label值,vector的存储值为该label的父节点label值,当vector的存储值为0时,说明该label是根节点。这样,对于任意一个label,我们都可以寻找其根节点,作为所在连通域的label值,即某一连通域所有像素都被置为同一个label值,即根节点label值。对给定的任意一个label,我们可以通过find算法寻找其根节点,如图2所示。
如果知道两个label同属于一个连通域,要如何在vector中实现其存储关系呢?首先,各自寻找两个label的根节点,如果二者的根节点相同,则二者已经属于同一个连通域;如果二者的根节点不同,那么把其中一个根节点作为另一个的父节点即可,即将两个label划入同一个连通域,或者叫做连通域合并,算法如图3所示。
那么这个存储label值的vector要如何初始化呢?将vector初始化为0即可,即各个label值都是根节点,大家互不相连。同时注意,vector[0]不使用。
实现代码如下:
const int max_size = 100; int parent[100] = {0}; // 找到label x的根节点 int find(int x, int parent[]){ int i = x; while(0 != parent[i]) i = parent[i]; return i; } // 将label x 和 label y合并到同一个连通域 void union_label(int x, int y, int parent[]){ int i = x; int j = y; while(0 != parent[i]) i = parent[i]; while(0 != parent[j]) j = parent[j]; if(i != j) parent[i] = j; }
reference: Shapiro, L., and Stockman, G. (2002). Computer Vision.
Prentice Hall. pp. 69–73.
相关文章推荐
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- Find the k-th Smallest Element in the Union of Two Sorted Arrays
- Search Quick Union Find(图的存储结构)
- give two sorted array, find the k-th smallest element of union of A and B
- 数据结构之并查集(Union-Find)
- UVA 11987 Almost Union-Find 并查集的删除操作 懒惰标记
- uva11987 Almost Union-Find(可删除元素的并查集)
- JNI遇到error: request for member 'FindClass' in something not a structure or union
- 并查集(Union-Find)算法介绍
- UVA 11987 Almost Union-Find (单点修改的并查集)
- 并查集(Union-Find)算法介绍
- coursera Algorithms week1 练习测验2:Union-find with specific canonical element
- UVA - 11987 Almost Union-Find (并查集)
- Two sorted array. Find kth smallest element, 要求O(logK)
- Find the first intersection of two lists (if the two list are merged at some point)
- 并查集- Union-Find
- Union-find(Algorithms, Part 1, week 1 )
- Find distance between two given keys of a Binary Tree
- 一.快速并查集(Union_Find)
- Union-find and Disjoint Set Union