contar células sanguíneas

7

¿Cómo contar las células sanguíneas en opencv? El problema es que se mantienen unidos.

La imagen de ejemplo:

ingrese la descripción de la imagen aquí

¿Quizás histograma geométrico por pares ( Histogramas geométricos ) adecuado para hacer coincidir la forma del círculo parcial?

mrgloom
fuente
Le sugiero la lectura "Procesamiento de imágenes de microscopio", de Academic Press. He oído que hay un libro electrónico "circulando" en línea.
Heltonbiker
@heltonbiker No encontré ningún algoritmo para mi tarea, solo el algoritmo estándar de cuenca hidrográfica.
mrgloom
muy similar: dsp.stackexchange.com/q/2516/29
endolith
@endolith pero no tengo blobs separables.
mrgloom
@mrgloom: ¿Qué? ¿Quieres contar los círculos individuales, verdad? ¿No las manchas?
endolito

Respuestas:

5

Solo una idea sin garantía de éxito:

  1. aísle las manchas rojas (por ejemplo, márquelas como blancas, el resto de la imagen como negras)
  2. realizar una transformación de distancia para las manchas blancas (cada píxel indica la distancia al píxel negro más cercano)
  3. realizar una supresión no máxima (idealmente solo quedan los centros de los círculos)
  4. lidiar con condiciones no ideales (filtrar pequeños picos de artefactos)
bjoernz
fuente
parece que el algoritmo de cuenca funciona imagejdocu.tudor.lu/... el problema es que el mapa de distancia no se puede manejar con objetos que se superponen mucho. Creo que necesito usar la forma del círculo de alguna manera. dl.dropbox.com/u/8841028/blood%20cells/watershed.png dl.dropbox.com/u/8841028/blood%20cells/distance_map.png
mrgloom
@mrgloom: el aspecto geométrico del "círculo" se encuentra entre los pasos 2 y 3. Para un círculo, el punto de máxima distancia a los bordes es el centro. Esta propiedad se mantiene muy bien incluso si los círculos se superponen. Obtienes dos máximos para el blob combinado. El valor de cada máximo corresponde al radio correspondiente, así que esa es una verificación fácil en el paso 4: dibuja los círculos que esperas y mide la superposición entre el círculo y la célula sanguínea.
MSalters
1

De manera similar a la sugerencia de @ SalemMansour, también es un enfoque basado en áreas.

Se puede calcular una estimación realmente aproximada si podemos suponer

  • que los tamaños de celda (en píxeles) no difieren mucho en todas las imágenes,
  • que los colores de las celdas no difieren mucho en todas las imágenes.

Luego, puede medir previamente el tamaño promedio de una celda y calcular una máscara barata para las celdas de esta manera:

from SimpleCV import *
im = Image("s58Hl.jpg")
r,g,b = im.splitChannels()
cellmask = g.equalize().threshold(90).invert()
masksize = cellmask.getGrayNumpy().sum()/255.
cellsize = 27*27 # premeasured cell size
cellnum = masksize/cellsize
print(cellnum)

Me da ~ 211 para el recuento celular.

La imagen de la máscara es así: ingrese la descripción de la imagen aquí

Para esta imagen más pequeña, contaría manualmente 9 celdas:

ingrese la descripción de la imagen aquí

La solución da el resultado de 9.46502057613.


Por supuesto, si alguno de los supuestos no es válido, entonces este enfoque es inútil. También es sensible al umbral de color duro y al tamaño de celda constante. Debido a la ecualización del color, puede fallar totalmente si no hay una celda presente en la imagen.

Pero es realmente simple y barato :)

Bálint Fodor
fuente
-1

Primero debe cambiar la imagen a imagen binaria utilizando el umbral, el método otsu. Puede separar las celdas (celdas superpuestas) utilizando la morfología matemática como la erosión, la apertura. Estima el área.

Salem Mansour
fuente
1
Me gusta bastante esta respuesta y es más o menos lo que recomendaría, pero no está claro. Si pudieras editarlo un poco para mejorar la claridad, definitivamente lo votaría.
nivag