连通区域快速标记的two-pass算法及其实现

转自:http://blog.csdn.net/lichengyu/article/details/13986521?reload#comments
http://blog.csdn.net/icvpr/article/details/10259577?reload#comments
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}属于同一个连通域。同时,树形结构的数据存储到一个vectorarray中,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]不使用。

实现代码如下:

[cpp]  view plain copy
  1. const int max_size = 100;  
  2. int parent[100] = {0};  
  3.   
  4. // 找到label x的根节点  
  5. int find(int x, int parent[]){  
  6.     int i = x;  
  7.     while(0 != parent[i])  
  8.         i = parent[i];  
  9.     return i;  
  10. }  
  11.   
  12. // 将label x 和 label y合并到同一个连通域  
  13. void union_label(int x, int y, int parent[]){  
  14.     int i = x;  
  15.     int j = y;  
  16.     while(0 != parent[i])  
  17.         i = parent[i];  
  18.     while(0 != parent[j])  
  19.         j = parent[j];  
  20.     if(i != j)  
  21.         parent[i] = j;  
  22. }  


 reference: Shapiro, L., and Stockman, G. (2002). Computer Vision. Prentice Hall. pp. 69–73.

  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Two-Pass算法是计算连通域的一种基本方法之一\[1\]。它是一种用于图像处理的算法,可以用于标记和计算图像中的连通域。在FPGA(现场可编程门阵列)中实现Two-Pass算法可以提高图像处理的效率和速度。 FPGA是一种可编程的硬件设备,可以根据需要重新配置其内部电路,以实现特定的功能。在FPGA中实现Two-Pass算法,可以通过并行处理的方式同时处理多个像素,从而加快图像处理的速度。通过将Two-Pass算法的各个步骤分配到FPGA的不同部分,可以实现高效的图像连通域计算。 具体实现Two-Pass算法的FPGA设计需要根据具体的硬件平台和需求进行设计和优化。可以使用硬件描述语言(如VHDL或Verilog)来描述算法的逻辑和功能,并使用FPGA开发工具进行编译和综合。通过合理的设计和优化,可以实现高性能和低功耗的图像处理系统。 总之,通过在FPGA中实现Two-Pass算法,可以提高图像处理的效率和速度,适用于需要高性能图像处理的应用场景。 #### 引用[.reference_title] - *1* *3* [Two-Pass算法——图像连通域分析](https://blog.csdn.net/liujiabin076/article/details/80788459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [图像算法--基于fpga的双边滤波算法](https://blog.csdn.net/qq_40057229/article/details/127517641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值