Tengamos una imagen (escala de grises o incluso binaria) como se muestra en la siguiente figura en el lado izquierdo, el objetivo es generar una lista de puntos, es decir, coordenadas en forma de (x, y) para cada paquete del píxeles oscuros en la imagen.
¿Cuáles son las herramientas de procesamiento de imágenes adecuadas para hacer esto y dónde están disponibles?
Actualizaciones:
1)
Aquí puede encontrar más detalles sobre el problema. (Tenga en cuenta la variación en el tamaño de los paquetes)
Puedo sugerir que se detecten paquetes para calcular el límite del casco convexo para cada uno y luego encontrar el centroide representativo {ver esto para más detalles} .
2)
Aquí está el resultado producido por la aplicación de la Transformación de Distancia (sugerido por "Libor"). Tenga en cuenta mis anotaciones en la figura. ¡El método no funciona como era prometedor!
3) ¡
La erosión elimina los paquetes pequeños!
from __future__ import division
from scipy import zeros, ndimage as dsp
from pylab import subplot,plot,matshow,show
img = zeros((30,30))
img[10:14,10:14] = 1
img[16:17,16:17] = 1
img[19:23,19] = 1
img[19,19:23] = 1
subplot(221)
matshow(img,0)
subplot(222)
y = dsp.binary_erosion(img,[[1,1],[1,1]])
matshow(y,0)
subplot(223)
y = dsp.binary_erosion(img,[[0,1,0],[1,1,1],[0,1,0]])
matshow(y,0)
subplot(224)
y = dsp.binary_erosion(img,[[1,1,1],[1,1,1],[1,1,1]])
matshow(y,0)
show()
4)
Bueno, aquí hay una implementación de Python (es decir, el lenguaje del amor :)) de la idea de etiquetado (también propuesta por "Jean-Yves" a continuación):
subplot(221)
l,n = dsp.label(img)
sl = dsp.find_objects(l)
for s in sl:
x = (s[1].start+s[1].stop-1)/2
y = (s[0].start+s[0].stop-1)/2
plot(x,y,'wo')
y el resultado:
Tenga en cuenta que, aunque se realiza en Python tan rápido debido al rendimiento de Scipy, el procedimiento en segundo plano en label
función debería ser una iteración agotadora. Esto puede considerarse como una compensación. Así que por un tiempo sigo ansioso por buscar algoritmos más eficientes. Y también tenga en cuenta que en el código dado anteriormente encontré el centro de la geometría de manera tan simple, mientras que para formas complejas o asimétricas esto puede hacer que el posicionamiento sea sesgado. Es decir, es un trabajo en progreso;).
5)
Aquí hay un caso complejo (una imagen real) capturado desde aquí en el que se aplicó la propuesta de etiquetado y verá los resultados. Tenga en cuenta que solo tomó 0.015 s para todo el procedimiento, incluido el etiquetado y la búsqueda de los objetos. Chicos astutos , creo que hicieron un muy buen trabajo. ¡Guauu! {haga clic derecho en la imagen, haga clic en ver imagen para resolución completa}