SciPy Create 2D Polygon Mask

后端 未结 6 886
慢半拍i
慢半拍i 2020-11-29 19:07

I need to create a numpy 2D array which represents a binary mask of a polygon, using standard Python packages.

  • input: polygon vertices, image dimensions
  • <
6条回答
  •  攒了一身酷
    2020-11-29 19:52

    As a slightly more direct alternative to @Anil's answer, matplotlib has matplotlib.nxutils.points_inside_poly that can be used to quickly rasterize an arbitrary polygon. E.g.

    import numpy as np
    from matplotlib.nxutils import points_inside_poly
    
    nx, ny = 10, 10
    poly_verts = [(1,1), (5,1), (5,9),(3,2),(1,1)]
    
    # Create vertex coordinates for each grid cell...
    # (<0,0> is at the top left of the grid in this system)
    x, y = np.meshgrid(np.arange(nx), np.arange(ny))
    x, y = x.flatten(), y.flatten()
    
    points = np.vstack((x,y)).T
    
    grid = points_inside_poly(points, poly_verts)
    grid = grid.reshape((ny,nx))
    
    print grid
    

    Which yields (a boolean numpy array):

    [[False False False False False False False False False False]
     [False  True  True  True  True False False False False False]
     [False False False  True  True False False False False False]
     [False False False False  True False False False False False]
     [False False False False  True False False False False False]
     [False False False False  True False False False False False]
     [False False False False False False False False False False]
     [False False False False False False False False False False]
     [False False False False False False False False False False]
     [False False False False False False False False False False]]
    

    You should be able to pass grid to any of the scipy.ndimage.morphology functions quite nicely.

提交回复
热议问题