【问题标题】:Filling in a concave polygon represented as a binary matrix填充表示为二进制矩阵的凹多边形
【发布时间】:2015-09-26 06:16:11
【问题描述】:

在我的任务中,我将凹多边形表示为 1 和 0 的矩阵,其中 1 表示给定点属于该多边形。例如,下面是一个简单的正方形和一个 u 形多边形:

0 0 0 0     0 0 0 0 0 0 0
0 1 1 0     0 1 1 0 0 1 1
0 1 1 0     0 1 1 1 1 1 1
0 0 0 0     0 1 1 1 1 1 1  

但是,有时我会得到不完整的表示,其中:(1) 包括所有边界点,以及 (2) 缺少一些内部点。例如,在下面的 u 形多边形的放大版本中,位置 (1,1), (1,6), (3,1), ..., (3,6)* 的元素是“未填充的”。目标是填充它们(即将它们的值更改为1)。

1 1 1 0 0 1 1 1
1 0 1 0 0 1 0 1
1 1 1 1 1 1 0 1
1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 

您知道在 Python/NumPy 中是否有一种简单的方法可以做到这一点?

*(row, column),从左上角开始计数

【问题讨论】:

  • 你如何确定这些不是位置(3, 0),(4, 0)不是应该被填充的位置?它是否与触及整个矩阵“边界”的零路径有关?
  • 你的意思是第一行中间的两个零?
  • 哦,是的,对不起,我的行和列不匹配。
  • 我不确定我是否理解正确,但这两个零在最外层定义的 u 形多边形的边界之外。

标签: python numpy concave concave-hull


【解决方案1】:

这是图像处理中众所周知的问题,可以使用morphological operators 解决。

有了它,你可以使用 scipy 的 binary_fill_holes 来填补你面具上的洞:

>>> import numpy as np
>>> from scipy.ndimage import binary_fill_holes
>>> data = np.array([[1, 1, 1, 0, 0, 1, 1, 1],
                     [1, 0, 1, 0, 0, 1, 0, 1],
                     [1, 1, 1, 1, 1, 1, 0, 1],
                     [1, 0, 0, 0, 0, 0, 0, 1],
                     [1, 1, 1, 1, 1, 1, 1, 1]])

>>> filled = binary_fill_holes(data).astype(int)
>>> filled
array([[1, 1, 1, 0, 0, 1, 1, 1],
       [1, 1, 1, 0, 0, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])

【讨论】:

    【解决方案2】:

    我不相信在 Python 或其他任何东西中会存在一些通用的解决方案。这是经典的广度优先图搜索。对于每个 0,要么存在一条由相邻零组成的路径,因此这些零中至少有一个位于 (y,x) 位置,因此 (x = 0 或 y = 0 或 x = maxx 或 y = maxy) 或者这个 0 应该改为1。

    也许这里的答案会对您有所帮助:How to trace the path in a Breadth-First Search?

    【讨论】:

    • 谢谢!实际上这是我的第一个解决方案,但我在另一个答案中寻找类似 @​​987654322@ 的功能。
    • 因为您的第一个陈述与接受的答案相矛盾。它确实存在一个通用的解决方案。二进制填充是图像处理中的基本操作。虽然答案还不错(给出了一些关于如何做事的提示),但它有一个明显的错误句子,一点图像处理知识就可以解决。最终,OP 询问“python/numpy 是否有简单的方法”,而您的回答是“否”,这是错误的。
    • 好的,我明白了。然而,我很想强调答案并没有说明hard no。我只是说我不相信存在(但请随意继续搜索)。虽然我肯定对图像处理几乎一无所知,但我在图形算法中看到了一个可能的解决方案。为了过度自信的作者,我个人不会对类似的答案投反对票:) 但你当然可以这样做。谢谢你的解释。
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2013-02-24
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多