首页 文章

Python中的连通分量标注算法

提问于
浏览
-4

我有一个手写文档的灰度图像 . 我想通过应用8路CCL算法从这个灰色图像中提取组件 . 请仅在导入OpenCV和numpy时在python中提供代码 . 如果任何人都能完成对我有用的任务,我已经设计了一个不完整的代码 .

Here is the algorithm:

  • 连通分量矩阵初始化为图像矩阵的大小 .

  • 为图像中的每个检测到的对象初始化并递增标记 .

  • 初始化计数器以计算对象数 .

  • 为整个图像启动行主扫描 .

  • 如果检测到对象像素,则重复以下步骤(索引!= 0)

  • 在Image中将相应的像素设置为0 .

  • 用当前设置的像素的所有相邻像素更新矢量(索引) .

  • 保留唯一像素并移除重复像素 .

  • 将Index指示的像素设置为连接分量矩阵中的标记 .

  • 增加图像中另一个对象的标记 . 6.增加图像中另一个对象的标记 .

1 回答

  • 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)
    

    所以我建议扫描线版本,这是一个更多的参与 .

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

相关问题