Den Knotenbereich einer neu abgetasteten Orthofoto-Übersicht weiß machen?

9

Ich habe eine Reihe von Orthofotobildern, die jeweils vollständig mit Daten gefüllt sind, aber wenn sie zusammengefügt werden, bildet die Abdeckung kein Rechteck, sodass Knotenbereiche vorhanden sind.

In MapGuide muss ich in der Lage sein, diese Knotenbereiche als weiß anzuzeigen, damit meine Benutzer beim Drucken keine schwarze Tinte verschwenden müssen.

Im großen Maßstab, wo ich Originalbilder in voller Auflösung direkt anzeige, ist dies kein Problem. Ich habe gerade die Hintergrundfarbe meiner Karte auf Weiß eingestellt, und die Bereiche, in denen keine Orthofotos vorhanden sind, zeigen den Hintergrund an.

Für die Leistung muss ich in der Lage sein, alle diese Quellbilder zu einem neu abgetasteten zusammengesetzten Übersichtsbild zusammenzuführen, um sie in kleineren Maßstäben anzuzeigen, in denen mehr Orthofotos gleichzeitig sichtbar sind.

Ich habe versucht, GDAL zum Zusammenführen und erneuten Abtasten der Übersicht zu verwenden, aber standardmäßig wird die neu abgetastete zusammengesetzte GeoTIFF-Kachel mit Schwarz in den Knotenbereichen erstellt, und MapGuide erlaubt mir nicht, Schwarz als transparent für Farbraster festzulegen.

Gibt es eine Möglichkeit für mich, effizient zu bekommen, was ich will?

Ich habe die Antwort gegeben, die ich letztendlich mit GDAL erhalten habe, würde aber gerne Lösungen mit anderen Bildverarbeitungsprogrammen und GIS-Anwendungen sehen, sowohl Open Source als auch proprietär.

JasonBirch
quelle

Antworten:

15

Der einfachste Weg für mich, dieses Problem zu lösen, war die Verwendung des virtuellen GDAL-Formats . Mit diesem Format konnte ich den gesamten Satz von Bildern als ein einzelnes Bildobjekt behandeln und in drei relativ einfachen Schritten transformieren.

Erstellen des virtuellen Datensatzes

GDAL (einschließlich der Windows-Binärdateien von Tamas Szekeres für GISInternals und neuerer Versionen von OSGeo4W ) enthält ein Dienstprogramm namens gdalbuildvrt, mit dem ein erstes virtuelles Dataset erstellt werden kann.

Eine einfache Möglichkeit, dies zu verwenden, besteht darin, alle Ihre Bilder einer Textdatei hinzuzufügen und diese Textdatei dann als Eingabe für gdalbuildvrt zu verwenden. Hier ist ein Beispiel (Sie müssen den zweiten Befehl wieder in eine Zeile setzen):

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

Dadurch erhalten Sie eine XML-Datei, die Sie für alle GDAL-Vorgänge als ein einziges Image behandeln können. Es stellt Nodata auch intern als weiß dar, verbirgt jedoch die Nodata-Definition vor Tools, die daraus lesen.

Erstellen der neu abgetasteten Übersicht

Als Nächstes führen Sie das Resampling und die Ausgabe des Übersichtsbilds durch. Sie können dies entweder mit gdal_translate oder gdalwarp tun . Denken Sie bei beiden daran, dass die resultierende Größe width * height * 3(Anzahl der 8-Bit-Bänder) Bytes beträgt. Wenn dies größer als 4 GB ist, sollten Sie sich die GeoTIFF-Optionen für die Syntax ansehen, um BigTIFF als Ausgabe anzugeben (-co "BIGTIFF = YES").

Für gdal_translate müssen Sie die Abmessungen des virtuellen Bildes mit dem praktischen Befehl gdalinfo bestimmen . Nehmen Sie diese Dimensionen und dividieren Sie sie durch einen konsistenten Faktor, um die Ausgabebreite und -höhe Ihrer Datei in Pixel zu bestimmen.

Der Befehl sieht ungefähr so ​​aus (in einer Zeile):

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

Für gdalwarp müssen Sie die resultierende Pixelgröße kennen. In diesem Fall verwende ich 0,5 Meter. Sie möchten auch die Resampling-Methode aufrufen. Ich bevorzuge Cubicspline für Orthophoto-Übersichten. Es ist weicher, aber Sie werden diese nicht bis zur vollen Auflösung verwenden und meiner Erfahrung nach erzeugt es ein komprimierbareres Bild, wenn Sie etwas wie JPEG oder ECW verwenden.

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

Möglicherweise möchten Sie auch JPEG-Komprimierungsoptionen für diese neu abgetasteten GeoTIFF-Übersichten verwenden. es verkleinert die Ausgabedatei erheblich mit ( laut Frank ) nur einer geringfügigen Leistungseinbuße.

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

Übersichten

Sie sollten auch den praktischen Befehl gdaladdo über das resultierende Bild ausführen , um interne "Pyramiden" zu erstellen, damit Anforderungen für niedrigere Auflösungen als die vollständigen Bildabmessungen mit einer Teilmenge von Daten erfüllt werden können. Die Leistungssteigerung ist in den meisten Fällen den Speicherplatz mehr als wert. Sie sollten mit den Levels herumspielen, die Sie hier verwenden. Bei sehr großen Bildern können Sie möglicherweise einige ablegen. Der Befehl gdaladdo sieht ungefähr so ​​aus:

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

Ich würde vorschlagen, mit diesen Ebenen zu experimentieren, um eine optimale Leistung zu erzielen. Möglicherweise ist ein anderes Resampling-Intervall für Ihre Anwendung besser oder Sie können je nach Bildgröße einige der höheren Zahlen löschen (oder es werden mehr benötigt).

Wenn Sie eine externe Übersicht erstellen (mit der Option -ro), sollten Sie die Konfigurationszeilen für die JPEG-Komprimierung hinzufügen:

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

(Ich glaube, dass diese vom übergeordneten GeoTIFF für eingebettete Übersichten geerbt werden.)

Anmerkungen

Als ich mit diesem Problem konfrontiert wurde, fragte ich auf dem # gdal-Kanal auf freenode.irc.net. Dies ist eine erstaunliche Ressource, und ich bin Howard Butler, Frank Warmerdam und Even Rouault zu großem Dank verpflichtet, dass sie mir dabei geholfen haben.

JasonBirch
quelle
Vielen Dank, dass Sie vollständig sind, sich die Zeit genommen haben, und ich bin sicher, es war an der Zeit, den gesamten Workflow abzudecken und nicht nur das spezifische Bit, das die Frage beantwortet hat.
Matt Wilkie
1
Es wäre interessant zu sehen, ob gdalsetnull.py auf VRTs funktioniert. Dann wäre "Bearbeiten der VRT-Datei in einem Texteditor und Hinzufügen einer <NoDataValue /> -Entität" nicht erforderlich .
Matt Wilkie
1
@matt wilkie, es war definitiv ein bisschen Arbeit beim Umschreiben und Formatieren dieser Site, aber ich habe dies auch zuvor im Rahmen eines größeren Workflows in meinem Blog behandelt: jasonbirch.com/nodes/2009/08/11/290/fwtools- ftw-gdal Dieser Vorschlag ist definitiv einen Versuch wert!
JasonBirch
Allgemeiner Windows-Cmd-Hinweis: Verwenden Sie Caret ^für einen Zeilenumbruch, der bei der Ausführung verbunden wird (z. B. ^am Ende jedes obigen Codezeilenbeispiels hinzufügen , um sowohl Lesbarkeit als auch Ausführungsfähigkeit zu gewährleisten). Wichtige Einschränkung:
Beenden
3

Ja, aber durch Versuch und Irrtum konnte ich feststellen, dass -vrtnodata 255 den Effekt hat, alles, was weiß ist, als Nodata zu kennzeichnen, nicht nur außerhalb der Karte, die gdal2tiles dann mit Alpha-Transparenz gemäß dem Flag -a behandelt.

Am Ende ist ein Teil Ihres Quellbilds transparent, in meinem Fall die weißen Teile gestrichelter Straßen. Dies ist kein Terminal, aber es wäre sicher schön, wenn Sie gdal2tiles die Farbe "no src image" angeben könnten, entweder als Ergebnis von ursprünglichen Hohlräumen im vrt oder als Ergebnis von Warp. Für mein Set wäre ein blassblauer Farbton genau das Richtige.

Nach noch mehr Versuch und Irrtum scheint es, dass Hidenodata der Schlüssel sind. Ich weiß nicht, warum diese Tools so minimal dokumentiert sind. Hier ist was für mich funktioniert, 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
quelle
siehe auch den gdal nearblack Dienstprogramm gdal.org/programs/nearblack.html , die nur behandelt Pixel um den Rand des Bildes und ignoriert die Mitte
matt Wilkie
0

Ich bin mit GDAL nicht allzu vertraut, aber ich denke, dass eine Methode oder ein Befehl verfügbar ist, mit der Sie ein Pixel eines bestimmten Werts mit einem anderen Wert festlegen können.

Nichts damit zu tun, aber in einfachem SQL so etwas wie (nur zur Veranschaulichung - das ist viel mehr Pseudocode):

UPDATE-Raster SET pixel = 255 WHERE pixel = NoData;

Ich würde gerne die Antwort wissen!

George Silva
quelle
GDAL enthält verschiedene Methoden zum Ersetzen von Farben durch andere Farben während der Verarbeitung auf ähnliche Weise wie Ihr Pseudocode sowie ein eigenständiges Dienstprogramm namens Nearblack, mit dem Sie Bildkanten mit Komprimierungsartefakten bereinigen und bei Bedarf weiß machen können. Keines davon funktionierte gut mit dem Datenvolumen, mit dem ich zu der Zeit arbeitete.
JasonBirch