numpy - instalar - Contornos alrededor de las regiones etiquetadas scipy en una grilla 2D
scipy doc (1)
Estoy tratando de encontrar los polígonos delimitadores de todos los totalizadores en una grilla 2D con un gran valor sin datos (1e6). Tengo el listado de agujeros trabajando usando la etiqueta de scipy. Sin sumergirse en la poligonalización de Gdal, ¿hay alguna manera fácil de generar los polígonos delimitadores? Veo que hay matplotlib.pylab.contour, pero esto intenta dibujar una trama, que realmente no quiero. ¿Alguna recomendación sobre cómo obtener polígonos de límite para cada etiqueta (preferiblemente con una forma de simplificar un poco los polígonos si es posible)? Estoy seguro de que puedo escribir algo que recorra los límites de cada hoyo etiquetado, pero ¿hay algo que ya exista?
from osgeo import gdal
from scipy import ndimage
dem_file = gdal.Open(''dem.tif'')
dem = dem.file.GetRasterBand(1).ReadAsArray()
# Get a binary image of the no-data regions. The no-data value is large
bin = dem > 9e5
# Find all the wholes. Anything with a label > 0.
labels, num_labels = ndimage.measurements.label(bin)
num_labels
1063
# The hole''s label and size. Skip 0 as that label has all the valid data.
holes = [(label, sum(labels==label)) for label in range(1, num_labels)]
holes[:3]
[(1, 7520492),
(2, 1),
(3, 1),]
por ejemplo, en lugar de contar, estoy buscando los límites de todas estas regiones blancas como se ve en qgis, que se hizo con gdal_polygonalize.py.
Gracias a Joe Kington por señalarme Scikit Image.
from skimage import measure
contours = measure.find_contours(labels, 1)
contours[-1]
array([[ 2686.99905927, 1054. ],
[ 2686. , 1053.00094073],
[ 2685.00094073, 1054. ],
[ 2686. , 1054.99905927],
[ 2686.99905927, 1054. ]])
imshow(labels)
for n, contour in enumerate(contours):
plt.plot(contour[:,1], contour[:, 0], linewidth=2)
Después de acercar la esquina inferior izquierda: