Die Grundlagen zuerst:
Die Mean Shift-Segmentierung ist eine lokale Homogenisierungstechnik, die sehr nützlich ist, um Schattierungen oder Tonalitätsunterschiede in lokalisierten Objekten zu dämpfen. Ein Beispiel ist besser als viele Wörter:
Aktion: Ersetzt jedes Pixel durch den Mittelwert der Pixel in einer Umgebung mit Bereich r, deren Wert innerhalb eines Abstands d liegt.
Die mittlere Verschiebung benötigt normalerweise 3 Eingaben:
- Eine Abstandsfunktion zum Messen von Abständen zwischen Pixeln. Normalerweise kann der euklidische Abstand, aber jede andere genau definierte Abstandsfunktion verwendet werden. Die Manhattan Entfernung ist manchmal eine andere nützliche Wahl.
- Ein Radius. Alle Pixel innerhalb dieses Radius (gemessen gemäß dem obigen Abstand) werden für die Berechnung berücksichtigt.
- Eine Wertdifferenz. Von allen Pixeln innerhalb des Radius r nehmen wir nur diejenigen, deren Werte innerhalb dieser Differenz liegen, zur Berechnung des Mittelwerts
Bitte beachten Sie, dass der Algorithmus an den Rändern nicht gut definiert ist, sodass unterschiedliche Implementierungen dort unterschiedliche Ergebnisse liefern.
Ich werde hier NICHT auf die blutigen mathematischen Details eingehen, da sie ohne die richtige mathematische Notation, die in StackOverflow nicht verfügbar ist, nicht angezeigt werden können und auch, weil sie an anderer Stelle aus guten Quellen stammen .
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 vernünftigen 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 leichter verstehen, was passiert:
Die Farbcodierung für Ihre Matrix lautet:
Dann nehmen wir eine vernünftige mittlere Verschiebung:
MeanShiftFilter[a, 3, 3]
Und wir bekommen:
Wobei alle Mittelelemente gleich sind (bis 97, übrigens).
Sie können mit Mean Shift mehrmals iterieren und versuchen, eine homogenere Färbung zu erzielen. Nach einigen Iterationen erhalten Sie eine stabile nicht-isotrope Konfiguration:
Zu diesem Zeitpunkt sollte klar sein, dass Sie nicht auswählen können, wie viele "Farben" Sie nach dem Anwenden von Mean Shift erhalten. Lassen Sie uns also zeigen, wie es geht, denn das ist der zweite Teil Ihrer Frage.
Um die Anzahl der Ausgabecluster im Voraus festlegen zu können, benötigen Sie beispielsweise Kmeans-Clustering .
Für Ihre Matrix läuft es 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:
Das ist unserem vorherigen Ergebnis sehr ähnlich, aber wie Sie sehen können, haben wir jetzt nur drei Ausgangspegel.
HTH!