Schnellere Methode zum Anpassen der PIL-Pixelwerte

Ich schreibe ein Skript für Chroma Key (grüner Bildschirm) und setze einige Videos mit Python und PIL (Kissen) zusammen. Ich kann die 720p-Bilder verschlüsseln, aber es sind noch einige grüne Flecken übrig. Verständlich, aber ich schreibe eine Routine, um diesen Überlauf zu beseitigen ... aber ich habe Probleme damit, wie lange es dauert. Ich kann wahrscheinlich mit numpy-Tricks bessere Geschwindigkeiten erreichen, bin aber nicht so vertraut damit. Irgendwelche Ideen

Hier ist meine Despill-Routine. Es werden ein PIL-Bild und eine Empfindlichkeitszahl benötigt, aber ich habe das bisher bei 1 belassen ... es hat gut funktioniert. Ich komme in etwas mehr als 4 Sekunden für ein 720p-Bild, um diesen Überlauf zu entfernen. Zum Vergleich läuft die Chroma-Key-Routine in etwa 2 Sekunden pro Frame.

def despill(img, sensitivity=1):
    """
    Blue limits green.
    """
    start = time.time()
    print '\t[*] Starting despill'
    width, height = img.size
    num_channels = len(img.getbands())
    out = Image.new("RGBA", img.size, color=0)
    for j in range(height):
        for i in range(width):
            #r,g,b,a = data[j,i]
            r,g,b,a = img.getpixel((i,j))
            if g > (b*sensitivity):
                out_g = (b*sensitivity)
            else:
                out_g = g
            # end if

            out.putpixel((i,j), (r,out_g,b,a))
        # end for
    # end for
    out.show()
    print '\t[+] done.'
    print '\t[!] Took: %0.1f seconds' % (time.time()-start)
    exit()
    return out
# end despill

Anstelle von putpixel habe ich versucht, die Ausgabepixelwerte in ein numpy-Array zu schreiben und dann das Array in ein PIL-Bild umzuwandeln, aber das war im Durchschnitt etwas mehr als 5 Sekunden ... das war also irgendwie schneller. Ich weiß, dass Putpixel nicht die beste Option ist, aber ich bin ratlos ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage