Blutzellen zählen

7

Wie zählt man Blutzellen in opencv? Das Problem ist, dass sie zusammenhalten.

Das Beispielbild:

Geben Sie hier die Bildbeschreibung ein

Vielleicht paarweises geometrisches Histogramm ( geometrische Histogramme ), das zur Anpassung der Teilkreisform geeignet ist?

mrgloom
quelle
Ich schlage Ihnen die Lektüre "Microscope Image Processing" von Academic Press vor. Ich habe gehört, dass ein E-Book online "im Umlauf" ist.
Heltonbiker
@heltonbiker Ich habe dort keinen Algorithmus für meine Aufgabe gefunden, nur einen Standard-Wasserscheidenalgorithmus.
Mrgloom
sehr ähnlich: dsp.stackexchange.com/q/2516/29
Endolith
@endolith aber ich habe keine trennbaren Blobs.
Mrgloom
@ Mrgloom: Was? Sie wollen die einzelnen Kreise zählen, oder? Nicht die Blobs?
Endolith

Antworten:

5

Nur eine Idee ohne Erfolgsgarantie:

  1. Isolieren Sie die roten Blobs (z. B. markieren Sie sie als weiß, der Rest des Bildes als schwarz).
  2. Führen Sie eine Abstandstransformation für die weißen Blobs durch (jedes Pixel gibt den Abstand zum nächsten schwarzen Pixel an).
  3. Führen Sie eine Nicht-Maxima-Unterdrückung durch (im Idealfall bleiben nur die Zentren der Kreise übrig).
  4. mit nicht idealen Bedingungen umgehen (kleine Peaks aus Artefakten herausfiltern)
bjoernz
quelle
Es sieht so aus, als ob der Wasserscheidenalgorithmus funktioniert. imagejdocu.tudor.lu/… Das Problem ist, dass die Entfernungskarte nicht mit Objekten umgehen kann, die sich stark überlappen. Ich denke, ich muss irgendwie die Kreisform verwenden. dl.dropbox.com/u/8841028/blood%20cells/watershed.png dl.dropbox.com/u/8841028/blood%20cells/distance_map.png
mrgloom
@mrgloom: Der Aspekt der "Kreis" -Geometrie liegt zwischen den Schritten 2 und 3. Bei einem Kreis ist der Punkt mit dem maximalen Abstand zu den Kanten der Mittelpunkt. Diese Eigenschaft gilt auch dann sehr gut, wenn sich Kreise überlappen. Sie erhalten zwei Maxima für den kombinierten Blob. Der Wert jedes Maximums entspricht dem entsprechenden Radius. Dies ist eine einfache Überprüfung in Schritt 4: Zeichnen Sie die erwarteten Kreise und messen Sie die Überlappung zwischen dem Kreis und der Blutzelle.
MSalters
1

Ähnlich wie bei @ SalemMansours Vorschlag handelt es sich auch um einen gebietsbezogenen Ansatz.

Eine wirklich grobe Schätzung kann berechnet werden, wenn wir davon ausgehen können

  • dass sich die Zellengrößen (in Pixel) nicht in allen Bildern stark unterscheiden,
  • dass sich die Zellenfarben in allen Bildern nicht sehr unterscheiden.

Dann können Sie die durchschnittliche Größe einer Zelle vorab messen und eine billige Maske für die Zellen wie folgt berechnen:

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)

Es gibt mir ~ 211 für die Zellenzahl.

Das Maskenbild sieht folgendermaßen aus: Geben Sie hier die Bildbeschreibung ein

Für dieses kleinere Bild würde ich 9 Zellen manuell zählen:

Geben Sie hier die Bildbeschreibung ein

Die Lösung ergibt das Ergebnis von 9.46502057613.


Wenn eine der Annahmen ungültig ist, ist dieser Ansatz natürlich nutzlos. Es ist auch empfindlich gegenüber der harten Farbschwelle und der Zellgrößenkonstante. Aufgrund des Farbausgleichs kann es völlig fehlschlagen, wenn im Bild keine Zelle vorhanden ist.

Aber es ist wirklich einfach und billig :)

Bálint Fodor
quelle
-1

Zuerst müssen Sie das Bild mithilfe der otsu-Schwellenwertmethode in ein Binärbild ändern. Sie können die Zellen (überlappende Zellen) durch mathematische Morphologie wie Erosion und Öffnung trennen. Schätzen Sie die Fläche.

Salem Mansour
quelle
1
Ich mag diese Antwort sehr und es ist ziemlich genau das, was ich empfehlen würde, aber es ist ein bisschen unklar. Wenn Sie es ein wenig bearbeiten könnten, um die Klarheit zu verbessern, würde ich es definitiv verbessern.
Nivag