Rendere bianca l'area dei nodati di una panoramica ortofoto ricampionata?


9

Ho una serie di immagini ortofoto che sono tutte piene di dati, ma una volta messe insieme la copertura non forma un rettangolo quindi ci sono aree di nodati.

In MapGuide, devo essere in grado di visualizzare queste aree di nodati come bianche in modo che i miei utenti non debbano sprecare inchiostro nero durante la stampa.

Su larga scala, dove visualizzo direttamente immagini originali a piena risoluzione, questo non è un problema. Ho appena impostato il colore di sfondo della mia mappa su bianco e le aree in cui non ci sono ortofoto visualizzano lo sfondo.

Per quanto riguarda le prestazioni, devo essere in grado di unire tutte queste immagini sorgente in un'immagine panoramica composita ricampionata per la visualizzazione su scale più piccole in cui è possibile visualizzare contemporaneamente più ortofoto.

Ho tentato di utilizzare GDAL per unire e ricampionare la panoramica, ma per impostazione predefinita sembra creare il riquadro GeoTIFF composito ricampionato con il nero nelle aree dei nodati e MapGuide non mi consente di impostare il nero come trasparente sui raster di colore.

C'è un modo per ottenere in modo efficiente ciò che voglio?

Ho fornito la risposta che ho finito con l'utilizzo di GDAL, ma mi piacerebbe vedere soluzioni utilizzando altre utility di elaborazione delle immagini e applicazioni GIS, sia open source che proprietarie.

Risposte:


15

Il modo più semplice per me di affrontare questo problema era utilizzare il formato virtuale GDAL . Questo formato mi ha permesso di trattare l'intero insieme di immagini come un singolo oggetto immagine e di trasformarlo in tre passaggi relativamente semplici.

Creazione del set di dati virtuale

GDAL (compresi i binari Windows GISInternals di Tamas Szekeres e le versioni recenti di OSGeo4W ) include un'utilità chiamata gdalbuildvrt che può essere utilizzata per creare un set di dati virtuale iniziale.

Un modo semplice per utilizzarlo è aggiungere tutte le tue immagini a un file di testo e quindi utilizzare quel file di testo come input per gdalbuildvrt. Ecco un esempio (dovrai riportare il secondo comando su una riga):

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

Questo ti lascerà con un file XML che puoi trattare come una singola immagine per tutte le operazioni GDAL. Inoltre rappresenta internamente i nodati come bianchi, ma nasconde la definizione dei nodati dagli strumenti che ne leggono.

Creazione della panoramica ricampionata

Successivamente, eseguirai il ricampionamento e l'output dell'immagine panoramica. Puoi farlo con gdal_translate o gdalwarp . Per uno di questi, ricorda che la dimensione risultante sarà width * height * 3(numero di bande a 8 bit) Byte. Se questo sarà maggiore di 4 GB, ti consigliamo di esaminare le opzioni GeoTIFF per la sintassi per specificare BigTIFF come output (-co "BIGTIFF = YES").

Per gdal_translate, dovrai determinare le dimensioni dell'immagine virtuale usando il pratico comando gdalinfo . Prendi queste dimensioni e dividi ognuna per un fattore coerente per determinare la larghezza e l'altezza di output del tuo file in pixel.

Il comando avrà un aspetto simile (su una riga):

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

Per gdalwarp, dovrai conoscere la dimensione pixel risultante; in questo caso sto usando 0,5 metri. Ti consigliamo inoltre di effettuare una chiamata sul metodo di ricampionamento. Preferisco cubicspline per le panoramiche ortofoto. È più morbido, ma non li userai fino alla massima risoluzione e nella mia esperienza crea un'immagine più comprimibile se stai usando qualcosa come 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

Puoi anche prendere in considerazione l'utilizzo delle opzioni di compressione JPEG per queste panoramiche GeoTIFF ricampionate; riduce notevolmente il file di output con ( secondo Frank ) solo una penalità marginale per le prestazioni.

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

panoramiche

Dovrai anche eseguire il pratico comando gdaladdo sull'immagine risultante per creare "piramidi" interne, in modo che le richieste di risoluzioni inferiori rispetto alle dimensioni dell'immagine complete possano essere soddisfatte con un sottoinsieme di dati. L'aumento delle prestazioni è nella maggior parte dei casi degno dello spazio su disco. Ti consigliamo di giocare con i livelli che usi qui; per immagini molto grandi potresti essere in grado di rilasciarne alcune. Il comando gdaladdo è simile al seguente:

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

