0

在我的任务中,我将凹多边形表示为 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),从左上角开始计数

4

2 回答 2

2

这是图像处理中一个众所周知的问题,可以使用形态学算子来解决。

有了这个,你可以使用 scipybinary_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]])
于 2015-07-08T11:35:37.367 回答
0

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

也许这里的答案会对您有所帮助:如何在广度优先搜索中追踪路径?

于 2015-07-08T11:34:54.950 回答