El proceso de recuperación de información de imágenes satelitales puede llevar mucho tiempo y enfrenta desafíos como la resolución de la imagen, el reconocimiento de características y los criterios del usuario. Con el uso de herramientas de aprendizaje automático, podemos preprocesar imágenes y combinarlas con herramientas estándar de QGIS para delinear objetos de una manera mucho más eficiente.
Hemos realizado un tutorial para la delimitación de cuerpos de agua como lagos a partir de una imagen pancromática de Landsat 8. El tutorial muestra un procedimiento mixto que detecta bordes con Python y Scikit Image, traza rutas con QGIS y el complemento Trace Raster y finalmente obtiene la extensión del lago como Shapefile.
Los archivos de entrada están disponibles en este repositorio de Github:
https://github.com/SaulMontoya/delimitateWaterBodiesMachineLearningPythonandQGIS.git
y también desde este enlace.
Para ejecutar la imagen hakuchik desde Docker, simplemente escriba esto en Powershell:
docker run -it --name hakuchik -p 8888:8888 -p 6543:5432 hatarilabs/hakuchik:a2d1cb82a605
Tutorial
Código
Este es el código en Python que detecta los bordes del lago:
Import required packages
#python and matplotlib libraries
import numpy as np
import matplotlib.pyplot as plt
#geospatial libraries
import rasterio
#machine learning libraries
#!pip install scikit-image
from skimage import feature
Import raster and read band
imgRaster = rasterio.open('../Rst/landsatImage.tif')
im = imgRaster.read(1)
fig = plt.figure(figsize=(12,8))
plt.imshow(im)
plt.show()
Canny filter
# Compute the Canny filter for two values of sigma
edges1 = feature.canny(im)
edges2 = feature.canny(im, sigma=3)
# display results
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3, figsize=(18, 6),
sharex=True, sharey=True)
ax1.imshow(im, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('noisy image', fontsize=20)
ax2.imshow(edges1, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title(r'Canny filter, $\sigma=1$', fontsize=20)
ax3.imshow(edges2, cmap=plt.cm.gray)
ax3.axis('off')
ax3.set_title(r'Canny filter, $\sigma=3$', fontsize=20)
fig.tight_layout()
plt.show()
Export edges as geospatial TIFF
rasterOut = rasterio.open(
'../Rst/landsatImage_edges2.tif',
'w',
driver='GTiff',
height=edges2.shape[0],
width=edges2.shape[1],
count=3,
dtype=im.dtype,
crs=imgRaster.crs,
transform=imgRaster.transform)
rasterOut.write(np.uint8(edges2*60),1)
rasterOut.write(np.uint8(edges2*120),2)
rasterOut.write(np.uint8(edges2*180),3)
rasterOut.close()