contagem de células sanguíneas

7

Como contar células sanguíneas em opencv? O problema é que eles permanecem juntos.

A imagem de exemplo:

insira a descrição da imagem aqui

Talvez o histograma geométrico em pares (histogramas geométricos ) seja adequado para combinar a forma do círculo parcial?

Mrgloom
fonte
Sugiro a leitura "Microscope Image Processing", da Academic Press. Ouvi dizer que há um e-book "circulando" on-line.
heltonbiker
@ heltonbiker Não encontrei o algoritmo para minha tarefa apenas o algoritmo padrão de bacia hidrográfica.
Mrgloom 9/08/12
muito semelhante: dsp.stackexchange.com/q/2516/29
endolith
@ endolith mas eu não tenho blobs separáveis.
mrgloom
@mrgloom: O que? Você quer contar os círculos individuais, certo? Não são as bolhas?
Endolith 28/08/12

Respostas:

5

Apenas uma ideia sem garantia de sucesso:

  1. isole os blobs vermelhos (por exemplo, marque-os como brancos e o restante da imagem como preto)
  2. faça uma transformação de distância para os blobs brancos (cada pixel indica a distância do pixel preto mais próximo)
  3. realizar uma supressão não máxima (idealmente, apenas os centros dos círculos permanecem)
  4. lidar com condições não ideais (filtrar pequenos picos de artefatos)
bjoernz
fonte
parece que o algoritmo da bacia hidrográfica funciona imagejdocu.tudor.lu/… o problema é que o mapa de distância não pode lidar com objetos que se sobrepõem muito. Acho que preciso usar a forma do círculo de alguma forma. dl.dropbox.com/u/8841028/blood%20cells/watershed.png dl.dropbox.com/u/8841028/blood%20cells/distance_map.png
mrgloom
@mrgloom: O aspecto da geometria "círculo" está entre as etapas 2 e 3. Para um círculo, o ponto de distância máxima às arestas é o centro. Essa propriedade se mantém muito bem, mesmo que os círculos se sobreponham. Você recebe dois máximos para o blob combinado. O valor de cada máximo corresponde ao raio correspondente, de modo que é uma verificação fácil na etapa 4: desenhe os círculos que você espera e meça a sobreposição entre o círculo e a célula sanguínea.
MSalters
1

Da mesma forma que a sugestão do @ SalemMansour, também é uma abordagem baseada em área.

Uma estimativa realmente aproximada pode ser calculada se pudermos assumir

  • que os tamanhos das células (em pixels) não diferem muito em todas as imagens,
  • que as cores das células não diferem muito em todas as imagens.

Em seguida, você pode pré-medir o tamanho médio de uma célula e calcular uma máscara barata para células como esta:

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)

Isso me dá ~ 211 para a contagem de células.

A imagem da máscara é assim: insira a descrição da imagem aqui

Para esta imagem menor, eu contaria manualmente 9 células:

insira a descrição da imagem aqui

A solução fornece o resultado de 9.46502057613.


Obviamente, se alguma das suposições for inválida, essa abordagem será inútil. Também é sensível ao limite de cores fortes e ao tamanho constante da célula. Devido à equalização da cor, ela pode falhar totalmente se nenhuma célula estiver presente na imagem.

Mas é realmente simples e barato :)

Bálint Fodor
fonte
-1

Primeiro, você deve alterar a imagem para imagem binária usando o método otsu de limite. Você pode separar as células (células sobrepostas) usando morfologia matemática, como erosão e abertura. Estimar a área.

Salem Mansour
fonte
11
Eu gosto bastante desta resposta e é praticamente o que eu recomendaria, mas é um pouco incerto. Se você pudesse editá-lo um pouco para melhorar a clareza, eu definitivamente votaria novamente.
Nivag 28/04