Python中的连接组件标记算法

时间:2018-07-05 12:18:26

标签: python algorithm edit connected-components

我有一个手写文档的灰度图像。 我想通过应用8向CCL算法从此灰度图像中提取成分。请仅通过导入OpenCV和numpy提供python代码。如果有人可以完成此任务,我将设计一个不完整的代码,这对我非常有帮助。

以下是算法:

  1. 连接分量矩阵被初始化为图像矩阵的大小。
  2. 为图像中的每个检测到的对象初始化一个标记并对其进行递增。
  3. 初始化计数器以计算对象数。
  4. 开始对整个图像进行行主要扫描。
  5. 如果检测到目标像素,则在(Index!= 0)时重复以下步骤
    1. 将“图像”中的相应像素设置为0。
    2. 使用当前设置的像素中的所有相邻像素更新矢量(索引)。
    3. 保留唯一的像素,并删除重复的像素。
    4. 设置索引指示的像素以在连接的分量矩阵中标记。
    5. 增加图像中另一个对象的标记。 6.增加图像中另一个对象的标记。

1 个答案:

答案 0 :(得分:0)

有一种可能的方法与您尝试的相距不远。假设为背景像素分配了标签0,而为对象像素分配了值1。

  • 逐行扫描图像;

  • 遇到一个像素1时,设置一个新标签并执行泛洪填充操作,用新标签替换1。

可以很简单地实现洪水填充:

  • 将起始像素设置为新标签;

  • 递归填充八个邻居(如果它们的值为1)。

https://en.wikipedia.org/wiki/Flood_fill

此版本的代码非常简单。但是您会注意到,由于未完成填充的数量可能与图像大小一样大,因此它很容易溢出堆栈。

def FloodFill(X, Y, Label):
    I[X,Y]= Label
    for all 8-way neighbors (X'=X±1, Y'=Y±1, inside image):
        if I[X',Y'] == 1:
            FloodFill(X', Y', Label)

def CCL(Image I):
    Label= 1
    for Y in range(I.Height):
        for X in range(I.Width):
            if I[X, Y] == 1:
                Label+= 1
                FloodFill(X, Y, Label)

因此,我建议使用scanline版本,该版本涉及更多。

https://en.wikipedia.org/wiki/Flood_fill#Scanline_fill