2016-07-06 13 views
4

Ich versuche, Bildinhalt aus einer Datei zu extrahieren, die von Hamamatsu NanoZoomer Slidescanner generiert wurde. Die NDPI-Datei verwendet eine modifizierte TIFF-Struktur und speichert Bildinhalte in einem großen Chunk im JPEG-Format. Mit StripOffsets und StripByteCounts kann ich die Daten extrahieren, die eine JPEG-Datei sein sollen.Wie kann ich ein JPEG-Bild mit mehr als 65500 * 65500 Pixeln richtig öffnen/dekodieren?

Der Datenstrom hat die korrekte Signatur für eine JPEG-Datei, z. B. FFD8, der Anfang der Scan-Markierung und FFD9, das Ende der Scan-Markierung. Wenn dies ein Bild kleiner als 65500 * 65500 Pixel ist, dann kann ich die Datei problemlos öffnen, wenn ich den Datenstrom in eine JPEG-Datei speichere.

In einem JFIF-Header stellen das dritte und vierte Byte nach dem FFC0-Marker die Bildhöhe dar; Die zwei Bytes repräsentieren danach die Bildbreite. Bei einem Bild, das größer als 65500 * 65500 Pixel ist (was tatsächlich 122880 * 78848 Pixel entspricht), sind diese vier Bytes, die vermutlich Bildhöhe und Bildbreite repräsentieren, alle Nullen. Ich änderte sie zu 255, 220, 255, 220, nach this (Zeile 255-263). Als ich die JPEG-Informationen durch einen Rechtsklick in Windows überprüfte und Details auswählte, habe ich gesehen, dass Windows Photo Viewer die Auflösung als 65500 * 65500 gelesen hat, obwohl sie nicht die tatsächliche Pixelauflösung darstellen. Das Problem ist, wenn ich versucht habe, das Bild zu öffnen, wird es anscheinend falsch dekodiert.

Also meine Frage ist: Wie kann ich eine solche JPEG-Datei richtig öffnen? Oder wie kann ich die Gesamtheit solcher Bildinhalte korrekt in den Speicher entschlüsseln?

Ich versuche jetzt, die Dateistruktur mit MATLAB zu verstehen. Schließlich werde ich Python + OpenCV (oder wenn nötig mit Python + Cython + libjpeg-turbo) verwenden, um das gesamte Bild in den Speicher zu lesen.

+0

Da ich Ihr Bild nicht zum Testen habe, ist es sehr schwer zu sagen, aber wenn Sie mit großen Bildern zu tun haben, ziehen Sie definitiv 'vips' in Betracht. Es zeichnet sich dadurch aus ... http://stackoverflow.com/a/36377369/2836621 –

+0

Ich glaube, dass dies ein libjpeg oder libjpeg-turbo Problem ist. VIPS benutzt eines von beiden. Wenn Sie also nur zu VIPS wechseln, wird dieses Problem nicht gelöst. – user3667217

+0

Ich habe meine eigene Bildgebungsbibliothek (einschließlich benutzerdefinierten JPEG-Codec) geschrieben und dieses Bild könnte möglicherweise durch meinen Code geöffnet werden. Die extreme Größe stellt ein Problem dar, um alles auf einmal zu öffnen. Ich könnte entweder eine skalierte Kopie (1/8 x 1/8 = 14848/12800) öffnen oder eine bestimmte rechteckige Kopie davon öffnen. Das unkomprimierte Vollbild der Farbe würde 36 GB RAM erfordern. – BitBank

Antwort

0

Ohne weitere Hinweise, nur ein paar Bemerkungen:

  • 65500x65500 = 3GIO/Kanal (Arbeits)
  • 122880 * 78848 = 9GiO/Kanal (Ziel)

Diese bereits sehr groß sind Menge des zusammenhängenden Speichers; Vor allem unter Windows, die einige Einschränkungen für diese Art von Anwendungen hat (take a look at this for more info)

