2016-07-26 17 views
0

Ich erstelle ein großes numpy Array mit [n_images, width, height, 3]. Um dies zu tun, erstelle ich eine leere Liste und füge numpy Arrays hinzu, die aus dem Beschneiden von RGB-Bildern erstellt wurden, und wandeln sie in numplige Arrays um.Was passiert, wenn PIL-Objekte in numpy umgewandelt werden?

stieß ich auf etwas wirklich seltsam versucht, meinen Code zu optimieren:

import time 
from PIL import Image 

im1=Image.open("random_png_image.png") 
im2=Image.open("random_png_image.png").convert('RGB') 

t1=time.time() 
a1=np.asarray(im1) 
t2=time.time() 
a2=np.asarray(im2) 
t3=time.time() 

print("Converting to numpy without converting to RGB mode first took: %0,3f ms"%((t2-t1)*1000.0)) 
print("Converting to numpy after the image was converted to RGB first took: %0,3f ms"%((t3-t2)*1000.0)) 

Und ich bekomme einen huuuge Unterschied:

  • um 80 ms für den ersten op
  • um 8 ms für die zweite

Warum ist das? Führt PIL implizit dieses convert_to_rgb aus, wenn es in ein numpy Array konvertiert wird? Beide PIL-Objekte haben, wenn sie überprüft werden, den RGB-Modus, also ist es seltsam. Gibt es eine Möglichkeit, den Prozess zu beschleunigen? Was muss ich tun, um diesen Prozess zu optimieren? PIL nicht benutzen? Konvertiere sie danach in ein Array?

+0

Vielleicht möchten Sie in scikit-Bild – MaxNoe

+0

haben Vielen Dank! Wird besorgt ! – jean

Antwort

2

Vom official documentation for Image.open:

öffnet und identifiziert die gegebene Bilddatei. Dies ist eine faule Operation; die Funktion den Datei-Header liest, aber die tatsächliche Bilddaten nicht Lesen aus der Datei, bis Sie versuchen, die Daten

Mit der ersten Operation zu verarbeiten, sind Timing Sie den Prozess des Lesens der Daten von der Festplatte.

+0

Ja, ich dachte mir, dass es so etwas ist, weißt du, ob es möglich ist, diese Zeit irgendwie zu reduzieren, eine Fast_Load-Funktion von PIL oder was auch immer? – jean

+0

@jean: Kaufen Sie eine schnellere Festplatte? Sie werden die Festplattenleistung in der Software nicht verbessern. Wenn Sie Dinge öfter von der Festplatte lesen, als Sie benötigen, können Sie versuchen, dies zu reduzieren, aber es gibt keine "fast_load" -Funktion, die die Festplatte irgendwie schneller macht. – user2357112

+0

Ok, schade! Vielen Dank ! – jean