Spiegazione della segmentazione dell'immagine utilizzando Mean Shift


107

Qualcuno potrebbe aiutarmi a capire come funziona effettivamente la segmentazione Mean Shift?

Ecco una matrice 8x8 che ho appena creato

  103  103  103  103  103  103  106  104   
  103  147  147  153  147  156  153  104   
  107  153  153  153  153  153  153  107   
  103  153  147  96   98   153  153  104   
  107  156  153  97   96   147  153  107   
  103  153  153  147  156  153  153  101   
  103  156  153  147  147  153  153  104   
  103  103  107  104  103  106  103  107

Utilizzando la matrice sopra è possibile spiegare in che modo la segmentazione dello spostamento medio separerebbe i 3 diversi livelli di numeri?


Tre livelli? Vedo numeri intorno a 100 e circa 150.
John

2
Bene, poiché è una segmenazione, ho pensato che i numeri nel mezzo sarebbero stati troppo lontani dai numeri del bordo per essere inclusi in quella sezione del confine. Questo è il motivo per cui ho detto 3. Potrei sbagliarmi perché non capisco veramente come funziona questo tipo di segmenazione.
Sharpie

Oh ... forse stiamo assumendo livelli per significare cose diverse. Tutto bene. :)
John

1
Mi piace la risposta accettata, ma non credo che abbia mostrato l'intero quadro. IMO questo pdf spiega meglio la segmentazione dello spostamento medio (l'uso di uno spazio di dimensione superiore come esempio è migliore di 2d penso). eecs.umich.edu/vision/teaching/EECS442_2012/lectures/…
Helin Wang

Risposte:


204

Prima le basi:

La segmentazione Mean Shift è una tecnica di omogeneizzazione locale che è molto utile per smorzare ombreggiature o differenze di tonalità negli oggetti localizzati. Un esempio è meglio di tante parole:

inserisci qui la descrizione dell'immagine

Azione: sostituisce ogni pixel con la media dei pixel in un quartiere range-r e il cui valore è entro una distanza d.

Il Mean Shift richiede solitamente 3 input:

  1. Una funzione di distanza per misurare le distanze tra i pixel. Di solito la distanza euclidea, ma può essere utilizzata qualsiasi altra funzione di distanza ben definita. La distanza di Manhattan a volte è un'altra scelta utile.
  2. Un raggio. Tutti i pixel all'interno di questo raggio (misurati in base alla distanza di cui sopra) verranno presi in considerazione per il calcolo.
  3. Una differenza di valore. Da tutti i pixel all'interno del raggio r, prenderemo solo quelli i cui valori rientrano in questa differenza per calcolare la media

Tieni presente che l'algoritmo non è ben definito ai bordi, quindi implementazioni diverse ti daranno risultati diversi lì.

NON discuterò qui i dettagli matematici cruenti, poiché sono impossibili da mostrare senza un'adeguata notazione matematica, non disponibile in StackOverflow, e anche perché possono essere trovati da buone fonti altrove .

Diamo un'occhiata al centro della tua matrice:

153  153  153  153 
147  96   98   153 
153  97   96   147   
153  153  147  156  

Con scelte ragionevoli per raggio e distanza, i quattro pixel centrali avranno il valore di 97 (la loro media) e saranno diversi dai pixel adiacenti.

Calcoliamolo in Mathematica . Invece di mostrare i numeri effettivi, visualizzeremo una codifica a colori, quindi è più facile capire cosa sta succedendo:

Il codice colore per la tua matrice è:

inserisci qui la descrizione dell'immagine

Quindi prendiamo un ragionevole spostamento medio:

MeanShiftFilter[a, 3, 3]

E otteniamo:

inserisci qui la descrizione dell'immagine

Dove tutti gli elementi centrali sono uguali (a 97, BTW).

Puoi iterare più volte con Mean Shift, cercando di ottenere una colorazione più omogenea. Dopo alcune iterazioni, si arriva a una configurazione stabile non isotropa:

inserisci qui la descrizione dell'immagine

A questo punto, dovrebbe essere chiaro che non è possibile selezionare quanti "colori" si ottengono dopo aver applicato Mean Shift. Quindi, mostriamo come farlo, perché questa è la seconda parte della tua domanda.

Ciò di cui hai bisogno per essere in grado di impostare in anticipo il numero di cluster di output è qualcosa come il clustering di Kmeans .

