2015-11-16 34 views
7

Sono relativamente nuovo a OpenCV e non ho un forte background di elaborazione delle immagini. Attualmente sto lavorando a un progetto per scrivere un programma per contare tutte le cellule biologiche dal microscopio in un'immagine. Ho provato vari metodi da fonti Internet per applicare il conteggio sull'immagine, ma nessuno di essi funziona come previsto.Conteggio celle biologiche C++ con OpenCV

Alcuni dei metodi che ho usato sono:

  1. Trovare contorni dell'immagine filtrata. (non funziona bene con le celle vicine)
  2. Sfocatura gaussiana e trova i massimi locali sull'immagine. (Stesso problema)
  3. Algoritmo di Canny (risultato di uscita rileva segmento danni cellule)

Questo è un esempio di questa immagine Devo contare il numero totale di cellule.

enter image description here

mio algoritmo di conteggio attuale funziona meglio se le cellule non sono vicini. Ad esempio come questo:

enter image description here

Tuttavia, l'algoritmo ancora sicuro a frammentarsi 3 cellule che sono incollati insieme in centro dell'immagine.

Quindi, cosa posso fare per rilevare il numero totale di celle in un'immagine con meno falsi negativi/positivi?

+2

Date un'occhiata a questa pagina: http://stackoverflow.com/questions/5298884/finding-number-of-colored-shapes-from-picture-using -python e http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice Potrebbe essere simile a quello che stai cercando! –

+0

le dimensioni di ogni cella sono simili? – Micka

+0

@Micka la dimensione della cella in ogni immagine è simile, ma ci sono diverse immagini per diversi livelli di zoom, quindi la dimensione della cella da un'immagine non può essere applicata ad un'altra immagine – Woody

risposta

2

Il tuo approccio è quasi perfetto. Tuttavia, ha bisogno di alcuni passaggi aggiuntivi. Hai bisogno di qualcosa chiamato Morphological Operations.

  1. Filtra la tua immagine come la tua cosa è buona.
  2. Applicare una soglia in base al colore o convertirla in grigio, quindi limitarla. Post scriptum dagli esempi che hai fornito, sembra che il colore della tua cella sia troppo saturo. Quindi, puoi convertirlo in HSV Space e quindi effettuare il threshold usando il canale S (dimmi se hai bisogno di aiuto qui).
  3. Applicare gli operatori morfologici Opening sull'immagine con soglia. Post scriptum puoi provare qualche taglia kernal e scegliere il migliore.
  4. Prendere contorni e fare quello che stavi facendo.

apertura:

cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5), cv::Point(1, 1)); 
cv::morphologyEx(img, img, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1); 
+0

come si eseguono gli operatori di apertura sull'immagine? – Woody

+0

@woody modificato con il codice –

+0

Ho provato il tuo operatore di apertura e cambio MORPH_RECT in MORPH_ELLIPSE, il rilevamento è migliore di prima! Ma ci sono ancora falsi negativi in ​​cui la cella non viene rilevata. – Woody