我有一个布尔数组,其中包含一个连接的True值组件,我想将其边界转换为多边形,例如在 shapely 中。
假设我的数组是img,我可以得到这样的边界索引
import numpy as np
from skimage.morphology binary_erosion
border_indices = np.transpose(np.nonzero(np.logical_xor(binary_erosion(img), img)))
Run Code Online (Sandbox Code Playgroud)
但是仅仅将它们输入到一个shapely.Polygon对象中是行不通的,因为这些点不是沿着边界排序的,而是按照递增x和y值排序的。
可能可以使用 alpha 形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以建议一种更简单的方法来获得边界多边形,最好是直接对原始数组进行操作。
这听起来像是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)
Run Code Online (Sandbox Code Playgroud)
shapes是一个带有(几何,值)对的生成器。要获取与值等于 1 的位置对应的几何图形:
polygons = [shapely.geometry.Polygon(shape[0]["coordinates"][0]) for shape in shapes if shape[1] == 1]
Run Code Online (Sandbox Code Playgroud)
这将创建shapely与数组中值等于 1 的区域相对应的多边形列表。
print(polygons)
[<shapely.geometry.polygon.Polygon object at 0x7f64bf9ac9e8>]
Run Code Online (Sandbox Code Playgroud)