填充表示为二进制矩阵的凹多边形

时间:2015-07-08 11:10:39

标签: python numpy concave concave-hull

在我的任务中,我将凹多边形表示为1和0的矩阵,其中一个意味着给定点属于多边形。例如,以下是简单的正方形和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)*处的元素是&# 34;未填充&#34 ;.目标是填充它们(即,将它们的值更改为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中是否有一种简单的方法可以做到这一点?

*(行,列),从左上角开始计算

2 个答案:

答案 0 :(得分:2)

这是图像处理中一个众所周知的问题,可以使用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]])

答案 1 :(得分:0)

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

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