Funziona in questo modo per la tua matrice:

b = ClusteringComponents[a, 3]

{{1, 1, 1, 1, 1, 1, 1, 1}, 
 {1, 2, 2, 3, 2, 3, 3, 1}, 
 {1, 3, 3, 3, 3, 3, 3, 1}, 
 {1, 3, 2, 1, 1, 3, 3, 1}, 
 {1, 3, 3, 1, 1, 2, 3, 1}, 
 {1, 3, 3, 2, 3, 3, 3, 1}, 
 {1, 3, 3, 2, 2, 3, 3, 1}, 
 {1, 1, 1, 1, 1, 1, 1, 1}}  

O:

inserisci qui la descrizione dell'immagine

Il che è molto simile al nostro risultato precedente, ma come puoi vedere, ora abbiamo solo tre livelli di output.

HTH!


Esiste un'implementazione Matlab dello spostamento medio per l'immagine?
Kaushik Acharya


164

Una segmentazione Mean-Shift funziona in questo modo:

I dati dell'immagine vengono convertiti nello spazio delle funzioni spazio delle caratteristiche

Nel tuo caso, tutto ciò che hai sono valori di intensità, quindi lo spazio delle caratteristiche sarà solo unidimensionale. (Potresti calcolare alcune caratteristiche della trama, ad esempio, e quindi il tuo spazio delle caratteristiche sarebbe bidimensionale e dovresti segmentare in base all'intensità e alla trama)

Le finestre di ricerca sono distribuite nello spazio delle funzioni inserisci qui la descrizione dell'immagine

Il numero di finestre, la dimensione della finestra e le posizioni iniziali sono arbitrarie per questo esempio, qualcosa che può essere regolato in base alle applicazioni specifiche

Iterazioni Mean-Shift:

1.) Vengono calcolate le MEDIE dei campioni di dati all'interno di ciascuna finestra inserisci qui la descrizione dell'immagine

2.) Le finestre vengono spostate nelle posizioni uguali alle medie calcolate in precedenza inserisci qui la descrizione dell'immagine

I passaggi 1.) e 2.) vengono ripetuti fino alla convergenza, ovvero tutte le finestre si sono stabilite sulle posizioni finali inserisci qui la descrizione dell'immagine

Le finestre che finiscono nelle stesse posizioni vengono unite inserisci qui la descrizione dell'immagine

I dati vengono raggruppati in base alle attraversamenti della finestra inserisci qui la descrizione dell'immagine

... ad esempio, tutti i dati che sono stati attraversati da finestre che sono finite, ad esempio, nella posizione "2", formeranno un cluster associato a quella posizione.

Quindi, questa segmentazione produrrà (casualmente) tre gruppi. La visualizzazione di quei gruppi nel formato immagine originale potrebbe assomigliare all'ultima immagine nella risposta di belisario . La scelta di diverse dimensioni della finestra e posizioni iniziali potrebbe produrre risultati diversi.


lo spazio delle caratteristiche non può essere tridimensionale, tenendo conto della posizione di ogni pixel?
Helin Wang

@HelinWang Sì, potrebbe.
mlai

Capisco come la finestra sia posizionata in uno spazio di elementi 1D, ma non vedo come la tua spiegazione possa essere applicata agli algoritmi di spostamento della media che includono una distanza di ricerca spaziale (ad esempio in pixel) e una distanza spettrale (differenza di valore), per esempio come nella risposta del dottor Belisarius. Puoi chiarire questo?
Lennert

@Lennert Se capisco correttamente la tua domanda, essenzialmente quello che faresti è aggiungere le posizioni dei pixel (x, y) come funzionalità, o aggiungere altre funzionalità basate sulla posizione, allo spazio di clustering. Sembra che la risposta di Belisarius faccia riferimento a un'implementazione specifica in Mathematica che potrebbe fare qualcosa di un po 'più sofisticato. Questo aiuta?
mlai

1
@ Lennert Sì, penso che tu abbia capito. Posso capire perché hai trovato la mia risposta confusa. Ho disegnato le mie "finestre" come bidimensionali, ma in realtà stavo cercando di rappresentare il raggruppamento solo sui valori spettrali unidimensionali. Sarebbe piuttosto interessante visualizzare il cluster di spostamento medio nello spazio delle caratteristiche tridimensionali con un disegno o un'animazione (forse uno di questi giorni se avrò il tempo)
mlai
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.