¿Debería configurarse GDAL para producir archivos GeoTIFF con compresión? ¿Qué algoritmo debería usarse?

51

Tengo una carpeta de datos SIG que consta principalmente de archivos GeoTIFF. Todo el conjunto pesa aproximadamente 1.2 GB. Me di cuenta de que si empaco el contenido en un tarball, se rompe a aproximadamente 82 MB. Me gustaría verificar el conjunto en un sistema de control de revisión para que otras personas puedan trabajarlo y parece que hay algo de espacio que se puede exprimir.

La página del controlador GDAL GeoTIFF enumera muchas opciones que pueden usarse para crear archivos GeoTIFF comprimidos. También hay muchas opciones que afectan la forma en que funciona cada algoritmo.

La página de ayuda hace un buen trabajo al describir las opciones, pero no detalla cómo seleccionar un algoritmo o las compensaciones asociadas con el nivel variable de compresión. Esto lleva a las siguientes preguntas:

  • Las ventajas de usar la compresión son un ahorro espectacular en el espacio. ¿Cuáles son los contras? ¿Se pierde información cuando se comprime la imagen?

  • ¿Cómo se debe elegir un algoritmo y un nivel de compresión? ¿Se prestan algunos tipos de imágenes a un cierto algoritmo?

marcador, rotulador
fuente

Respuestas:

86

Para seleccionar el método de compresión, necesita usar un comando como:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Cuando usa la compresión, la mayor compensación es el tiempo de procesamiento adicional que se requiere para descomprimir la imagen, y después de descomprimir la imagen aún consumiría la misma cantidad de memoria. Sobre la pérdida de información hay dos tipos básicos de compresión :

  • sin pérdidas, que conservan los valores de datos originales
  • con pérdida - que degrada los datos para ahorrar aún más espacio

Utilizaría algoritmos sin pérdidas cuando se deben preservar los valores de datos originales, como DEM o características ráster. Algoritmos como PACKBITS , DEFLATE y LZW no tienen pérdidas y se pueden pedir según la relación de compresión:

  1. LZW: relación de compresión más alta, potencia de procesamiento más alta
  2. DESINFLAR
  3. PACKBITS: relación de compresión más baja, potencia de procesamiento más baja

La relación de compresión todavía depende de los datos, si los datos tienen muchos valores similares, los PACKBITS producirán buenos resultados.

Al contrario de sin pérdida, usaría algoritmos con pérdida como JPEG para comprimir rásteres que no tienen que devolver valores exactos. Por ejemplo, las ortofotos o las imágenes satelitales se pueden comprimir utilizando algoritmos con pérdida.

dodobas
fuente
55
+1 por la buena respuesta. PACKBITS es una forma de codificación de longitud de ejecución ( en.wikipedia.org/wiki/Run-length_encoding ) que funcionará bien para datos con muchos valores adyacentes (si, por ejemplo, tiene muchos NULL o un ráster clasificado) y LZW es un algoritmo más robusto que es efectivo en más tipos de datos. La compensación general es entre espacio y velocidad como se mencionó, por lo que lo apropiado depende de su uso y datos. Además, algunos programas no admiten ciertos tipos de compresión GeoTiff.
scw
3
esta es una publicación buena y relevante linfiniti.com/2011/05/…
oeon
1
Buena respuesta, resume bien tus opciones. Recuerde también que cada uno de esos métodos de compresión tiene parámetros que puede establecer, lo que influirá considerablemente en el resultado. @ j03lar50n, me alegra que haya encontrado útil mi artículo de blog ...
R Thiede
hermosa respuesta! tan simple y directo al grano.
sys49152
@scw, ¿podría decir más sobre qué software no admite ciertos tipos de compresión? Específicamente, ¿hay algún software que no sea compatible con lzw o packbits? ¿O se refiere principalmente a algoritmos menos comunes?
David LeBauer
29

Con lzwy deflatecompresión utilizando -co predictor=2ayuda lata con imágenes que está variando sin problemas, ya que comprime las diferencias de píxel a píxel en lugar de los valores absolutos, y éstos tienden a ser pequeñas y tienen más patrones ( ref ). Predictor sólo es útil con lzwy deflatecompresión, la opción no tiene efecto con otros métodos.

gdal_translate -co compress=lzw -co predictor=2 ...

El ahorro predictivo puede ser dramático. Acabo de volver a comprimir un directorio de modelos de elevación geotiff de 16 bits usando hasta 17 GB con la configuración predeterminada de LZW en solo 5 GB con predictor = 2.

