2017-06-03 3 views
2

Kennt jemand eine Python-Bibliothek, die zum Drehen sehr großer Bilder verwendet werden kann? Ich muss sicherstellen, dass die Bilder die gleichen Farben verwenden und dass es keine Interpolation gibt, das heißt, ich muss eine Rotation des nächsten Nachbarn verwenden.Drehen von großen Bildern in Python (85000x85000x3)

Das Bild ist in tiff Format. Ich benutze ein NVIDIA DGX, um es zu verarbeiten, dieser Server enthält 512 GB Systemspeicher.

OpenCV

Ich versuchte opencv mit:

M = cv2.getRotationMatrix2D((w/2,h/2),angle,1) 
im_rgb_rot = cv2.warpAffine(im_rgb,M,(w,h),flags=cv2.INTER_NEAREST) 

Und es scheint, wie nach der Drehung im_rgb_rot ein leeres Bild wird aus Nullen besteht.

SciPy

Auch habe ich versucht, scipy.ndimage.interpolation.rotate und scipy.misc.imrotate und auf einem kleinen Testbild verwenden, aber es scheint, wie die Rotation mich nicht gerade Kanten nicht geben, wie unten gesehen. Ich sollte beachten, dass opencv gerade Kanten gibt.

enter image description here

Der Code hierfür lautet:

scipy.ndimage.interpolation.rotate(im_test, 40, reshape=False, mode='nearest') 

PIL

Schließlich kann ich nicht PIL verwenden, da es nicht so große Bilder unterstützt.

+0

Das sind 14,5 Terabyte unkomprimiert. Sie sind nicht in der Nähe genug Informationen zur Verfügung gestellt. Für den Anfang müssen Sie erklären, wie diese Dinge gespeichert sind und welche Rechenressourcen Sie haben, um diese Aufgabe zu erledigen. – Gene

+0

Entschuldigung, ich werde die Post damit aktualisieren, aber das sind 'tiff' Bilder. Es gibt eine Reihe von Größen und die größte Größe ist 85000x85000x3, ich habe noch nicht mit dieser Größe gearbeitet.Aber da 'tiff' Bilder 3 Bytes pro Pixel sind, glaube ich, dass das Bild ungefähr 50-65GB Daten haben wird. Ich benutze eine NVIDIA DGX, die 512 GB Systemspeicher hat. –

+0

Es tut mir leid, weiß nicht wo ich meine Mathe bekommen habe. 22 GB sollte auf dieser Maschine machbar sein, aber Sie werden definitiv eine durch und durch 64-Bit-Bibliothek benötigen. Haben Sie sich ImageMagick angesehen? Ihre Dokumente haben einen Abschnitt über "massive Bilder" http://www.imagemagick.org/Usage/files/#massive. Sie können mit dem Befehlszeilentool experimentieren, aber ich glaube, es gibt eine Python-API (ich weiß, dass es eine für Ruby gibt). Ein Teil davon könnte sein, dass Ihr Betriebssystem so große Zuweisungen zulässt. Sie haben das Betriebssystem nicht erwähnt. – Gene

Antwort

0

libvips können große Bilder schnell mit nur wenig Speicher verarbeiten. Ich habe versucht, einen 20 Grad drehen eines 65k x 65k Pixel geflieste JPG-komprimierte TIFF-Bild auf meinem Desktop-PC (E5-1650 @ 3.20GHz):

$ time vips similarity M7_KM-1.tif x.tif --angle 20 --interpolate nearest 
real 2m36.655s 
user 3m20.000s 
sys 0m19.936s 
peak memory: 1.08g 

Für eine regelmäßige unkomprimierte TIFF Streifen ist es ein wenig langsamer, da vips hat das Bild auf eine temporäre Disk-Datei entpacken zuerst:

$ time vips similarity x.tif y.tif --angle 20 --interpolate nearest 
real 6m43.461s 
user 2m17.220s 
sys 2m25.960s 
peak memory: 440mb 

In Ihrem Fall Sie bucketloads Speicher haben, so können Sie das eher als eine temporäre Plattendatei verwenden:

$ export VIPS_DISC_THRESHOLD=100g 
$ time vips similarity x.tif y.tif --angle 20 --interpolate nearest 
real 2m34.049s 
user 3m48.508s 
sys 0m33.136s 
peak memory: 20g 

In Python Sie würden verwenden:

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

x = Vips.Image.new_from_file("M7_KM-1.tif") 
x = x.similarity(angle = 20, interpolate = Vips.Interpolate.new("nearest")) 
x.write_to_file("x.tif") 

Es ist in der Regel 6x or 7x faster than PIL or imagemagick und braucht viel weniger Speicher. Es gibt Bindungen für Python, Ruby, Lua, Javascript, PHP, C, C++, Go und andere. Es läuft auf Linux, Windows und MacOS mit praktischen Paketen (oder weniger praktischen großen Reißverschlüssen, im Fall von Windows) für die Installation.

Verwandte Themen