在我的任务中,我将凹多边形表示为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中是否有一种简单的方法可以做到这一点?
*(行,列),从左上角开始计算
答案 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?