Two-Pass就是通过扫描两遍图像,就可以将图像中存在的所有连通区域找出并标记。
基本思路:首先将图像二值化,将不是background的像素点都标记为同一个初始label,background的像素点都标记为0,然后第一遍扫描过程中同一个连通区域内的像素中可能会被赋予一个或多个不同label,这些同一连通域的不同label是相连的,在此过程中记录下它们的连通性;第二遍扫描就是根据第一遍记录下来的所有label的连通性来统一一个连通域内不同的label值。
此处我们考虑4邻域的情况,设图像的初始label值为L,第一次扫描过程中扫描到图像中某个点的label值为lab[x, y],该点左邻label值为left,上邻label值为up,该点label赋值的赋值逻辑为:
if lab[x, y]不为0:
if left, up都为0:
lab[x, y]赋值为L, L++
if left, up只有一个为0:
lab[x, y]赋值为left,up中非零的一方
if left, up都不为0:
lab[x, y]赋值为left, up中最小的一方
else:
扫描到background处直接跳过
在第一遍的扫描过程中用Union-Find记录各个label值之间的连通性。
C++代码实现:
//
// main.cpp
// Connected_Area
//
// Created by FanYizhe on 2019/3/7.
// Copyright © 2019年 FanYizhe. All rights reserved.
//
#include <iostre