python:布尔数组到多边形

时间:2016-06-18 14:33:29

标签: python shapely

我有一个布尔数组,其中包含一个True值的连接组件,我希望将其边框转换为多边形,例如身材匀称。

假设我的数组是img,我可以得到像这样的边界索引

import numpy as np
from skimage.morphology binary_erosion

border_indices = np.transpose(np.nonzero(np.logical_xor(binary_erosion(img), img)))

但只是将它们送入shapely.Polygon对象不起作用,因为这些点不是沿边界排序的,而是增加xy值。

有可能使用alpha形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以提出一种更简单的方法来获取边界多边形,理想情况下直接在原始数组上运行

1 个答案:

答案 0 :(得分:2)

听起来rasterio.features.shapes正是您所寻找的。一个简单的例子应说明程序:

import rasterio.features
import shapely.geometry
import numpy as np

im = np.zeros([5, 5], dtype=np.uint8)
im[1:-1, 1:-1] = 1

shapes = rasterio.features.shapes(im)

shapes是一对具有(几何,值)对的生成器。要获得与值等于1的位置对应的几何:

polygons = [shapely.geometry.Polygon(shape[0]["coordinates"][0]) for shape in shapes if shape[1] == 1]

这会创建一个shapely个多边形列表,对应于数组中值等于1的区域。

print(polygons)
[<shapely.geometry.polygon.Polygon object at 0x7f64bf9ac9e8>]