Segmentación celular y conteo de fluorescencia en Python

¿Cómo puedo segmentar las células de una imagen tomada en un microscopio, siguiendo las líneas de lo que se hizo aquí en Matlab?

http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/

Además, si tomo varias imágenes en diferentes canales fluorescentes (después de teñir las células con algún anticuerpo / fabricante), ¿cómo puedo cuantificar automáticamente la fracción de células positivas para cada marcador? ¿Alguien ha hecho algo como esto en Python? ¿O hay una biblioteca en Python que puede usarse para hacer esto?

¿Has leído el tutorial en pythonvision.org?

http://pythonvision.org/basic-tutorial

Es muy similar a lo que buscas.

Puedes hacer esto en Python usando la biblioteca OpenCV .

En particular, te interesarán las siguientes características:

  • estiramiento del histogtwig ( cv.EqualizeHist ). Falta en la API de Python actual, pero si descarga la última versión SVN de OpenCV, puede usarla. Esta parte es solo para fines de visualización, no se requiere para obtener el mismo resultado
  • umbral de imagen
  • Operaciones morfológicas como erosionar (también dilatar, abrir, cerrar, etc.)
  • determine el contorno de un blob en una imagen binaria usando cv.FindContours – vea esta pregunta . Está usando C, no Python, pero las API son virtualmente las mismas, así que puedes aprender mucho desde allí
  • segmentación de cuencas (use cv.Watershed – existe , pero por alguna razón no lo puedo encontrar en el manual)

Con eso en mente, aquí es cómo usaría OpenCV para obtener los mismos resultados que en el artículo matlab:

  1. Umbral de la imagen utilizando un umbral determinado empíricamente (o el método de Ohtsu)
  2. Aplicar dilatación a la imagen para rellenar los huecos. Opcionalmente, desenfocar la imagen antes del paso de umbral anterior, que también eliminará pequeños “agujeros”
  3. Determinar contornos utilizando cv.FindContours
  4. Opcionalmente, pintar los contornos.
  5. Usando la información del blob, itere sobre cada blob en la imagen original y aplique un umbral separado para cada blob para separar los núcleos celulares (esto es lo que está haciendo su operación de imextendedmax )
  6. Opcionalmente, pintar en los núcleos.
  7. Aplicar la transformada de cuenca.

No he intentado nada de esto (lo siento, no tengo tiempo ahora), así que no puedo mostrarte ningún código todavía. Sin embargo, según mi experiencia con OpenCV, estoy seguro de que todo hasta el paso 7 funcionará bien. Nunca he usado la transformación de la cuenca de OpenCV antes, pero no veo una razón para que no funcione aquí.

Intente seguir los pasos que he mostrado y háganos saber si tiene algún problema. Asegúrate de publicar tu fuente para que más personas puedan ayudarte.

Finalmente, para responder a su pregunta sobre la tinción de células y la cuantificación de su presencia, es bastante fácil saber los tintes que está utilizando. Por ejemplo, para determinar las células teñidas con tinte rojo, extraería el canal rojo de la imagen y examinaría las áreas de alta intensidad (tal vez mediante un umbral).

También puede encontrar esta biblioteca útil:

https://github.com/luispedro/pymorph/

Me resultó más fácil moverse con la biblioteca OpenCV.

Y solo para agregar uno más: cellprofiler.org (software de análisis de imagen de celda de código abierto, en python)