Erstens, könnten Sie irgendwelche Details auf Ihrem Computer oder Software, mit denen Sie versuchen, dieses Bild zu öffnen? (Menge an RAM, Swap, max Speicher zugewiesen Benutzerplatz, etc)

Völlig zufällig raten, haben Sie versucht, mit ImageJ?

Wäre es möglich, nur den Bereich zu öffnen, den Sie sehen möchten (ich bin mir nicht sicher, ob Sie das ganze Bild sehen wollen)?

Warum nicht eine mehrskalige Bilddarstellung verwenden?

Edit: Ich sah gerade, dass es tools for your file format to be converted in TIFF done by the IN2P3 gab. Was mich auch wundern lässt, wenn Sie wirklich ein JPEG darin versteckt haben oder ein TIFF.

+0

Ich brauche das gesamte Bild im Speicher. ImageJ konnte nicht einmal eine Datei öffnen, die ein Pixelauflösungsprodukt größer als 65535 hat. Ich habe 32 GB RAM auf meinem Computer. Ich habe versucht, die Datei in Windows Photo Viewer und Photoshop zu öffnen, beide gaben mir dieselbe Anzeige. – user3667217

0

Ich würde openslide plus vips verwenden, es hat schnelle und direkte Unterstützung für ndpi Bilder. Sie können dann das decodierte Bild in Matlab oder Numpy kopieren oder einfach vips zur Verarbeitung verwenden, je nachdem, was Sie tun müssen.

Zum Beispiel kann ich schreiben:

#!/usr/bin/python 

import sys 
import gi 
gi.require_version('Vips', '8.0') 
from gi.repository import Vips 

im = Vips.Image.new_from_file(sys.argv[1]) 
im = im.crop(1000, 1000, 2000, 2000) 
im.write_to_file(sys.argv[2]) 

Dann laufen wie:

$ time ./try228.py ~/Desktop/pics/2013_09_20_29.ndpi x.png 
memory: high-water mark 15.24 MB 
real 0m1.561s 

, dass für ein 118.784 x 102.400 Pixel-Bild ist.

Sie können auch vips verwenden, um das ndpi-Bild in etwas Einfaches wie ppm zu konvertieren. Das sollte trivial sein, um in den Speicher geladen zu werden.

$ vips copy ~/Desktop/pics/2013_09_20_29.ndpi huge.ppm 

Welche Art von Verarbeitung planen Sie?

Die openslide Website hat eine nice overview of the ndpi file format, wenn Sie neugierig sind.

Es gibt eine 64-bit Windows binary for vips here. Entpacken Sie einfach und führen Sie vips.exe.

Die vips GUI, nip2, wird keine Probleme bei der Verarbeitung Ihres Bildes haben. There's a windows installer. Starten Sie das Programm und klicken Sie auf Datei/Öffnen, oder ziehen Sie das Bild .ndpi aus dem Explorer. Doppelklicken Sie auf das Miniaturbild im Hauptfenster, um ein Ansichtsfenster zu öffnen. Verwenden Sie das Toolkits-Menü, um das Bild zu bearbeiten. Drücken Sie F1, um Hilfe zu erhalten.

+0

Danke für die Antwort. Ich konsultierte tatsächlich den OpenSlide-Code, um mir zu helfen, das ndpi-Format zu verstehen. Was ich brauche, ist: 1: Verwandle das gesamte Bild in ein Deepzoom-Bildformat. 2: lese das gesamte Bild zur Bildverarbeitung in den Speicher. Für 1) denke ich, dass openslide + vpis die Arbeit machen kann, da es nicht das Lesen des gesamten Bildes beinhaltet, es ist die zweite Anforderung, die jetzt problematisch ist. – user3667217

+0

Ja, für 1) einfach 'vips dzsave slide.ndpi my-pyr-name'. Für 2) würde ich in ppm umwandeln und das in den Speicher laden, sollte es sehr einfach sein. Welche Bearbeitung planen Sie? – user894763