Segmentación de imágenes de objetos conectados con cuenca.

Estoy tratando de separar los objetos conectados. Parece que Python y el algoritmo de cuenca hidrográfica (implementación de scipy) están bien adaptados para manejar esto.

Aquí está mi imagen y los puntos de semilla de cuenca hidrográfica generados automáticamente (máximos locales de la imagen con umbral y transformada a distancia):

seeds = myGenSeeds( image_grey ) 

introduzca la descripción de la imagen aquí

Hasta ahora tan bueno; Hay una semilla para cada objeto.

Las cosas se rompen cuando corro la cuenca sin embargo:

 segmented = ndimage.measurements.watershed_ift( 255 - image_grey, seeds)` 

introduzca la descripción de la imagen aquí

Tanto el clúster superior-medio como el clúster central están mal separados. En el grupo superior, un objeto se inundó alrededor de los otros dos. En el grupo central, aunque podría ser demasiado pequeño para ver aquí, la semilla del centro se inundó a solo unos pocos píxeles.

Tengo dos preguntas:

  1. ¿Es el algoritmo de cuenca hidrográfica una buena opción para separar objetos como este?
  2. Si es así, ¿hay algún tipo de preprocesamiento que tenga que hacer para que la imagen sea más adecuada para la segmentación de cuencas?

Encontré este hilo porque tengo el mismo problema con watershed_ift . Recomiendo usar la función de watershed en skimage.morphology . Acepta entradas flotantes, por lo que no pierde resolución en la imagen en escala de grises, y en realidad inunda toda la cuenca, mientras que el enfoque de ift solo parece inundar los valores de valores donde se encuentran los marcadores.

EDITAR: Asegúrese de multiplicar su transformación de distancia por -1 para que los picos se conviertan en valles, ¡o de lo contrario no obtendrá cuencas hidrográficas!

El algoritmo de cuenca es un algoritmo de segmentación simple y robusto. Sus datos parecen estar bien para ese tipo de algoritmo de segmentación. El preprocesamiento especial no es necesario por lo que puedo ver. Por supuesto que ya te has visto que en los casos está un poco al borde.

La cuenca hidrográfica se utiliza a menudo, pero no tiene en cuenta ningún conocimiento especial sobre los objetos que desea identificar. De esa manera podría haber algoritmos más sofisticados disponibles.

También podría haber versiones más sofisticadas del algoritmo de cuencas disponibles. Este módulo de Python llamado Watershed 2.0 tiene parámetros (a diferencia de la versión scipy). Me gustaría ajustar los parámetros un poco y ver si el resultado se puede mejorar.

Ilastik es una herramienta de uso frecuente para la segmentación automática. Incorpora aprendizaje semiautomático (básicamente, lo entrenas dando ejemplos y de ahí aprende las características importantes).

Debe aplicar el método de umbral de niveles múltiples después del paso de transformación de distancia. El centro de sus objetos tendrá el valor de píxel más alto en la imagen de nivel de gris resultante después de convertir la imagen de conversión de distancia a la imagen de nivel de gris. Aquí puede encontrar los centros de los objetos a partir del valor más alto del umbral. Mire este documento https://www.researchgate.net/publication/303703322_A_Multi-level_Thresholding_Based_Segmentation_Method_for_Microscopic_Fluorescence_In_Situ_Hybridization_FISH_Images