Detección y medición de formas irregulares en python opencv

Estoy intentando hacer un análisis de imagen usando OpenCV en Python, pero creo que las imágenes en sí mismas serán bastante complicadas, y nunca he hecho algo así antes, así que quiero expresar mi lógica y tal vez tener algunas ideas / código práctico para lograr lo que quiero hacer, antes de invertir mucho tiempo yendo por el camino equivocado.

Este hilo se acerca bastante a lo que quiero lograr y, en mi opinión, usa una imagen que debería ser aún más difícil de analizar que la mía. Sin embargo, me interesaría el tamaño de esas manchas de colores, en lugar de su distancia desde la esquina superior izquierda. También he estado siguiendoeste codigo, aunque no estoy especialmente interesado en un objeto de referencia (las dimensiones en píxeles solo serían suficientes por ahora y se pueden convertir después).

Aquí está la imagen de entrada:

Lo que estás viendo son cristales de hielo, y quiero encontrar el tamaño promedio de cada uno. Los límites de cada uno están razonablemente bien definidos, por lo que conceptualmente este es mi enfoque, y me gustaría escuchar cualquier sugerencia o comentario si este es el camino equivocado:

La imagen en RGB se importa y se convierte a gris de 8 bits (32 sería mejor según mis pruebas en ImageJ, pero aún no he descubierto cómo hacerlo en OpenCV).Los bordes son opcionalmente borrosos gaussianos para eliminar el ruido.Un detector de bordes Canny recoge las líneas.Las transformaciones morfológicas (erosión + dilatación) se realizan para intentar cerrar los límites un poco más.

En este punto parece que tengo que tomar una decisión. Podría binarizar la imagen y medir blobs por encima de un umbral (es decir, píxeles de valor máximo si los blobs son blancos), o continuar con la detección de bordes cerrando y rellenando los contornos más completamente. Los contornos parecen complicados al mirar ese tutorial, y aunque puedo hacer que el código se ejecute en mis imágenes, no detecta los cristales correctamente (como era de esperar). Tampoco estoy seguro de si debo transformarme antes de binarizar también.

Suponiendo que puedo hacer que todo funcione, estoy pensando que una medida razonable sería el eje más largo de la caja o elipse de cerramiento mínimo.

Todavía no he planificado todos los umbrales, y en consecuencia se pierden algunos de los cristales, pero dado que se están promediando, esto no presenta un problema masivo en este momento.

El script almacena las imágenes procesadas a medida que avanza, por lo que también me gustaría que la imagen de salida final sea similar a la imagen de 'blobs etiquetados' en el hilo SO vinculado, pero con cada blob anotado con sus dimensiones tal vez.

Así es como se vería una salida idealizada (incompleta), cada cristal es identificado, anotado y medido (bastante seguro de que puedo abordar la medición cuando llegue tan lejos).

Abridó las imágenes y los intentos de código anteriores ya que hacen que el hilo sea demasiado largo y ya no sean tan relevantes.Editar III:

Según los comentarios, el algoritmo de cuenca hidrográfica parece estar muy cerca de lograr lo que busco. Sin embargo, el problema aquí es que es muy difícil asignar las regiones marcadoras que requiere el algoritmo (http://docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html)

No creo que esto sea algo que pueda resolverse con umbrales a través del proceso de binarización, ya que el color aparente de los granos varía mucho más que el ejemplo del juguete en ese hilo.

Editar IV

Aquí hay un par de otras imágenes de prueba con las que he jugado. Le va mucho mejor de lo que esperaba con los cristales más pequeños, y obviamente hay muchas mejoras que podrían hacerse con los umbrales que aún no he probado.

Aquí está 1, la parte superior izquierda a la derecha inferior corresponde a la salida de imágenes en los pasos de Alex a continuación.

Y aquí hay un segundo con cristales más grandes.

Notarás que estos tienden a ser de color más homogéneo, pero con bordes más difíciles de discernir. Algo que me sorprendió un poco es que el relleno de borde es un poco celoso con algunas de las imágenes, habría pensado que este sería particularmente el caso de la imagen con los cristales muy pequeños, pero en realidad parece tener más efecto en los más grandes. Probablemente haya mucho espacio para mejorar la calidad de las imágenes de entrada de nuestra microscopía real, pero cuanto más 'floja' sea la programación del sistema, ¡más fácil será nuestra vida!

Respuestas a la pregunta(1)

Su respuesta a la pregunta