Encontrar los índices (x, y) de valores de color específicos (R, G, B) a partir de imágenes almacenadas en NumPy ndarrays

Tengo una imagen almacenada en una matriz numpy, según lo producido por imread() :

 >>> ndim array([[[ 0, 0, 0], [ 4, 0, 0], [ 8, 0, 0], ..., [247, 0, 28], [251, 0, 28], [255, 0, 28]], [[ 0, 255, 227], [ 4, 255, 227], [ 8, 255, 227], ..., [247, 255, 255], [251, 255, 255], [255, 255, 255]]], dtype=uint8) >>> ndim.shape (512, 512, 3) 

Quiero encontrar eficientemente la (x, y) coordenada (o coordenadas) de píxeles con un valor de color específico, por ejemplo

 >>> c array([ 32, 32, 109], dtype=uint8) >>> ndim[200,200] array([ 32, 32, 109], dtype=uint8) >>> ndim.T[0, 200, 200] 32 >>> ndim.T[1, 200, 200] 32 >>> ndim.T[2, 200, 200] 109 

… en este caso, sé que el píxel en (200, 200) tiene el valor RGB (32, 32, 109) – Puedo probar esto.

Lo que quiero hacer es consultar el ndarray para un valor de píxel y recuperar las coordenadas. En el caso anterior, la función putativa find_pixel(c) devolvería (200, 200).

Idealmente, esta función find_pixel() devolvería una lista de tuplas de coordenadas y no solo el primer valor que encuentre.

He mirado el “índice de fantasía” de Numpy, que me confundió enormemente … La mayoría de mis bashs de resolver esto han sido exagerados e innecesariamente barrocos.

Estoy seguro de que hay un método muy simple que estoy pasando por alto aquí. ¿Cuál es la mejor manera de hacerlo? ¿Existe un mecanismo para obtener estos valores mejor que el que he descrito?

Para algunas matrices de colores a y una tupla de color c :

 indices = numpy.where(numpy.all(a == c, axis=-1)) 

indices ahora deben ser una tupla de 2 matrices, la primera de las cuales contiene los índices en las primeras dimensiones y la segunda de las cuales contiene los índices en la segunda dimensión correspondientes a los valores de píxeles de c .

Si necesita esto como una lista de tuplas de coordenadas, use zip:

 coords = zip(indices[0], indices[1]) 

Por ejemplo:

 import numpy a = numpy.zeros((4, 4, 3), 'int') for n in range(4): for m in range(4): a[n, m, :] = n + m if (n + m) == 4: print n, m c = (4, 4, 4) indices = numpy.where(numpy.all(a == c, axis=-1)) print indices print zip(indices[0], indices[1]) 

saldrá:

 1 3 2 2 3 1 (array([1, 2, 3]), array([3, 2, 1])) [(1, 3), (2, 2), (3, 1)] 

que corresponde a todos los píxeles de valor (4, 4, 4).