Java - Wie schreibe ich ein sehr großes (20.000x20.000 px oder größer) tif-Bild

8

Ich arbeite mit extrem großen TIF-Bildern, die ich komponiere, zu einem großen Einzelbild. Ich habe eine Bibliothek, die von einem Kollegen erstellt wurde, der die Bildpyramide generiert und ein sehr praktisches Werkzeug zur Visualisierung der Bildpyramide bietet. Dieser Visualisierer eignet sich hervorragend, um einen Blick auf das große Bild zu werfen und Punkte von Interesse zu erkennen, aber die Kunden sind mehr an einer Bildanalyse dieser großen Bilder interessiert.

Daher ist es notwendig, das sehr große Bild in eine einzige Datei zu exportieren. Ich finde das störend, wenn man bedenkt, dass diese Bilder irgendwo zwischen 800 MB und mehreren GB groß sein können. Und gerade die Aufgabe, dieses einzelne Bild in den Speicher zu laden, ist eine Herausforderung, besonders wenn eine Bildanalyse durchgeführt wird.

Ich frage mich, ob es in Java möglich wäre, dieses große TIFF-Bild blockweise oder zeilenweise zu schreiben. Momentan läuft in meiner Anwendung nicht mehr genügend Arbeitsspeicher auf kleinen (8 GB RAM) Rechnern.

Die aktuelle Methode zum Erstellen dieser Bilder lautet:

  1. Speichern Sie die Pixelwerte in BufferedImage mit WritableRaster

    %Vor%
  2. Und dann schreiben Sie das gepufferte Bild auf die Festplatte. Für diesen Teil verwende ich ImageJ , um das Bild als tif zu schreiben. Wenn es bessere Möglichkeiten gibt, 16-Bit-Graustufen-TIF-Bilder zu unterstützen, werde ich mich freuen, einen Blick darauf zu werfen.

    %Vor%

Das Problem mit dieser Methode ist, dass es einen zu großen Speicherbedarf für eine 8 GB RAM-Maschine hat.

Idealerweise möchte ich nur ein einziges short[][]pixels haben. Dies liegt hauptsächlich daran, dass ich eine durchschnittliche Blending-Funktion berechnen muss, so dass ein gewisser Speicherbedarf vorhanden ist. Auch in Zukunft werde ich eine lineare Mischung hinzufügen. Der short[][]pixels sollte nur ~ 765 MB RAM für 20k x 20k Pixeldaten aufnehmen, was meiner Meinung nach momentan nicht vermeidbar ist. Für größere Bilder, zum Beispiel 100k x 100k Pixel, würde ich hoffen, dass die Biologen das nicht exportieren wollen Bild, da es 18 GB RAM aufnehmen würde.

Später werde ich den Code modifizieren, um den Export der extrem großen Bilder wie 100k x 100k zu unterstützen. Fürs Erste ist es okay, ein Stück Speicher zu verwenden, um die anfänglichen Pixelwerte zu speichern.

Also, was ist eine gute Methode, Teile eines TIF-Bildes auf die Festplatte zu schreiben, damit ich das Schreiben von Kernbildern wie den 100k x 100k-Bildern unterstützen kann.

Ich habe diesen Beitrag gesehen: Schreiben Sie die gekachelte Ausgabe von TIFF mit ImageIO in Java

Aber es behandelt nur die Spezifikation TIFF 6.0. Aber ich werde in ImageOutputStreams schauen. Tif ist aber ein Biest, also könnte ich nur in den sauren Apfel beißen und die Biologen ermutigen, nur die Regionen von Interesse zu exportieren.

BEARBEITEN: Eine praktikable Lösung gefunden:

SCHREIBER: Ссылка

und

LESER: Ссылка

Hauptgruppen-Seite: Ссылка

    
Jameshobbs 24.09.2013, 15:50
quelle

4 Antworten

2

Ok, ich habe in Java eine gute Lösung dafür gefunden.

Danke an @bdares für den Hinweis auf BigTiff.

Aber im Paket mit FIJI gibt es die Bioformat-Gruppe, die scifio implementiert hat.

Sie stellen eine Anzahl von unterstützten Lesern / Schreibern bereit, von denen einer ein TiffReader / Writer ist

Ссылка

und

Ссылка

Ich habe meinen ursprünglichen Beitrag bearbeitet. Vielen Dank für die Kommentare, es hat mir geholfen, in die richtige Richtung zu schauen.

    
Jameshobbs 24.09.2013, 19:03
quelle
3

Mit dem SCIFIO Projekt sind wir verallgemeinern den Bio-Formate Bild-I / O-Rahmen wissenschaftliche Bildgebung im Allgemeinen zum Ziel, über die Mikroskopie und die Lebenswissenschaften hinaus. Die SCIFIO API ist in der Beta jetzt, und schließt TIFF die natürlich lesen und Schreiben Sie in Kacheln. Feedback zu API und Wanzen auf der SCIFIO Mailingliste ist immer willkommen!

    
ctrueden 26.09.2013 17:07
quelle
2

Im Gegensatz zu Ihrem Kommentar ist es wirklich nicht so schwierig, einen eigenen TIFF-Writer zu implementieren.

Die Spezifikation kann hier heruntergeladen werden. Insbesondere sind die Seiten 13-14 (fast) alles, was Sie benötigen, um zu verstehen, was TIFF ist und wie es zu schreiben ist.

Beachten Sie, dass laut der Spezifikation 6.0 (Stand September 2013) die maximale Bildgröße 4 GB beträgt. Ich würde vorschlagen, sich an BigTiff zu wenden. Die Unterschiede in den Spezifikationen sind auf dem zweiten Link aufgeführt.

    
bdares 24.09.2013 16:33
quelle
0

Sie haben eine doppelte Reihe von kurzen. Anstatt diese im Speicher zu speichern, müssen Sie sie auf der Festplatte speichern und auf der Festplatte bearbeiten. BufferedImage wird nicht helfen. Sie benötigen eine Bibliothek (oder eine Bibliothek), die die Bearbeitung eines Bildes auf der Festplatte ermöglicht, ohne das Bild vollständig in den Speicher zu laden.

Sie möchten nicht auf jeden Wert einzeln zugreifen. Stattdessen werden Sie so etwas tun wollen:

  1. lese einen Block (vielleicht 4k, 8k oder 40k, was immer Sinn macht).
  2. verarbeitet den gesamten Block.
  3. schreibe den Block auf die Festplatte.
  4. gehe zu Schritt 1, bis du fertig bist.
DwB 24.09.2013 15:59
quelle

Tags und Links