2017-06-21 2 views
1

Ich würde gerne Größe (1 TB) Bilder zu 256x256 Pixel Kacheln (Zoomify/OSM/Google Maps/XYZ Schema) zu skalieren und zu teilen. Bilder werden im BigTIFF- oder PSB-Format (Large Document Format oder Photoshop Big) angezeigt.Größe große Bilder in Python (größer als verfügbarer RAM)

Was sind die verfügbaren Bibliotheken, die dies tun können? Ich schaute GDAL an, aber es erzeugte ziemlich unscharfe Ausgabe und ich konnte es nicht einstellen, um besser zu interpolieren. Im Idealfall würde ich einen Lanczos Interpolator für diese Aufgabe suchen.

Gibt es native Python-Bibliotheken oder Wrapper für C-basierte Bibliotheken, die das können? Kann der Python-Wrapper für imagemagick so etwas machen?

Wenn keine Python-Bibliothek verfügbar ist, bin ich auch offen für Befehlszeilen-basierte Tools, die ich mit Python automatisieren kann.

+1

Sie könnten die Funken verteilt Computer Route gehen, wenn Sie nichts besseres finden. –

+1

ImageMagick kann das mit dem Operator -crop tun. Sehen Sie sich den Abschnitt zum Zuschneiden von Tile unter http://www.imagemagick.org/Usage/crop/#crop an. Es gibt Python ImageMagick API und auch Python Wand, glaube ich. – fmw42

+0

Ich würde Ihnen empfehlen, schauen Sie sich 'vips' http://www.vips.ecs.soton.ac.uk an und vielleicht hat der Autor John (@ user894763) einen Ratschlag. –

Antwort

4

libvips kann große Bilder (größer als RAM) effizient verarbeiten. Da es sich um eine Streaming-Bildverarbeitungsbibliothek handelt, kann es (in diesem Fall) gleichzeitig dekomprimieren, skalieren, kacheln und schreiben, ohne das gesamte Bild im Speicher zu haben oder temporäre Dateien zu benötigen.

Der Operator dzsave schreibt eine DeepZoom/Zoomify/Google Maps-Pyramide. Sie können es von der Kommandozeile wie folgt ausführen:

$ vipsheader y.tif 
y.tif: 104341x105144 uchar, 3 bands, srgb, tiffload 
$ ls -l y.tif 
-rw-r--r-- 1 john john 32912503796 Jun 13 13:31 y.tif 
$ time vips dzsave y.tif x 
real 3m4.944s 
user 9m21.372s 
sys 7m20.232s 
peak RES: 640mb 
$ ls -R x_files/ | wc 
227190 227172 2784853 

Also auf meinem Desktop es umgewandelt, um eine 32 GB Bild auf 230.000 Fliesen in ca. 3 Minuten. Das ist bei einer mechanischen Festplatte mit einer SSD vielleicht schneller. Es gibt eine blog post introducing dzsave.

Es hat a Python binding, so könnte man auch schreiben:

import pyvips 

image = pyvips.Image.new_from_file("y.tif", access = "sequential") 
image.dzsave("x") 

Die access Option teilt libvips, dass sie das Bild streamen soll. Es kann BigTIFF und PSB lesen, obwohl Sie den TIFF Loader viel schneller finden.

+0

große Antwort! Ich hatte Libvips vergessen und begann bereits in einem benutzerdefinierten Code zu denken. – jsbueno