Suggerirei di sperimentare questi livelli per prestazioni ottimali. Potresti scoprire che un diverso intervallo di ricampionamento è migliore per la tua applicazione o, in base alle dimensioni dell'immagine, che puoi eliminare alcuni dei numeri più alti (o che sono necessari altri)

Inoltre, se stai generando una panoramica esterna (usando l'opzione -ro) considera l'aggiunta delle linee di configurazione della compressione JPEG:

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

(Credo che questi siano ereditati dal GeoTIFF principale per panoramiche incorporate)

Appunti

Di fronte a questo problema, ho chiesto sul canale #gdal su freenode.irc.net. Questa è una risorsa straordinaria, e sono in debito con Howard Butler, Frank Warmerdam e Even Rouault per avermi aiutato in questo.


Grazie per essere completo, per aver dedicato del tempo e sono sicuro che fosse giunto il momento di coprire l'intero flusso di lavoro e non solo il bit specifico che ha risposto alla domanda.
matt wilkie,

1
sarebbe interessante vedere se gdalsetnull.py funziona su VRT, quindi "modificare il file VRT in un editor di testo, aggiungendo un'entità <NoDataValue />" non sarebbe necessario.
matt wilkie,

1
@mil Wilkie, è stato sicuramente un po 'di lavoro riscrivere e formattare questo sito, ma l'ho anche trattato in precedenza come parte di un flusso di lavoro più ampio nel mio blog: jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal Quel suggerimento merita sicuramente una prova!
JasonBirch,

nota cmd generale di windows: usa il cursore ^per un'interruzione di riga che verrà unita quando eseguita (ad es. aggiungi ^alla fine di ogni riga di codice l'esempio sopra per mantenere sia la leggibilità che l'abilità di esecuzione). Avvertenza importante: non terminare mai un file o una riga di comando con un cursore a meno che non si desideri invocare consumare tutta la memoria
matt wilkie

3

Sì, ma attraverso prove ed errori sono stato in grado di determinare che -vrtnodata 255 ha l'effetto di contrassegnare tutto ciò che è bianco come un nodata, non solo sulla mappa, che gdal2tiles tratta quindi con trasparenza alfa secondo la bandiera -a.

Quindi finisci con alcune delle tue immagini sorgente impostate su trasparenti, nel mio caso le parti bianche delle strade tratteggiate. Questo non è un terminale, ma sarebbe sicuramente bello poter specificare a gdal2tiles il colore "no src image", sia come risultato dei vuoti originali nel vrt, sia come risultato dell'ordito. Per il mio set una tonalità di blu pallido sarebbe la cosa giusta.

Dopo ancora più tentativi ed errori sembra che la chiave sia l'hidenodata. Non so perché questi strumenti siano così minimamente documentati. Ecco cosa funziona per me, gdal 1.8.

gdalbuildvrt test.vrt -vrtnodata "209 231 245" -hidenodata BX*.tif BY*.tif
gdal2tiles -p raster -s nztm.prj test.vrt out

vedi anche l' utilità gdal nearblack gdal.org/programs/nearblack.html , che tratta solo i pixel attorno al bordo dell'immagine e ignora il centro
matt wilkie

0

Non ho familiarità con GDAL, ma immagino che sia disponibile un metodo o un comando in cui è possibile impostare un pixel di un determinato valore con un altro valore?

Niente a che fare con esso, ma in SQL semplice qualcosa del genere (solo per illustrare - questo è molto più pseudo-codice):

AGGIORNA raster SET pixel = 255 DOVE pixel = NoData;

Vorrei sapere la risposta!


GDAL include diversi metodi per sostituire i colori con altri colori durante l'elaborazione in un modo simile al tuo pseudocodice e un'utilità autonoma chiamata nearblack che ti consente di ripulire i bordi delle immagini contenenti artefatti di compressione e di renderli bianchi se lo desideri. Nessuno di questi ha funzionato bene con il volume di dati con cui stavo lavorando in quel momento.
JasonBirch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.