2017-06-14 5 views
0

Ich verwende diese zur Zeit schwimmt zu extrahieren:Gibt es eine schnellere Möglichkeit, Floats aus einem 32-Bit-TIFF als LibTIFF zu extrahieren?

TIFF* tiff = TIFFOpen(tiffs[i].c_str(), "r"); 
if (tiff) { 
    uint32 width, height; 
    tsize_t scanlength; 
    if (TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH, &width) != 1) {} 
    if (TIFFGetField(tiff,TIFFTAG_IMAGELENGTH, &height) != 1) {} 
    fwidth = width; 
    fheight = height; 
    vector<float> data; 
    scanlength = TIFFScanlineSize(tiff); 
    float image[height][width]; 
    for (uint32 y = 0; y < height; y++) { 
     TIFFReadScanline(tiff,image[y],y); 
    } 
} 

Dies wird über 0,02 Sekunden pro TIFF zu nehmen und ich brauche es viel schneller zu sein. Ich weiß, dass andere Bibliotheken irgendwie damit umgehen können, aber ich habe nur eine andere gefunden, die 32-Bit-Tiffs verarbeiten kann, und es war CImg, die Weg länger dauerte. Auch wenn das so einfach ist wie system() zu verwenden, um eine comand line Sache zu machen oder ein wirklich schnelles Skript zu nennen, würde ich lieben zu wissen, ob es einen schnelleren Weg gibt.

Vielen Dank!

https://www.dropbox.com/s/5zb8spaz7cma1gx/pic.tif?dl=0

Dies ist ein Beispiel tif.

+2

20ms für Bild I/O klingt nicht verrückt. Welche Größe haben die Bilder? Irgendwelche Komprimierung in den TIFFs? – Peter

+0

@Peter Ich muss eine Tonne von ihnen konvertieren, so dass es viel wird:/512 von 512, und nein. –

+0

OK, das klingt ein bisschen langsam im Vergleich zu Festplatten-I/O, aber nicht viel ... Ihre 1MB-Datei auf einem 100MB/s-Festplattensystem würde 10ms nur in Raw Disk lesen. Zuerst benchmarken Sie den Dateizugriff (lesen Sie einfach die gesamte Datei in einen Puffer, achten Sie darauf, dass der Betriebssystem-Cache Ihre Messungen durcheinander bringt), und sehen Sie, welchen Overhead die Bibliothek hinzufügt. – Peter

Antwort

0

Mmmm, nicht so vollständig eine Antwort, wie ich es mir vorstellen konnte, aber ich habe ein paar Gedanken zu teilen. Vielleicht werden sie ein paar weitere Gedanken von mir oder anderen Leuten auslösen ...


Erstens Ihre Bilder TIFF-Tag 262 („Photometric Interpretation“), die Sie stören mehrere Werkzeuge fehlen könnten sonst verwenden. Welches Programm hat die Bilder generiert - weil sie nicht streng konform sind? Können Sie das Programm, mit dem die Bilder erstellt wurden, korrigieren/verbessern?

ich die "Photometric Interpretation" Tag "min-is-black" mit gesetzt verwaltet:

tiffset -s 262 0 YourImage.tif 

Sobald das gesetzt ist, habe ich es geschafft vips zu verwenden (von here) - das ist extrem schnell und Speicher-effizient, um Ihre Datei in JPEG zu konvertieren. Es hat Ruby und Python Bindungen, wenn Sie diese Sprachen bevorzugen.

Also, die Befehlszeile im Terminal Ihre Datei zu JPEG konvertieren ist:

vips im_vips2jpeg YourFile.tif result.jpg 

enter image description here

ich davon überzeugt bin, nicht, dass, obwohl richtig funktioniert, vielleicht John @ user894763 (der Autor von vips) einen Blick darauf werfen würde .


Ein anderer Gedanke, vips ist, dass Sie der folgende Befehl eine rohe RGB-Datei von 3 Schwimmern pro Pixel sparen, die Sie direkt in Ihr eigenes Programm ohne Dekodierung überhaupt lesen können:

vips rawsave YourFile.tif image.raw 

-rw-r--r-- 1 mark staff 3145728 20 Jun 16:59 image.raw 

Sie werden bemerken, dass die Dateigröße (3145728) entspricht:

512 pixels * 512 pixels * 3 RGB values * 4 bytes of float each 

Ich habe auch ImageMagick Ihr Bild zu JPEG konvertieren, mit

convert YourImage.tif result.jpg 

und bekam dieses Ergebnis:

enter image description here


Ein weiterer Gedanke, der mir einfiel war, dass man konnte Bevor Sie Ihr eigenes TIFF-Extraktionsprogramm ausführen, sollten Sie den Puffercache vorwärmen, indem Sie cat für jede Ihrer Dateien ausführen, damit sie vom NFS-Server abgerufen werden:

cat *.tif > /dev/null 

oder führen Sie möglicherweise parallele Streams aus, um die Latenz zu reduzieren.


Ein weiterer Gedanke war, dass Sie die Dateien in einem RAM-backed-Dateisystem-Prefetch könnten, so dass Sie Ihre Dateien mit minimaler Latenzzeit gelesen werden. Bei 186KB pro Datei, könnten Sie 5000 in einem 1 GB RAM-Disk für eine viel schnellere Verarbeitung erhalten:

mkdir /tmp/RAM 
sudo mount -t temps -o size=1G temps /tmp/RAM 

Sie auch Zwischendateien setzen könnte, die ich vorschlagen, in meine Gedanken oben in das RAM-Dateisystem.

+0

Danke, ich werde versuchen, diese zu testen und sie zu times! Schnelle Frage, ich begann mein Programm auf einem lokalen Laufwerk im Gegensatz zu NFS laufen, und es dauerte die gleiche Zeit. Haben Sie eine Ahnung, warum? –

+1

Es ist extrem schwer zu erraten, ohne die gesamte Umgebung zu kennen. " –

+0

Ich glaube, dass dies mit Ihrer anderen Frage zusammenhängt. Diese Antwort könnte daher von folgendem ersetzt werden ... https://stackoverflow.com/a/44756292/2836621 –

Verwandte Themen