在给定顶点坐标的情况下获取多边形轮廓和多边形蒙版的坐标

时间:2019-08-22 05:15:15

标签: python algorithm numpy scipy scikit-image

给出一个包含多边形蒙版的矩阵(这里是一个小而简单的情况):

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方法可以获取原始多边形蒙版中所有点的坐标?

1 个答案:

答案 0 :(得分:1)

给定多边形v1, v2中的2个顶点,我们可以使用线栅格化算法获得pv1v2的线的所有点。一个非常快速的算法是Bresenham's line drawing algorithm。之后,您可以将此算法应用于多边形中的每对形容顶点。虽然,我不能保证轮廓将恰好是原始多边形中的轮廓,因为栅格化算法会为给定的线提供最佳的一组点,而不是原始算法中的轮廓(考虑压缩误差)。

对于填充算法,它们称为多边形栅格化算法,但由于不知道哪种方法最好/最快,我在这里无法为您提供帮助。