22 votos

¿Dividir una imagen .tif en varios mosaicos?

Tengo una imagen de tamaño 1GB (.tif), con el ancho y alto 94000x71680. Me gustaría trocear esta imagen en 20000X20000 azulejos para poder procesarlos.

¿Cómo puedo hacerlo?

0 votos

Anup, github.com/mapbox/rasterio te daría un array(s) numpy de tus datos de entrada. Podrías dividirlos usando métodos numpy o scipy y guardar cada parte en un nuevo archivo fácilmente. ¿Calificaría esta solución? Si es así, tienes que decir cómo deben tratarse los "bits desiguales" (71680 no es limpiamente divisible por 20000).

0 votos

En QGIS, si tiene el plugin Processing instalado y activo, obtendrá elementos de menú adicionales en el menú Raster, uno de los cuales es Extracción. Este tiene "Clip Raster by Extent", que es una pantalla que le permite dibujar una caja alrededor de un área y guardar como un GeoTiff. Esto me permitió eliminar áreas no deseadas en tiffs enormes, y el tiempo de procesamiento se redujo significativamente.

30voto

Geoffrey Puntos 228

Propongo dos soluciones: la primera usando QGIS, la segunda usando Python (GDAL).


Solución con QGIS

En QGIS puedes crear un mosaico VRT.

Siga este procedimiento (vea la imagen de abajo):

  1. Cargar la trama en el Panel de capas ;
  2. Haga clic con el botón derecho del ratón y elija Save As... ;
  3. Compruebe el Create VRT opción;
  4. Elija la carpeta donde se guardarán sus resultados;
  5. Establezca la extensión (si quiere trabajar en toda la trama, no modifique nada);
  6. Elegir si se utiliza la resolución actual (sugiero dejarla por defecto);
  7. Establezca el número máximo de columnas y filas (en su caso, debería ser de 20000 columnas y 2000 filas);
  8. Pulse el botón OK botón.

enter image description here

Por ejemplo, el uso de los parámetros en el cuadro de diálogo anterior en este raster de muestra (los parámetros que establezco son elegidos al azar):

enter image description here

generará 100 baldosas en la ruta especificada en el paso 4:

enter image description here

Al cargarlos en QGIS, tienen este aspecto:

enter image description here

Como bien dijo @bugmenot123 en los comentarios, el resultado se ve raro sólo porque el estilo de cada imagen se ajusta a la distribución de valores por imagen (pero los datos están perfectamente bien).


Solución con Python (GDAL)

Otra forma de obtener el mismo resultado es el uso de GDAL ( gdal_translate ).

En referencia al mismo ejemplo descrito anteriormente, puede utilizar este script:

import os, gdal

in_path = 'C:/Users/Marco/Desktop/'
input_filename = 'dtm_5.tif'

out_path = 'C:/Users/Marco/Desktop/output_folder/'
output_filename = 'tile_'

tile_size_x = 50
tile_size_y = 70

ds = gdal.Open(in_path + input_filename)
band = ds.GetRasterBand(1)
xsize = band.XSize
ysize = band.YSize

for i in range(0, xsize, tile_size_x):
    for j in range(0, ysize, tile_size_y):
        com_string = "gdal_translate -of GTIFF -srcwin " + str(i)+ ", " + str(j) + ", " + str(tile_size_x) + ", " + str(tile_size_y) + " " + str(in_path) + str(input_filename) + " " + str(out_path) + str(output_filename) + str(i) + "_" + str(j) + ".tif"
        os.system(com_string)

Evidentemente, tienes que adaptar los valores a tu caso concreto.

3 votos

Sólo un comentario rápido de que el ejemplo de cómo QGIS los renderiza se ve raro sólo porque el estilo se ajusta a la distribución de los valores por imagen . Los datos están perfectamente bien :)

0 votos

Gracias, en primer lugar por su respuesta realmente útil, pero quiero lograr el mismo resultado usando python? Me puede ayudar en eso también Porque es más manual en lugar de programática así.

0 votos

@bugmenot123 Gracias, edito la respuesta con tu útil comentario.

6voto

xenny Puntos 670

No te separes

Usted gdalbuildvrt Puedes crear baldosas virtuales que sólo utilizarán unos pocos bytes de tu disco. Entonces puedes usar la mayoría de los programas que tomarán tus vrt's como entrada para realizar tu procesamiento.

Como alternativa, prefiero buscar una herramienta que pueda trabajar con una imagen de 1Gb que dividir y fusionar una imagen. Por ejemplo, OTB tiene la mayoría de las capacidades para el procesamiento de imágenes estándar (y a veces avanzado) con imágenes grandes. Puede envolver OTB para Python o ejecutarlo desde QGIS o desde líneas de comando.

6voto

omouse Puntos 129

Otra solución que utiliza GDAL es el gdal_retile.py herramienta:

mkdir image_tiles
gdal_retile.py -v -r bilinear -levels 1 -ps 20000 20000 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir image_tiles big_input_image.tif

Para más información, consulte: http://www.gdal.org/gdal_retile.html

2voto

Usuario Borrado Puntos 876

Utilizando el Raster dividido puede dividir una trama en mosaicos basándose en algunos métodos de división, como el tamaño de cada baldosa o el número de baldosas .

Ver también Dividir un raster en ArcGIS

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X