Delimitación de cuerpos de agua (lagos) de Landsat 8 con inteligencia artificial usado Python y QGIS

delimitateWaterBodiesMachineLearningPythonandQGIS2.jpg

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()
output_3_0.png

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()
output_5_0.png

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()

 

Suscríbete a nuestro boletín electrónico

Suscríbase a nuestro boletín gratuito para recibir noticias, datos interesantes y fechas de nuestros cursos en recursos hídricos.

 

Posted on March 30, 2021 and filed under TutorialQGIS.