引言
图像分割领域中一个重要步骤是求取图像的连通区域,后续图像轮廓理解的基石。
Matlab图像工具箱函数bwlabel函数,就是对二值图像连通区域进行标记的函数。
bwlabel
Label connected components in 2-D binary image。
Syntax
L = bwlabel(BW, n)
[L, num] = bwlabel(BW, n)
Description
L = bwlabel(BW, n) returns a matrix L, of the same size as BW, containing labels for the connected objects in BW. The variable n can have a value of either 4 or 8, where 4 specifies 4-connected objects and 8 specifies 8-connected objects. If the argument is omitted, it defaults to 8.
该函数返回一个与原图大小一致的标记图像矩阵。冈萨雷斯书中只介绍了其使用方法,没有介绍其实现原理等,OpenCV也有connectedComponents函数。有必要造轮子,理解步骤。
Two-pass算法
这里我实现的是Two Pass算法,四邻域。该算法对二值图像扫描两次:
- 当前像素点若是前景(非零),判断其已扫描过的邻接节点(上邻像素,左邻像素)有无已标记的。若仅有一个含有标记值,则将该标记赋予该位置,若两个都含有标记值,将最小标记赋予当前值,并将这两个标记值合并(Union),归为同一类;若无,新增标记赋予当前值,即label++。
- 对上述含有标记的像素,查找其集合的根节点(Find),用根节点对当前值赋值。
执行动态图如下(该图是盗网友的,上面有logo的)。