2016-04-24 4 views
3

Ich bin auf der Suche nach der effizientesten Möglichkeit zur Größenänderung von Bildern. PIL funktioniert gut, wenn Bilder relativ klein sind (zum Beispiel 3000x2000), aber wenn die Auflösung groß ist (16000x12000), dauert die Verarbeitung sehr lange. Bilder müssen nicht hübsch aussehen Ich vergrößere sie für Vergleiche, um Kopien von Bildern mit nrmse zu finden.Was ist die CPU-effizienteste Möglichkeit, große Bilder in Python zu skalieren

from PIL import Image 

img1 = Image.open("img1.jpg") 
img2 = Image.open("img2.jpg") 

print img1.size 
print img2.size 

# add width to height to see which resolution is bigger 
im1s = img1.size[0] + img1.size[1] 
im2s = img2.size[0] + img2.size[1] 

# if both images are bigger than 3000 pixels make them smaller for comparison 
if im1s > 3000 and im2s > 3000: 
    print("Width and height of both images is bigger than 3000 pixels resizing them for easier comparison") 
    im1_resize = img1.resize((640, 480), Image.ANTIALIAS) 
    im2_resize = img2.resize((640, 480), Image.ANTIALIAS) 

im1_resize.save('im1r.jpg') 
im2_resize.save('im2r.jpg') 
+1

Die CPU-effizienteste Weise würde dies auf der GPU tun. Aber ich denke, das ist nicht die Antwort, die Sie suchen – tobspr

+0

Ich schlage vor, Sie Google 'vips' oder sogar hier auf SO suchen - es ist toll mit großen Bildern. –

Antwort

0

Sie sollen die Image.NEAREST Parameter beim Upsampling, d.h .:

im1_resize = img1.resize((640, 480), Image.NEAREST) 

Dies wird nur den nächsten Pixel nimmt bei Erhöhung der Frequenz, und somit sind das schnellste Upsampling-Verfahren.

Bei Verwendung von ANTIALIAS werden mehrere Pixel abgetastet, um das Bild in der Größe zu erzeugen, das viel langsamer ist.

Beachten Sie, dass Ihr Engpass wahrscheinlich diese Dateien aufschreibt und nicht hochskaliert.

+0

Es ist schneller, aber immer noch nicht schnell genug. Gibt es noch andere Möglichkeiten? Ich habe versucht, zu beschneiden, aber es dauert fast genauso lange wie das Ändern der Größe. – Gunnm

+0

Wie gesagt, das größte Problem ist wahrscheinlich das Schreiben der Dateien. Versuchen Sie zu messen, wie viel Zeit die Größenänderung braucht und wie viel Zeit das Schreiben auf die Festplatte dauert – tobspr

+0

Ich mache Dateien kleiner, nicht größer. Bildgröße dauert 6,5 s und speichert es 0,1 s ist es nur 640x480 Datei immerhin. – Gunnm

0

Ich habe zwei Empfehlungen. Einer ist libvips und der andere ist jpegtran-cffi.

Da ich kein Benchmarking gemacht habe, schreibe ich einfach die Punkte jeder Bibliothek auf.

Libvips unterstützt eine große Auswahl an Bildformaten und gewinnt seine Geschwindigkeit durch intelligente Entscheidungen, Multithreading und die Verwendung schneller CPU-Anweisungen explained here und benchmarks zu ermöglichen. Auch Python-Version ist here

Jpegtran funktioniert nur auf JPEGs. Sie erhalten ihre Geschwindigkeit, indem sie direkt mit den JPEG-Daten arbeiten, ohne die endgültige Ausgabe, die im Hauptteil readme zusammen mit einem Benchmark erklärt wird, erneut zu komprimieren.

Meine Vermutung ist, dass JPEGTRAN single-threaded ist und libvip übertreffen würde, wenn es in einer Multiprocessing-Umgebung ausgeführt werden kann. Der einzige Vergleich, den wir haben, ist der Vergleich des Kissens, mit dem sie beide vergleichen. Libvips übertrifft es um einen Faktor 6 und jpegtran vielleicht um den Faktor 2.