Robusto seguimiento de las manchas.
Tengo un problema de extracción de características de imagen Las imágenes de entrada son binarias (en blanco y negro) y pueden contener manchas de área y relación de aspecto aproximadamente conocidas. Estos deben ajustarse a los puntos suspensivos utilizando algún algoritmo de mejor ajuste.
Ejemplo de entrada:
Salida deseada:
Puede haber varios blobs (cero o más), el número no se conoce de antemano. El área aproximada y la relación de aspecto de todas las manchas es conocida (y es la misma). ¿Cuántos están en la imagen, su posición, orientación y tamaño real es lo que estoy tratando de encontrar? La salida debe ser una elipse de mejor ajuste para cada blob en función del tamaño real y la relación de aspecto encontrados.
Lo que dificulta esto es el ruido y las posibles superposiciones.
Ejemplo con ruido:
Ejemplo con superposición y ruido:
La imagen ruidosa puede tener agujeros en las manchas y también otras pequeñas manchas dispersas alrededor. Las otras pequeñas manchas no se cuentan porque son demasiado pequeñas y no cubren un área lo suficientemente densa como para ser consideradas una coincidencia real.
La imagen con superposición debe contarse como dos manchas porque el área es demasiado grande para que una sola mancha la cubra bien.
Una posible métrica que evalúa un posible ajuste es:
suma sobre todas las elipses de (K1 * porcentaje de desviación del tamaño esperado + K2 * porcentaje de desviación de la relación de aspecto esperada + K3 * porcentaje de elipse que no es negro + K4 * porcentaje superpuesto con cualquier otra elipse) + K5 * porcentaje de resto de la imagen que es negro
para algunos parámetros adecuadamente elegidos K1..K5. Un partido perfecto puntúa 0.
Puedo ver cómo resolver esto utilizando la fuerza bruta, por ejemplo, probando suficientes ajustes posibles para muestrear bien el espacio de búsqueda. No puedo pensar fuera de la mano de un método mucho más rápido que la fuerza bruta.
Preferiría ejemplos en python y / o opencv. Intentaré implementar y publicar cualquier solución sugerida en python. ¡Gracias!
PD No se puede suponer que un blob está conectado. Puede haber suficiente ruido para dividirlo en partes discontinuas.
P.P.S. Los pequeños bits de ruido no pueden ser eliminados por la erosión binaria. En algunas de mis imágenes, hay suficientes agujeros interiores que la erosión hace que la mancha (real) desaparezca si la imagen se erosiona lo suficiente como para hacer que los bits de ruido también desaparezcan.
P.P.P.S. Creo que sería muy difícil resolver esto utilizando cualquier enfoque basado en contornos. Los datos que veo en la práctica tienen demasiado ruido de borde, puede haber (y con frecuencia hay) bits de ruido que conectan blobs separados, o que separan un solo blob en varios componentes conectados (aparentes). Me gustaría un enfoque basado en áreas, ya que la cobertura del área parece ser mucho menos curiosa que las formas de los bordes.
P.P.P.P.S. Según lo solicitado, aquí hay un ejemplo con un corte continuo debido al ruido:
y una muestra con mucho ruido pero sin embargo un blob distinto:
EDITAR Ninguna de las respuestas realmente resuelve el problema, aunque Bharat ha sugerido una solución parcial que funciona bien para las manchas no superpuestas. Más por favor :) Otorgaré recompensas adicionales a cualquier solución real.