2016-08-04 20 views
0

Ich arbeite an Bildsegmentierung mit PIL, wo ich eine verschachtelte Iteration verwenden, um das Bild zu indizieren, aber es läuft sehr langsam. Auswertungsfunktion in numpy Indizierung Array mit PIL-Bildern

def evalPixel((r,g,b), sess): 
    pixel = [float(r)/255, float(g)/255, float(b)/255] 
    test = sess.run(y, feed_dict={x: [pixel]}) 
    return test[0][0] 

... 
... 

# sess = sesion loaded from TensorFlow 
rgb = Image.open("face.jpg") 
height, width = rgb.size 

for y in range(height): 
    for x in range(width): 
     if (evalPixel(rgb.getpixel((x,y)), sess) < 0.6): 
      rgb.putpixel((x,y), 0) 

toimage(im).show() 

Ich möchte so etwas tun, erweiterte Indizierung von numpy mit

im = np.array(rgb) 
im[ evalPixel(im, sess) < 0.6 ] = 0 

Aber es scheitert mit „Valueerror: zu viele Werte auszupacken“. Wie kann ich das machen?

Antwort

0

Versuchen Sie sich mit der folgenden:

im = np.array(rgb) 
im = [[evalPixel(x,sess) < 0.6 for x in row] for row in im] 

von Konstrukteuren mit Zeilen und Spalten zu erzeugen, ist es möglich, aus Versehen eine Funktion mit einem einzigen Argumente Anwendung zu vermeiden (in diesem Fall ein Tupel) zu einer ganzen Reihe oder Säule.

0

Ihre Funktion evalPixel nimmt als erstes Argument ein Tupel, aber Ihr numpy Array enthält keine Tupel (und kann keine enthalten). Sie müssen diese Funktion neu schreiben, um mit numpigen Arrays arbeiten zu können.

Ich habe versucht, ein funktionierendes Beispiel für Sie zu machen, aber der Code, den Sie teilen, enthält viele unbekannte Variablen (Sie zu viel weggelassen) und es ist mir nicht klar, was die evalPixel Funktion tun sollte.

+0

suchen Sie nach diesem Code: https: // goo.gl/Nr5T1L – miguelote