Trova gli stomi in un'immagine di microscopia vegetale


26

Ecco una domanda per gli esperti di elaborazione delle immagini.

Sto lavorando a un difficile problema di visione artificiale. Il compito è contare gli stomi (indicati di seguito) nelle immagini al microscopio DIC. Queste immagini sono resistenti alle tecniche di elaborazione delle immagini più superficiali come le operazioni morfologiche e il rilevamento dei bordi. È anche diverso dalle altre attività di conteggio delle cellule.

Sto usando OpenCV. Il mio piano è di rivedere le funzionalità potenzialmente utili per la discriminazione degli stomi.

  • Classificatori di texture
    • DCT (trasformazione discreta del coseno / analisi nel dominio della frequenza)
    • LBP (pattern binari locali)
  • HOG (istogramma dei gradienti orientati)
  • Rilevatori di funzionalità robuste (sono scettico)
    • Angoli di Harris
    • SIFT, SURF, STAR, ecc.
  • Classificatore a cascata Haar / caratteristiche Viola-Jones

E possibilmente progettare un nuovo descrittore di funzionalità. Per il momento sto tralasciando la selezione di un classificatore.

Cosa mi sono perso? Come lo risolveresti? Le soluzioni per problemi simili di rilevamento degli oggetti sarebbero molto utili.

Immagini di esempio qui .

stomi

Dopo il filtro passa-banda: passa-banda filtrato

Il rilevamento dei bordi del canny non è promettente. Alcune aree dell'immagine sono sfocate: rilevamento intelligente del bordo


1
Forse invece di cercare di trovare gli stomi, potresti provare a rimuovere le linee mazy?
endolito il

1
Quante immagini devi elaborare? Quanto deve essere veloce? Quanto deve essere automatizzato?
endolito il

1
Non deve essere molto veloce. Stiamo elaborando nell'ordine di 1000 immagini. Dovrebbe essere automatico: scarica le immagini in una directory e vai.
Matt M.

Risposte:


15

Spiacente, non conosco OpenCV, e questa è più una fase di pre-elaborazione che una risposta completa:

Innanzitutto, non vuoi un rilevatore di bordi. Un rilevatore di bordi converte le transizioni (come questo da scuro a chiaro):

    _____ / ~~~~~

in creste (linee luminose sul buio) in questo modo:

    ____ / _____

Esegue una differenziazione, in altre parole.

Ma nelle tue immagini, c'è una luce che brilla da una direzione, che ci mostra il rilievo della superficie 3D. Lo percepiamo come linee e spigoli, perché siamo abituati a vedere le cose in 3D, ma non lo sono davvero, motivo per cui i rilevatori di spigoli non funzionano e la corrispondenza dei modelli non funzionerà facilmente con le immagini ruotate (un perfetto la corrispondenza con una rotazione di 0 gradi si annullerebbe completamente a 180 gradi, poiché la luce e il buio si allineavano tra loro).

Se l'altezza di una di queste linee mazy si presenta così dal lato:

    ____ / _____

quindi la funzione di luminosità quando illuminata da un lato sarà simile a questa:

    ____ ____ ∧v

Questo è ciò che vedi nelle tue immagini. La superficie frontale diventa più luminosa e la superficie finale diventa più scura. Quindi non vuoi differenziarti. Devi integrare l'immagine lungo la direzione dell'illuminazione e ti darà la mappa dell'altezza originale della superficie (approssimativamente). Quindi sarà più facile abbinare le cose, attraverso la trasformazione di Hough o la corrispondenza dei modelli o altro.

Non sono sicuro di come automatizzare la ricerca della direzione dell'illuminazione. Se è lo stesso per tutte le tue immagini, fantastico. Altrimenti dovresti trovare la più grande linea di contrasto e supporre che la luce sia perpendicolare ad essa o qualcosa del genere. Per il mio esempio, ho ruotato l'immagine manualmente in quella che pensavo fosse la giusta direzione, con la luce proveniente da sinistra:

originale, ruotato

Tuttavia, devi anche rimuovere tutte le modifiche a bassa frequenza nell'immagine per evidenziare solo le caratteristiche lineari che cambiano rapidamente. Per evitare artefatti da squillo, ho usato la sfocatura gaussiana 2D e poi l'ho sottratta dall'originale:

passa alto filtrato

L'integrazione (somma cumulativa) può fuggire facilmente, producendo strisce orizzontali. Ho rimosso questi con un altro passaggio alto gaussiano, ma questa volta solo in direzione orizzontale:

produzione

Ora gli stomi sono ellissi bianche tutt'intorno, anziché bianche in alcuni punti e nere in altri.

Originale:

inserisci qui la descrizione dell'immagine

integrato:

inserisci qui la descrizione dell'immagine

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

La trasformazione di Hough può essere utilizzata per rilevare ellissi di cresta come questa, fatte di "pixel di bordo", sebbene sia molto costosa in termini di calcolo e memoria, e non sono ellissi perfette, quindi dovrebbe essere un po 'un rivelatore "sciatto". Non l'ho mai fatto, ma ci sono molti risultati di Google per il " rilevamento dell'ellisse ". Direi che se rilevi un'ellisse all'interno dell'altra, all'interno di uno spazio di ricerca di una certa dimensione, dovrebbe essere conteggiata come una stomia.

Vedi anche:


PS Quello che ho fatto qui ha un nome? È un tipo di filtro comune?
endolith

1
+1 - Ottima risposta! Informazioni sull'automazione dell'angolo della sorgente luminosa: è possibile utilizzare il rilevatore di bordi che calcola sia l'intensità che il gradiente e quindi calcola la media ponderata (in base alla media) del gradiente. Le risposte più forti dovrebbero essere nella direzione dell'illuminazione.
Andrey Rubshtein,

11

La prima cosa che vorrei provare è la corrispondenza dei modelli, con i modelli ruotati per tutti gli angoli con qualche passo. Modello rotante essenziale qui. Anche la scelta del modello potrebbe essere non banale: potrebbero essere diversi con illuminazione diversa e potrebbe essere sfocato per consentire la differenza di forme.

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

Avanti - HOG sembra promettente qui. Un'altra soluzione potrebbe essere quella di utilizzare un potente rilevatore di angoli come Moravec o Shi-Tomasi (con soppressione non massima) e cercare gruppi di 2 angoli o 3-4 angoli sulla stessa linea dei candidati. Dopo aver trovato i candidati, puoi applicare il profilo attivo per la verifica (non sono sicuro che possa davvero aiutare, ma questa è la possibilità)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

Un'altra possibilità è usare la trasformazione di Hough per le ellissi, possibilmente con non 2 ma 3-4 parametri liberi.


7

Risposta parziale. Trovare candidati con Mathematica:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

inserisci qui la descrizione dell'immagine


Risultato interessante ... forse combinalo con qualche altro schema ...
Matt M.

@MAtt Sì, penso che abbia scartato almeno l'80% della superficie non mirata. Dopo aver dilatato un po 'la maschera, dovresti cercare le ellissi. Indipendentemente dal metodo che usi (sto ancora pensando a cosa potrei fare) è molto più facile ora sai che le bestie sono circondate.
Dr. belisarius,

1

Vorrei iniziare utilizzando un rilevatore di bordi sensibili (ad es. Magnitudine del gradiente con una soglia bassa), quindi utilizzare la trasformazione di Hough per cercare di trovare le ellissi. Anche Canny potrebbe funzionare ancora. Sono sicuro che ci sono parametri che puoi modificare per renderlo più sensibile e raccogliere i bordi sfocati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.