我有一个布尔数组,其中包含一个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
对象不起作用,因为这些点不是沿边界排序的,而是增加x
和y
值。
有可能使用alpha形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以提出一种更简单的方法来获取边界多边形,理想情况下直接在原始数组上运行
答案 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>]