Hay información contradictoria sobre las diferencias entre los predictores 2 y 3 y cuándo cada uno se aplica mejor ( ref1 , ref2 ). Quizás combustible para otra pregunta.

Otra opción fácil para ahorrar es -co tiled=yes. Hay algunos programas que no pueden leer imágenes en mosaico, pero se están volviendo cada vez más raros y en su mayoría fuera de SIG (ahora no conozco ningún software GIS de transmisión principal que no los lea).

Para aprovechar la respuesta de @ alfonx de usar vistas generales comprimidas : esto permite que la imagen base se almacene sin pérdidas, para la integridad de los datos, y las pirámides con pérdidas, para la velocidad y algunos ahorros de espacio. Es casi lo mejor de ambos mundos. Para las vistas generales más pequeñas posibles con gdaladdoimágenes RGB: use compresión jpeg, remuestreo promediado o gaussiano en lugar del vecino más cercano predeterminado (hace que las vistas generales sean más suaves) y una vista general fotométrica YCBCR. Consulte la página de referencia de gdaladdo para obtener más información sobre estas opciones (aunque no dice mucho sobre de qué se trata la fotometría).

Esto es parte de un archivo por lotes de Windows que uso para aplicar vistas generales externas de JPEG a todos los tiffs en un directorio:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

Notas

GDAL 1.6.0 introdujo el gaussremuestreo que puede conducir a mejores resultados averageen caso de bordes afilados con alto contraste o patrones ruidosos. Deben usarse potencias de 2 niveles (2 4 8 ...) para seleccionar un núcleo gaussiano de remuestreo 3x3.

JPEG_QUALITY_OVERVIEW 85 - si no se especifica, se utiliza el valor predeterminado del 75%, lo que produce un archivo más pequeño, pero encuentro que el 85% es un compromiso mejor en el intercambio de tamaño frente a calidad

Actualización, 2015: GDAL 1.8 y 2.0 han introducido muchas opciones nuevas no cubiertas aquí y que no he tenido tiempo de digerir. Lea la página oficial de formato gtiff , estoy seguro de que hay configuraciones adicionales útiles detalladas.

wilkie mate
fuente
10

Para grandes rásteres, GeoTiff ofrece la posibilidad de almacenar vistas previas (pre) reducidas como imágenes adicionales en el archivo GeoTiff. Esto se puede hacer con gdaladdo (= Descripción general de GDAL ADD). Al crear estas vistas generales, puede decirle manualmente a gdal que las comprima también:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Acelera la visualización de sus datos sin agregar demasiado tamaño. Nota: las aplicaciones de Geotools como Geoserver, uDig, AtlasStyler, Geopublisher pueden usar esta función y beneficiarse de las vistas generales.

alfonx
fuente
6

Para habilitar la descompresión parcial de la imagen, simplemente use TILED = YES.

Peter

Peter Hopfgartner
fuente
4

En última instancia, probablemente necesite experimentar con las diferentes opciones y ver qué satisface sus necesidades.

He estado haciendo un uso cada vez mayor de GeoTIFF comprimido JPEG en formatos basados ​​en wavelet. Mis resultados han sido bastante buenos. El uso de GDAL para hacer esto ha arrojado relaciones de compresión comparables a los formatos basados ​​en wavelets sin demasiada pérdida de datos. El éxito en el rendimiento que viene con la descompresión ha sido aceptable.

Lo que más me gusta de este enfoque es que el soporte GeoTIFF es casi universal, mientras que el soporte para formatos basados ​​en wavelet no siempre está asegurado y a veces está sujeto a problemas espinosos de licencia.

Roger D.
fuente
3

Mi experiencia al comparar la compresión ECW ( Wavelet comprimida mejorada ) de GeoTIFF frente a Earth Resource Mapping es que ECW es mucho mejor cuando se comprimen fotos aéreas de alta resolución. Otra ventaja importante de la compresión basada en wavelets es que, a diferencia de los formatos más antiguos como GeoTIFF, JPEG, no JPEG 2000 , solo una parte de la imagen puede descomprimirse [ref. 1] No se debe subestimar la importancia de esta ventaja, especialmente cuando se trabaja con "más de la mitad del tamaño de la memoria de la computadora".

Parece, nunca tuve la oportunidad de probarlo, que MrSID , otro formato de archivo propietario basado en wavelet, también exhibe relaciones de compresión más altas que los formatos "más antiguos" y la descompresión selectiva.

árbitro. 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf

