Python numpy array con múltiples condiciones para iterar sobre la imagen

Estoy filtrando algunas imágenes para eliminar el fondo innecesario, y hasta ahora he tenido el mejor éxito al verificar los valores de píxeles BGR (usando openCV). El problema es que iterar sobre la imagen con 2 bucles anidados es demasiado lento:

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

Hay un par de sentencias if más similares, pero se entiende la idea. El problema es que esto toma alrededor de 10 segundos en un 672x1250 en un i7.

Ahora, puedo hacer fácilmente la primera declaración if así:

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

Y es mucho más rápido, pero parece que no puedo hacer las otras declaraciones if con múltiples condiciones en ellas usando np.where.

Esto es lo que he intentado:

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]

Pero arroja un error:

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

¡Cualquier idea de cómo iterar correctamente sobre la imagen usando np.where (o cualquier cosa que sea más rápida que 2 bucles anidados) será de gran ayuda!

Respuestas a la pregunta(1)

Su respuesta a la pregunta