Ich arbeite mit 1 GB großen TIFF-Bildern von etwa 20000 x 20000 Pixeln. Ich muss mehrere Kacheln (von etwa 300x300 Pixel) aus den Bildern in zufälligen Positionen extrahieren.
Ich habe folgende Lösungen versucht:
Libtiff (die einzige Low-Level-Bibliothek, die ich finden konnte) bietet TIFFReadline (), aber das bedeutet, dass man ungefähr 19700 unnötige Pixel einliest.
Ich habe meinen eigenen Tiff-Reader implementiert, der eine Kachel aus dem Bild extrahiert, ohne unnötige Pixel einzulesen. Ich habe erwartet, dass es schneller ist, aber eine Suche nach jeder Zeile der Kachel macht es sehr langsam. Ich habe auch versucht, alle Zeilen der Datei zu lesen, die meine Kachel enthalten, und dann die Kachel aus dem Puffer zu extrahieren, aber die Ergebnisse sind mehr oder weniger die gleichen.
Ich würde gerne Vorschläge erhalten, die mein Kachel-Extraktionswerkzeug verbessern würden!
Alles ist willkommen, vielleicht können Sie eine effizientere Bibliothek vorschlagen, die ich benutzen könnte, ein paar Tipps zu C / C ++ I / O, eine höhere Strategie für meine Bedürfnisse usw.
Grüße, Juan
[Hauptausgabe 14 Jan 10]
Ich war ein bisschen verwirrt von Ihrer Erwähnung von Fliesen, wenn der Tiff nicht gekachelt ist.
Ich verwende gekachelte / pyramidale TIFF-Bilder. Ich habe diese mit VIPS erstellt
%Vor%Ich denke, du kannst das mit:
machen %Vor%Vielleicht möchten Sie mit der Kachelgröße experimentieren. Dann können Sie mit TIFFReadEncodedTile lesen.
Die Speicherung in mehreren Auflösungen mit pyramidenförmigen TIFFs ist wesentlich schneller, wenn Sie die Ansicht vergrößern / verkleinern müssen. Sie können dies auch verwenden, um ein grobes Bild zu erhalten, dem fast unmittelbar ein detailliertes Bild folgt.
Nach dem Umschalten auf (entsprechend dimensionierten) gekachelten Speicher (was Ihnen MASSIVE Performance-Verbesserungen für den Direktzugriff bringt!) ist Ihr Engpass Disk io. Das Lesen von Dateien ist viel schneller, wenn sie nacheinander gelesen werden. Hier könnte mmapping die Lösung sein.
Einige nützliche Links:
VIPS IIPImage LibTiff.NET stackoverflow VIPS ist eine Bildverarbeitungsbibliothek, die viel mehr als nur lesen / schreiben kann. Es hat sein eigenes, sehr effizientes internes Format. Es hat eine gute Dokumentation über die Algorithmen. Zum einen entkoppelt es die Verarbeitung vom Dateisystem, so dass Kacheln zwischengespeichert werden können.
IIPImage ist eine Multi-Zoom-Webserver / Browser-Bibliothek. Ich fand die Dokumentation eine sehr gute Quelle für Informationen über Multi-Resolution Imaging (wie Google Maps)
Die andere Lösung auf dieser Seite, die mmap verwendet, ist nur für 'kleine' Dateien effizient. Ich habe oft die 32-Bit-Grenzen erreicht. Im Allgemeinen schlägt die Zuweisung eines 1 GB großen Speicherbereichs auf einem 32-Bit-Betriebssystem (mit 4 GB RAM) fehl, da sogar virtueller Speicher nach ein oder zwei Anwendungsdurchläufen fragmentiert wird. Dennoch ist genügend Speicher vorhanden, um Teile oder das gesamte Bild zwischenzuspeichern. Mehr Speicher = mehr Leistung.
Danke für die Antworten.
Tatsächlich war eine Änderung in der Art und Weise, wie Kacheln benötigt wurden, mir erlaubt, die Kacheln sequentiell aus den Dateien auf der Festplatte zu extrahieren, anstatt auf zufällige Weise. Dadurch konnte ich einen Teil der Datei in Ram laden und die Kacheln von dort extrahieren.
Der Effizienzgewinn war enorm. Andernfalls, wenn Sie einen zufälligen Zugriff auf eine Datei benötigen, ist mmap ein guter Deal.
Grüße, Juan
Ich habe etwas Ähnliches getan, um eine beliebig große Datei im TARGA-Format (TGA) zu bearbeiten. Die Sache, die es für diese Art von Datei einfach gemacht hat, ist, dass das Bild nicht komprimiert ist. Sie können die Position eines beliebigen Pixels innerhalb des Bildes berechnen und mit einer einfachen Suche finden. Sie könnten das Targa-Format in Betracht ziehen, wenn Sie die Möglichkeit haben, die Bildkodierung anzugeben.
Wenn nicht, gibt es viele verschiedene TIFF-Formate. Wahrscheinlich möchten Sie eine Bibliothek verwenden, wenn sie bereits die Unterstützung der verschiedenen Formate durchgemacht haben.
Haben Sie eine spezifische Fehlermeldung erhalten? Je nachdem, wie Sie diese Befehlszeile verwendet haben, könnten Sie auf Ihre eigene Datei gestoßen sein.
Wenn das nicht das Problem war, versuchen Sie es mit Imagemagick statt Vips, wenn es eine Option ist.
Tags und Links c++ tiff extraction tile libtiff