dariapra
fuente
1
Dariapra, recuerde que GeoTIFF-Packbits o GeoTIFF-LZW son compresiones sin pérdidas, mientras que ECW y JPEG son con pérdidas. La compresión sin pérdida o con pérdida debe elegirse cuidadosamente dependiendo del uso futuro de datos.
markusN
1
No estoy afirmando que un formato de compresión flexible sea siempre un formato de almacenamiento válido. Lo que quería decir es que usar un formato como ECW es adecuado en algunos entornos de producción. Por ejemplo, ECW es un formato más adecuado que GeoTIFF si tenemos una instancia de MapServer que sirve capas de ortofoto a través de WMS. Nada prohíbe que también almacene la ortofoto usando compresión sin pérdidas.
dariapra
3

Las respuestas de @dodobas y @ matt-wilkie cubren casi todo lo relacionado con los actos de compresión y desenfoque con GDAL para reducir el tamaño de la imagen.

Me gustaría agregar dos cosas:

  • la documentación en formato de archivo de GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Vea las opciones de creación ( -co), específicamente:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • y que es esencial verificar que el software que consumirá los GeoTIFFs:
    • admite el método de compresión deseado;
    • recomienda usar compresión.

Por ejemplo, GeoServer no recomienda comprimir GeoTIFF :

Como nota final, Geotiff admite varios tipos de compresión, pero sugerimos no usarlo. Si bien permite archivos mucho más pequeños, el proceso de descompresión es costoso y se realizará en cada acceso a datos, lo que ralentizará significativamente el procesamiento. En nuestra experiencia, el tiempo de descompresión es mayor que la lectura de datos del disco puro.

Esto es especialmente cierto si ya utiliza vistas generales, mosaico y medios de almacenamiento de alto rendimiento (disco de grado empresarial o SSD).

Kevin
fuente
También necesito comprimir mi imagen jpeg porque no puedo convertir mi ráster a matriz con gdalin Python. Está mostrando un error de memoria y, a veces, sin memoria. ¿Alguien podría tener alguna idea de cómo puedo implementar esta línea (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) en python. Soy nuevo en el uso de gdal. Entonces, a veces me cuesta entender la estructura.
Shiuli Pervin
1
@ShiuliPervin, Primero, JPEG ya es un formato comprimido (con pérdida). En segundo lugar, parece que tienes un problema de fragmentación, no de compresión. Lea el archivo en mosaicos, tiras o fragmentos, en lugar de todos a la vez. Incluso si el archivo está comprimido, tendrá que descomprimirlo cuando lo use (por ejemplo: si un archivo de 4 GB usa 2 GB en el disco cuando está comprimido, aún ocupará 4 GB de RAM cuando todo esté cargado para su procesamiento. alternativa de ahorro de espacio, es posible que desee buscar un formato escaso para GeoTIFFs .
Kevin
1
@ShiuliPervin, sin embargo, puedo estar malentendiendo tu pregunta. La compresión en sí misma a menudo usa mucha memoria, pero no debe desbordar su sistema, a menos que haya un error en la biblioteca o se le dé un argumento no válido. Si tiene problemas con JPEG como el tipo de compresión para un GeoTIFF, tal vez intente con LZMA o DEFLATE.
Kevin
0

Para aquellos que usan versiones más nuevas de GDAL, también están disponibles las opciones de compresión ZStandard ( ZSTD ) sin pérdidas (GDAL> = 2.3) y compresión con compresión de trama de error limitado ( LERC ) con pérdidas (GDAL> = 2.4).

En términos generales, sin embargo, ZSTDofrece velocidades de lectura de datos más rápidas que ambas LZWy DEFLATEcon relaciones de compresión similares, aunque puede ser algo más lento al escribir el archivo (dependiendo de la configuración que use).

Si no está tan preocupado por la precisión de los datos (por ejemplo, solo haciendo visualización en lugar de análisis), entonces LERCpodría ser una buena opción. Hay una MAX_Z_ERRORconfiguración que le permite ajustar la precisión que está dispuesto a sacrificar. Por ejemplo, a MAX_Z_ERROR=0.001o 1 mm dio un ahorro de espacio del 50% en un punto de referencia (ver ref .).

¡La mejor parte es que también puedes combinarlo LERCcon el ZSTDuso COMPRESS=LERC_ZSTD! O si prefieres usar DEFLATE, puedes hacerlo COMPRESS=LERC_DEFLATE. Consulte también la lista completa de combinaciones / configuraciones en los documentos oficiales de GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Se pueden encontrar más detalles y comparaciones completas de referencia en esta valiosa referencia:

weiji14
fuente