¿Hacer que el área de nodos de una vista general de ortofoto muestreada sea blanca?

9

Tengo un conjunto de imágenes de ortofoto que están completamente llenas de datos, pero cuando se colocan juntas, la cobertura no forma un rectángulo, por lo que hay áreas de datos.

En MapGuide, necesito poder mostrar estas áreas de nodos como blancas para que mis usuarios no tengan que desperdiciar tinta negra al imprimir.

A gran escala, donde visualizo imágenes originales de resolución completa directamente, esto no es un problema. Simplemente configuré el color de fondo de mi mapa en blanco, y las áreas donde no hay ortofotos muestran el fondo.

Para el rendimiento, necesito poder fusionar todas estas imágenes de origen en una imagen general compuesta muestreada de nuevo para mostrar a escalas más pequeñas donde se pueden ver más de las ortofotos a la vez.

He estado tratando de usar GDAL para fusionar y volver a muestrear la descripción general, pero de manera predeterminada parece crear el mosaico GeoTIFF compuesto muestreado con negro en las áreas de nodata, y MapGuide no me permite establecer el negro como transparente en los rásteres de color.

¿Hay alguna manera de obtener de manera eficiente lo que quiero?

He proporcionado la respuesta con la que terminé usando GDAL, pero me encantaría ver soluciones con otras utilidades de procesamiento de imágenes y aplicaciones SIG, tanto de código abierto como patentadas.

JasonBirch
fuente

Respuestas:

15

La forma más fácil de resolver este problema fue utilizar el formato virtual GDAL . Este formato me permitió tratar todo el conjunto de imágenes como un solo objeto de imagen y transformarlo en tres pasos relativamente simples.

Crear el conjunto de datos virtual

GDAL (incluidos los binarios de Windows GISInternals de Tamas Szekeres y las versiones recientes de OSGeo4W ) incluye una utilidad llamada gdalbuildvrt que se puede utilizar para construir un conjunto de datos virtual inicial.

Una forma simple de usar esto es agregar todas sus imágenes a un archivo de texto y luego usar ese archivo de texto como entrada para gdalbuildvrt. Aquí hay un ejemplo (deberá volver a colocar el segundo comando en una línea):

dir /b *.tif > my_images.txt
gdalbuildvrt 
  -hidenodata 
  -vrtnodata "255 255 255" 
  -resolution highest 
  -input_file_list my_images.txt 
  my_image.vrt

Esto lo dejará con un archivo XML que puede tratar como una sola imagen para todas las operaciones de GDAL. También representa internamente los nodatos como blancos, pero oculta la definición de nodos de las herramientas que leen.

Crear el resumen muestreado

A continuación, realizará el remuestreo y la salida de la imagen general. Puede hacer esto con gdal_translate o gdalwarp . Para cualquiera de estos, recuerde que el tamaño resultante será width * height * 3(número de bandas de 8 bits) Bytes. Si esto será mayor a 4GB, querrá ver las opciones de GeoTIFF para la sintaxis para especificar BigTIFF como su salida (-co "BIGTIFF = YES").

Para gdal_translate, deberá determinar las dimensiones de la imagen virtual utilizando el práctico comando gdalinfo . Tome estas dimensiones y divídalas por un factor consistente para determinar el ancho y la altura de salida de su archivo en píxeles.

El comando se verá algo así (en una línea):

gdal_translate
  -outsize 53120 14000
  -co "TILED=YES"
  -co "PROFILE=GEOTIFF"
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt
  my_image.tif

Para gdalwarp, necesitará saber el tamaño de píxel resultante; en este caso estoy usando .5 metro. También querrá hacer una llamada sobre el método de remuestreo. Prefiero cubicspline para vistas generales de ortofoto. Es más suave, pero no los usará a resolución completa y, en mi experiencia, crea una imagen más comprimible si usa algo como JPEG o ECW.

gdalwarp 
  -r cubicspline 
  -of GTiff 
  -dstnodata "255 255 255" 
  -tr 0.5 0.5 
  -co "PROFILE=GEOTIFF" 
  -co "BIGTIFF=YES" 
  -co "TILED=YES" 
  -co "BLOCKXSIZE=256"
  -co "BLOCKYSIZE=256"
  my_image.vrt 
  my_image.tif

También es posible que desee considerar el uso de opciones de compresión JPEG para estas vistas generales de GeoTIFF remuestreadas; reduce considerablemente el archivo de salida con ( según Frank ) solo una penalización de rendimiento marginal.

  -co "COMPRESS=JPEG" 
  -co "JPEG_QUALITY=80" 
  -co "PHOTOMETRIC=YCBCR"

