Python Numpy Array mit mehreren Bedingungen zum Durchlaufen des Bildes

Ich filtere einige Bilder, um unnötigen Hintergrund zu entfernen, und hatte bisher den besten Erfolg bei der Überprüfung auf Pixel-BGR-Werte (unter Verwendung von openCV). Das Problem ist, dass das Durchlaufen des Bildes mit 2 verschachtelten Schleifen viel zu langsam ist:

h, w, channels = img.shape
    for x in xrange(0,h):
        for y in xrange (0,w):
            pixel = img[x,y]
            blue = pixel[0]
            green = pixel[1]
            red = pixel[2]

            if green > 110:
                img[x,y] = [0,0,0]
                continue

            if blue < 100 and red < 50 and green > 80:
                img[x,y] = [0,0,0]
                continue

Es gibt noch ein paar ähnliche if-Anweisungen, aber Sie haben die Idee. Das Problem ist, dass dies auf einem 672x1250 auf einem i7 ungefähr 10 Sekunden dauert.

Nun, ich kann die erste if-Anweisung wie folgt leicht ausführen:

img[np.where((img > [0,110,0]).all(axis=2))] = [0,0,0]

Und es ist viel schneller, aber ich kann die anderen if-Anweisungen mit mehreren Bedingungen nicht mit np.where ausführen.

Hier ist, was ich versucht habe:

img[np.where((img < [100,0,0]).all(axis=2)) & ((img < [0,0,50]).all(axis=2)) & ((img > [0,80,0]).all(axis=2))] = [0,0,0]

Aber wirft einen Fehler:

ValueError: operands could not be broadcast together with shapes (2,0) (1250,672)

Alle Ideen, wie Sie mit np.where (oder etwas, das schneller als 2 verschachtelte Schleifen ist) richtig über das Bild iterieren können, sind sehr hilfreich!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage