连接字符的分段

时间:2013-01-08 09:01:55

标签: opencv image-segmentation

如果字符连接,我该如何分段?我只是尝试使用距离变换(http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/的分水岭来查找组件的数量,但它似乎表现不佳。

  1. 为了表现良好,它需要在阈值之后分离对象。
  2. 话虽如此,我怎样才能有效地分割角色?需要帮助/想法。

    slightly connected 附件是二进制图像的例子。

    heavily connected一个连接很多的例子。

    答:

    @mmgp这是我的o / p

    BP o/p

3 个答案:

答案 0 :(得分:7)

我相信这里有两种方法:1)重做二值化步骤,导致你现在拥有的这些图像; 2)根据图像大小考虑不同的可能性。让我们关注第二种方法。

在最小的图像中,只连接了两个数字,只有在考虑8连接时才会发生这种情况。如果您将图像处理为4连接,则无需执行任何操作,因为没有连接的两个组件应该分开。如下所示。只有在考虑8连通性时,才能通过找到连接到另一个点的点来获得正确的图像。在这种情况下,只有两个这样的点,通过删除它们,我们断开两个数字'1'。

enter image description here enter image description here

在你的另一张照片中,情况已不再如此。而且我没有一种简单的方法来应用它,可以应用于较小的图像而不会使它变得更糟。但是,实际上,我们可以考虑将两个图像放大到一些常见的大小,使用最近邻居的插值,这样我们就不会从二进制表示中移动。通过调整两个图像的大小使其宽度等于200,并保持纵横比,我们可以将以下形态学方法应用于它们。首先进行细化:

enter image description here

现在,可以看出,形态分支点是连接数字的分支点(在最左边的数字'六'也有另一个,将被处理)。我们可以提取这些分支点并应用形状闭合,垂直线为2 *高度+ 1(高度来自图像),因此无论该点在何处,其闭合都将产生完整的垂直线。由于你的图像不再那么小,这条线不需要1点宽,实际上我认为是6点宽的线。由于某些分支点水平关闭,因此此关闭操作会将它们连接在同一垂直线上。如果分支点不靠近另一个分支点,则执行侵蚀将删除垂直线。并且,通过这样做,我们消除了与左边的数字6相关的分支点。应用这些步骤后,我们在左侧获得以下图像。从中减去原始图像,我们得到右图。

enter image description here enter image description here

如果我们将这些相同的步骤应用于'8011'图像,我们将以与我们开始时完全相同的图像结束。但这仍然很好,因为应用删除仅在8连接中连接的点的简单方法,我们像以前一样获得分离的组件。

答案 1 :(得分:2)

通常使用“涂抹算法”。也称为运行长度平滑算法(RLSA)。这是一种将黑白图像分割成块的方法。您可以在互联网上找到一些信息here或环顾四周,以找到算法的实现。

答案 2 :(得分:0)

不确定我是否想帮助您解决验证码,但一个想法是使用erosion。根据您必须使用的像素数量,它可以在不破坏它们的情况下充分分离角色。这可能最适合用作其他分段算法的预处理步骤。