给出一个包含多边形蒙版的矩阵(这里是一个小而简单的情况):
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
用skimage.segmentation.find_boundaries()
提取轮廓,给出:
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
然后提取轮廓的[row,column]
(即[y,x]
)坐标,得到:
outline = array([[2,2],[1,2],[1,3],[2,4],[3,5],[4,5],[5,4],[5,3],[5,2],[4,1],[3,1]])
然后将这些坐标修剪为定义多边形(即顶点)的最小集,得到:
vertices = array([[2,2],[1,2],[1,3],[3,5],[4,5],[5,4],[5,2],[4,1],[3,1]])
(对应于:)
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
在给定顶点坐标(上面的数组outline
的情况下,是否可以使用numpy / scipy / skimage / etc快速获取轮廓坐标(上面的数组vertices
)?
此外,在获取轮廓坐标之后,是否有一种很好的numpy / scipy / skimage方法可以获取原始多边形蒙版中所有点的坐标?
答案 0 :(得分:1)
给定多边形v1, v2
中的2个顶点,我们可以使用线栅格化算法获得p
到v1
到v2
的线的所有点。一个非常快速的算法是Bresenham's line drawing algorithm。之后,您可以将此算法应用于多边形中的每对形容顶点。虽然,我不能保证轮廓将恰好是原始多边形中的轮廓,因为栅格化算法会为给定的线提供最佳的一组点,而不是原始算法中的轮廓(考虑压缩误差)。
对于填充算法,它们称为多边形栅格化算法,但由于不知道哪种方法最好/最快,我在这里无法为您提供帮助。