wake-up-neo.com

Bildsegmentierung mit Mean Shift erklärt

Kann mir bitte jemand helfen, zu verstehen, wie die Mean-Shift-Segmentierung tatsächlich funktioniert?

Hier ist eine 8x8-Matrix, die ich gerade erstellt habe

  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

Kann anhand der obigen Matrix erklärt werden, wie die Segmentierung der mittleren Verschiebung die drei verschiedenen Zahlenebenen trennen würde?

100
Sharpie

Die Grundlagen zuerst:

Die Mean-Shift-Segmentierung ist eine lokale Homogenisierungstechnik, die sehr nützlich ist, um Schattierungs- oder Tonwertunterschiede in lokalisierten Objekten zu dämpfen. Ein Beispiel ist besser als viele Wörter:

enter image description here

Aktion: Ersetzt jedes Pixel durch den Mittelwert der Pixel in einer Entfernung -r-Nachbarschaft, deren Wert innerhalb eines Abstands d liegt.

Die mittlere Verschiebung nimmt normalerweise 3 Eingaben an:

  1. Eine Abstandsfunktion zum Messen von Abständen zwischen Pixeln. Normalerweise kann der euklidische Abstand verwendet werden, es kann jedoch auch jede andere gut definierte Abstandsfunktion verwendet werden. Die Manhattan Distance ist manchmal eine andere nützliche Wahl.
  2. Ein Radius. Alle Pixel innerhalb dieses Radius (gemessen gemäß der obigen Entfernung) werden für die Berechnung berücksichtigt.
  3. Ein Wertunterschied. Von allen Pixeln innerhalb des Radius r werden nur diejenigen zur Berechnung des Mittelwerts herangezogen, deren Werte innerhalb dieser Differenz liegen

Bitte beachten Sie, dass der Algorithmus an den Rändern nicht gut definiert ist, sodass verschiedene Implementierungen dort unterschiedliche Ergebnisse liefern.

Ich werde hier NICHT auf die wichtigsten mathematischen Details eingehen, da sie ohne die richtige mathematische Notation, die in StackOverflow nicht verfügbar ist, nicht dargestellt werden können und auch, weil sie aus guten Quellen anderswo zu finden sind .

Schauen wir uns die Mitte Ihrer Matrix an:

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

Bei angemessenen Auswahlmöglichkeiten für Radius und Abstand erhalten die vier mittleren Pixel den Wert 97 (ihren Mittelwert) und unterscheiden sich von den benachbarten Pixeln.

Berechnen wir es in Mathematica . Anstatt die tatsächlichen Zahlen anzuzeigen, wird eine Farbcodierung angezeigt, damit Sie besser verstehen, was passiert:

Die Farbcodierung für Ihre Matrix lautet:

enter image description here

Dann nehmen wir eine vernünftige mittlere Verschiebung:

MeanShiftFilter[a, 3, 3]

Und wir bekommen:

enter image description here

Wobei alle Mittelelemente gleich sind (bis 97, Übrigens).

Sie können mit Mean Shift mehrmals iterieren, um eine homogenere Färbung zu erzielen. Nach einigen Iterationen gelangen Sie zu einer stabilen nicht-isotropen Konfiguration:

enter image description here

Zu diesem Zeitpunkt sollte klar sein, dass Sie nicht auswählen können, wie viele "Farben" Sie nach der Anwendung von Mean Shift erhalten. Lassen Sie uns also zeigen, wie es geht, denn das ist der zweite Teil Ihrer Frage.

Um die Anzahl der Ausgangscluster im Voraus festlegen zu können, müssen Sie etwa Kmeans clustering eingeben.

Es läuft für Ihre Matrix folgendermaßen ab:

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}}  

Oder:

enter image description here

Das ist unserem vorherigen Ergebnis sehr ähnlich, aber wie Sie sehen können, haben wir jetzt nur drei Ausgangspegel.

HTH!

195
Dr. belisarius

Eine Mean-Shift-Segmentierung funktioniert ungefähr so:

Die Bilddaten werden in den Objektbereich konvertiert  feature space

In Ihrem Fall haben Sie lediglich Intensitätswerte, sodass der Merkmalsraum nur eindimensional ist. (Sie könnten zum Beispiel einige Texturmerkmale berechnen und dann wäre Ihr Merkmalsraum zweidimensional - und Sie würden anhand der Intensität segmentieren und Textur)

Suchfenster sind über den Funktionsbereich verteilt  enter image description here

Die Anzahl der Fenster, die Fenstergröße und die Anfangspositionen sind in diesem Beispiel beliebig. Diese Einstellung kann in Abhängigkeit von bestimmten Anwendungen optimiert werden

Mean-Shift-Iterationen:

1.) Die MEANs der Datenproben in jedem Fenster werden berechnet  enter image description here

2.) Die Fenster werden an die Positionen verschoben, die ihren zuvor berechneten Mittelwerten entsprechen.  enter image description here

Die Schritte 1.) und 2.) werden bis zur Konvergenz wiederholt, d. H. Alle Fenster haben sich an den endgültigen Positionen niedergelassen  enter image description here

Die Fenster, die sich am selben Ort befinden, werden zusammengeführt  enter image description here

Die Daten werden nach Fensterdurchläufen gruppiert  enter image description here

... z.B. Alle Daten, die von Fenstern durchlaufen wurden, die beispielsweise an Position "2" endeten, bilden einen mit dieser Position verknüpften Cluster.

Diese Segmentierung erzeugt also (zufällig) drei Gruppen. Das Betrachten dieser Gruppen im Originalbildformat könnte ungefähr so ​​aussehen wie das letzte Bild in der Antwort von belisarius . Die Auswahl unterschiedlicher Fenstergrößen und Anfangsorte kann zu unterschiedlichen Ergebnissen führen.

156
mlai