¿Cómo optimizar esta iteración de imagen en numpy?

Estoy usando este código para detectar el color verde en la imagen.

El problema es que esta iteración es muy lenta.

¿Cómo hacerlo más rápido? Si está utilizando numpy, ¿cómo hacerlo de forma numpy?

def convertGreen(rawimg): width, height, channels = rawimg.shape size = (w, h, channels) = (width, height, 1) processedimg = np.zeros(size, np.uint8) for wimg in range(0,width): for himg in range(0,height): blue = rawimg.item(wimg,himg,0) green = rawimg.item(wimg,himg,1) red = rawimg.item(wimg,himg,2) exg = 2*green-red-blue if(exg > 50): processedimg.itemset((wimg,himg,0),exg) return processedimg 

Intenta simplemente esto:

 blue = rawimg[:,:,0] green = rawimg[:,:,1] red = rawimg[:,:,2] exg = 2*green-red-blue processedimg = np.where(exg > 50, exg, 0) 

Solo he incursionado con numpy como aficionado, pero creo que podría aprovechar la función que crea una nueva matriz np a partir de una existente https://docs.scipy.org/doc/numpy/reference/generated/numpy .fromfunction.html

Esto es lo que creo que podría funcionar en ese caso, lo que aprovecharía la velocidad de numpy:

 def handle_colors(img, x, y): blue = img.item(x,y,0) green = img.item(x,y,1) red = img.item(x,y,2) exg = 2*green-red-blue if exg > 50: return (exg, green, red) return blue, green, red def convertGreen(rawimg): processedimg = np.fromfunction(lambda i, j: handle_colors(rawimg, i, j), rawimg.shape) return processedimg