Resúmenes

También querrá ejecutar el práctico comando gdaladdo sobre la imagen resultante para construir "pirámides" internas, de modo que las solicitudes de resoluciones más bajas que las dimensiones de la imagen completa se puedan cumplir con un subconjunto de datos. El aumento en el rendimiento vale más que el espacio en disco en la mayoría de los casos. Querrás jugar con los niveles que usas aquí; para imágenes muy grandes, puede dejar caer algunas. El comando gdaladdo se parece a esto:

gdaladdo 
  -r average 
  my_image.tif 
  2 4 8 16 32 64 128 256

Sugeriría experimentar con estos niveles para un rendimiento óptimo. Puede encontrar que un intervalo de muestreo diferente es mejor para su aplicación o, en función del tamaño de su imagen, que puede eliminar algunos de los números más altos (o que se necesitan más)

Además, si está generando una descripción general externa (usando la opción -ro) considere agregar las líneas de configuración de compresión JPEG:

  --config COMPRESS_OVERVIEW JPEG 
  --config PHOTOMETRIC_OVERVIEW YCBCR 
  --config INTERLEAVE_OVERVIEW BAND 

(Creo que estos se heredan del GeoTIFF principal para las vistas generales incrustadas)

Notas

Cuando me enfrenté a este problema, pregunté en el canal #gdal en freenode.irc.net. Este es un recurso increíble, y estoy totalmente en deuda con Howard Butler, Frank Warmerdam e Even Rouault por ayudarme con esto.

JasonBirch
fuente
Gracias por completar, por tomarse el tiempo, y estoy seguro de que era el momento, para cubrir todo el flujo de trabajo y no solo el bit específico que respondió la pregunta.
matt wilkie
1
sería interesante ver si gdalsetnull.py funciona en los VRT, luego "editar el archivo VRT en un editor de texto, agregar una entidad <NoDataValue />" sería innecesario.
matt wilkie
1
@matt wilkie, definitivamente fue un poco de trabajo reescribir y formatear para este sitio, pero también cubrí esto anteriormente como parte de un flujo de trabajo más amplio en mi blog: jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal ¡Definitivamente vale la pena probar esa sugerencia!
JasonBirch
Nota general de cmd de Windows: use el cursor ^para un salto de línea que se unirá cuando se ejecute (por ejemplo, agregue ^al final de cada ejemplo de línea de código anterior para mantener tanto la legibilidad como la capacidad de ejecución). Advertencia importante: nunca finalice un archivo o línea de comando con un cursor a menos que desee invocar consumir toda la memoria
matt wilkie
3

Sí, pero a través de prueba y error pude determinar que -vrtnodata 255 tiene el efecto de marcar todo lo que es blanco como nodata, no solo fuera del mapa, que gdal2tiles trata con transparencia alfa según la bandera -a.

Entonces terminas con parte de tu imagen de origen configurada en transparente, en mi caso, las partes blancas de las carreteras discontinuas. Este no es un terminal, pero seguro que sería bueno poder especificar a gdal2tiles el color "sin imagen src", ya sea como resultado de vacíos originales en el vrt, o como resultado de la deformación. Para mi conjunto, un tono de azul pálido sería justo lo correcto.

Después de más prueba y error, parece que hidenodata es la clave. No sé por qué estas herramientas están tan mínimamente documentadas. Aquí está lo que funciona para mí, gdal 1.8.

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out
Peter
fuente
también vea la utilidad gdal nearblack gdal.org/programs/nearblack.html , que solo trata los píxeles alrededor del borde de la imagen e ignora el medio
matt wilkie
0

No estoy demasiado familiarizado con GDAL, pero supongo que hay un método o comando disponible donde puede establecer un píxel de cierto valor con otro valor.

No tiene nada que ver con eso, pero en SQL simple algo como (solo para ilustrar, esto es mucho más pseudocódigo):

ACTUALIZAR ráster SET pixel = 255 DONDE pixel = NoData;

¡Me gustaría saber la respuesta!

George Silva
fuente
GDAL incluye varios métodos para reemplazar colores con otros colores durante el procesamiento de una manera similar a su pseudocódigo, y una utilidad independiente llamada nearblack que le permite limpiar los bordes de la imagen que contienen artefactos de compresión y convertirlos en blanco si lo desea. Ninguno de estos funcionó bien con el volumen de datos con el que estaba trabajando en ese momento.
JasonBirch