2017-07-04 3 views
0

Ich habe zwei Graustufen PNGs. Diese Bilder haben die gleiche Breite und Höhe.Wie zu beschleunigen Python PIL Bild Filterfunktion

Zum Beispiel:

image1 image2

Ich brauche diese Bilder in der folgenden Art und Weise zu filtern: wenn ein Pixel aus image1 einen anderen Wert als 255 hat, und das Pixel in der gleichen Position einen Wert hat, Anders als 255 möchte ich beide Pixel in zwei separaten Bildern speichern (imageFiltered1 und imageFiltered2). Dann erzeugen beide gefilterten Bilder ein neues Bild, dank der Multiplikation mit ImageChops.

Dies ist der Algorithmus, den ich zusammen gezogen:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from PIL import Image, ImageChops 

def makeCustomMultiply(image1, image2): 
    assert image1.size == image2.size 

    imageFiltered1 = Image.new(size=image1.size, mode='L', color=255) 
    imageFiltered2 = Image.new(size=image1.size, mode='L', color=255) 

    for eachY in xrange(0, imageFiltered1.size[1]): 
     for eachX in xrange(0, imageFiltered1.size[0]): 
      pixel1 = image1.getpixel((eachX, eachY)) 
      pixel2 = image2.getpixel((eachX, eachY)) 

      if pixel1 == 255 or pixel2 == 255: 
       imageFiltered1.putpixel((eachX, eachY), 255) 
       imageFiltered2.putpixel((eachX, eachY), 255) 
      else: 
       imageFiltered1.putpixel((eachX, eachY), pixel1) 
       imageFiltered2.putpixel((eachX, eachY), pixel2) 

    combo = ImageChops.multiply(imageFiltered1, imageFiltered2) 
    return combo 

if __name__ == '__main__': 

    image1 = Image.open('image1.png') 
    image2 = Image.open('image2.png') 

    myCustomMultiply = makeCustomMultiply(image1, image2) 
    myCustomMultiply.save('myCustomMultiply.png') 

Es ist im Grunde eine Multiplikationsfunktion, wo schwarz/grau gegen Weiß nicht gezeigt

. Nur Grau zu Grau wird dann multipliziert.

Kann mein Code irgendwie verbessert werden? Ich möchte die verschachtelten For-Schleifen vermeiden, die meinen Code ziemlich verlangsamen. Diese Funktion muss jedes Mal, wenn ich mein Programm starte, hunderte Male benutzt werden.

Dank

ouput:

enter image description here

+0

dies ist die Ausgabe meiner Funktion zu verwenden:

+0

möchten Sie vielleicht [Code Review] (https://codereview.stackexchange.com/) überprüfen – Tbaki

Antwort

0

Von der docs:

getpixel
...
Beachten Sie, dass diese Methode recht langsam ist; Wenn Sie größere Teile eines Bildes aus Python bearbeiten müssen, können Sie entweder pixel access-Objekte (siehe load) oder die getdata-Methode verwenden.

Oder den reinen Python Teil des Codes zu beschleunigen, versuchen PyPy