Pasar ortofoto de TIF a JPEG usando GDAL

Cómo pasar imagen de TIF a JPEG o mejor aún cómo pasar de TIF a TIF usando librería GDAL.

Planteamiento:

Tengo una ortofotografía en TIF que tiene un peso tamaño de 457 GB, entonces requiero algo mucho más ligero. Lo que mejor se me ocurre es obtener un JPEG. Pero hay que considerar que la ortofoto en TIF es una imagen RGBA, es decir, tiene una banda en el canal ALPHA, y es la que guarda la transparencia, aquello que nos permite ver el fondo. Y que la imagen en JPEG no tiene esa capacidad, es una imagen RGB. Aquello que es transparente terminará siendo negro.
TIF_con_transparencia_1

TIF_sin_transparencia_1
Las siguientes 3 ligas ayudan a entender el desarrollo:

1.- Blog de Paul Ramsey (http://blog.cleverelephant.ca/2015/02/geotiff-compression-for-dummies.html).

2.- Un posteo a la lista de correo de osgeo, gdal-dev (http://lists.osgeo.org/pipermail/gdal-dev/2012-July/033298.html).

3.- Manual del gdal_translate (http://www.gdal.org/gdal_translate.html).

Solución:

Caso 1.- Obtener una imagen en TIF con una compresión del tipo JPEG y que conserve la transparencia.

Tratando la imagen como una RGB:

$ gdal_translate -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -co TILED=YES alamedas_transparent_mosaic_group1.tif alamedas_transparent_mosaic_group1_JPEG_YCBCR.tif
Input file size is 38297, 16282
0ERROR 6: PHOTOMETRIC=YCBCR requires a source raster with only 3 bands (RGB)

¿Que ocurrió? Que la imagen no es del espacio de color RGB, tiene más de tres bandas. Se puede ver en la siguiente salida del comando gdalinfo:

$ gdalinfo alamedas_transparent_mosaic_group1.tif
Driver: GTiff/GeoTIFF
Files: alamedas_transparent_mosaic_group1.tif
Size is 38297, 16282



Band 1 Block=256x256 Type=Byte, ColorInterp=Red
NoData Value=-10000
Band 2 Block=256x256 Type=Byte, ColorInterp=Green
NoData Value=-10000
Band 3 Block=256x256 Type=Byte, ColorInterp=Blue
NoData Value=-10000
Band 4 Block=256x256 Type=Byte, ColorInterp=Alpha
NoData Value=-10000

En las últimas dos líneas, vemos que la Banda 4 es el canal Alpha. Entonces tengo una imagen: RGBA.

Tratando a la imagen como una RGBA:

$ gdal_translate alamedas_transparent_mosaic_group1.tif alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tif -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=RGB -co ALPHA=YES -co INTERLEAVE=BAND -co "TFW=YES"

¿Cuanto pesa la imagen nueva pesa?

$ ll alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tif
-rwxrwxrwx 1 root root 94360792 Feb 6 13:31 alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tif*

Caso 2.- Obtener una imagen en TIF aunque no conserve la transparencia.

Lo que hay que hacer es crear un TIF comprimido con una máscara interna desde la imagen RGBA, lo que la hace una RGB y permite utilizar la opción PHOTOMETRIC=YCBCR, teseleada y obteniendo archivo TFW. No habrá transparencia, pero para usar en AutoCAD quedará ligera:

$ gdal_translate alamedas_transparent_mosaic_group1.tif alamedas_transparent_mosaic_group1_withmask_teseled.tif -b 1 -b 2 -b 3 -mask 4 -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR --config GDAL_TIFF_INTERNAL_MAS YES -co "TFW=YES"

De lo cual obtenemos tres archivos:

$ ll alamedas_transparent_mosaic_group1_withmask_teseled*
-rwxrwxrwx 1 root root 2494337704 Feb 6 15:40 alamedas_transparent_mosaic_group1_withmask_teseled_rgba.tif*
-rwxrwxrwx 1 root root 90 Feb 8 15:58 alamedas_transparent_mosaic_group1_withmask_teseled.tfw*
-rwxrwxrwx 1 root root 33465415 Feb 8 15:58 alamedas_transparent_mosaic_group1_withmask_teseled.tif*
-rwxrwxrwx 1 root root 1020054 Feb 8 15:58 alamedas_transparent_mosaic_group1_withmask_teseled.tif.msk*

Nota1.- ¿Cuánto terminaron pesando las imágenes?
$ ll alamedas_transparent_mosaic_group1.tif
-rwxrwxrwx 1 root root 479057665 Jan 24 04:54 alamedas_transparent_mosaic_group1.tif*
$ ll alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tif
-rwxrwxrwx 1 root root 94360792 Feb 6 13:31 alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tif*
$ ll alamedas_transparent_mosaic_group1_withmask_teseled.tif
-rwxrwxrwx 1 root root 33465415 Feb 8 15:58 alamedas_transparent_mosaic_group1_withmask_teseled.tif*

Nota curiosa: Comparo los el resultado del archive TFW de la foto original y de la transformada y difieren por un par de centímetros. No tengo idea de qué pasó ahí, pero fuera de eso todo bien.
$ less alamedas_transparent_mosaic_group1.tfw
0.044150000000
0
0
-0.044150000000
472854.444060000067
2161849.453870000318
alamedas_transparent_mosaic_group1.tfw (END)

$ less alamedas_transparent_mosaic_group1_JPEG_RGBA_TILED.tfw
0.0441500000
0.0000000000
0.0000000000
-0.0441500000
472854.4661350001
2161849.4317950001
alamedas_transparent_mosaic_group1_JPEG_RGB.tfw (END)

Creo que es una deferencia que puede pasarse por alto porque la precisión de la ortfoto no va más allá de los 5 cm por pixel.

 

Leave a Reply

Your email address will not be published. Required fields are marked *