Python 3: estoy tratando de encontrar todos los píxeles verdes en una imagen atravesándolos con un np.array, pero no puedo evitar el error de índice

Mi código actualmente consiste en cargar la imagen, lo cual es exitoso y no creo que tenga ninguna conexión con el problema.

Luego paso a transformar la imagen en color en un np.array llamado rgb

# convert image into array rgb = np.array(img) red = rgb[:,:,0] green = rgb[:,:,1] blue = rgb[:,:,2] 

Para volver a verificar mi comprensión de esta matriz, en caso de que pueda ser la raíz del problema, es una matriz tal que rgb [coordenada x, coordenada y, banda de color] que tiene el valor entre 0-255 de cualquiera de rojo , verde o azul.

Entonces, mi idea fue hacer un bucle nested para atravesar todos los píxeles de mi imagen (620px, 400px) y clasificarlos según la proporción de verde a azul y rojo en un bash de seleccionar los píxeles más verdes y establecer todos los demás en negro o 0.

 for i in range(xsize): for j in range(ysize): color = rgb[i,j]  128): if(color[1]  128): rgb[i,j] = [0,0,0] 

El error que estoy recibiendo al intentar ejecutar esto es el siguiente:

IndexError: el índice 400 está fuera de los límites del eje 0 con tamaño 400

Pensé que podría tener algo que ver con los límites que daba i y j, así que intenté clasificar solo una pequeña parte interior de la imagen, pero aún así obtuve el mismo error. En este punto, estoy perdido en lo que es incluso la raíz del error y mucho menos la solución.

En respuesta directa a su pregunta, el eje y se da primero en matrices numpy , seguido del eje x , así que intercambie sus índices.


Menos directamente, encontrará que los bucles son muy lentos en Python y que, en general, es mejor que utilicen numerosas operaciones numpy numpy. Además, a menudo le resultará más fácil encontrar tonos de verde en el espacio de colores de HSV .

Empecemos con una rueda de color HSL:

introduzca la descripción de la imagen aquí

y asume que quieres hacer todos los verdes en negro. Entonces, desde esa página de Wikipedia, el Tono correspondiente a Verde es de 120 grados, lo que significa que puedes hacer esto:

 #!/usr/local/bin/python3 import numpy as np from PIL import Image # Open image and make RGB and HSV versions RGBim = Image.open("image.png").convert('RGB') HSVim = RGBim.convert('HSV') # Make numpy versions RGBna = np.array(RGBim) HSVna = np.array(HSVim) # Extract Hue H = HSVna[:,:,0] # Find all green pixels, ie where 100 < Hue < 140 lo,hi = 100,140 # Rescale to 0-255, rather than 0-360 because we are using uint8 lo = int((lo * 255) / 360) hi = int((hi * 255) / 360) green = np.where((H>lo) & (H 

Lo que da:

introduzca la descripción de la imagen aquí


Aquí hay una versión ligeramente mejorada que retiene el alfa / transparencia, y combina píxeles rojos para mayor diversión:

 #!/usr/local/bin/python3 import numpy as np from PIL import Image # Open image and make RGB and HSV versions im = Image.open("image.png") # Save Alpha if present, then remove if 'A' in im.getbands(): savedAlpha = im.getchannel('A') im = im.convert('RGB') # Make HSV version HSVim = im.convert('HSV') # Make numpy versions RGBna = np.array(im) HSVna = np.array(HSVim) # Extract Hue H = HSVna[:,:,0] # Find all red pixels, ie where 340 < Hue < 20 lo,hi = 340,20 # Rescale to 0-255, rather than 0-360 because we are using uint8 lo = int((lo * 255) / 360) hi = int((hi * 255) / 360) red = np.where((H>lo) | (H 

introduzca la descripción de la imagen aquí