Najpierw podstawy:
Segmentacja z przesunięciem średnim jest techniką lokalnej homogenizacji, która jest bardzo przydatna do tłumienia cieniowania lub różnic tonalnych w zlokalizowanych obiektach. Przykład jest lepszy niż wiele słów:
Akcja: zastępuje każdy piksel średnią z pikseli w sąsiedztwie range-r, których wartość mieści się w odległości d.
Przesunięcie średnie zajmuje zwykle 3 wejścia:
- Funkcja odległości do pomiaru odległości między pikselami. Zwykle odległość euklidesowa, ale można zastosować każdą inną dobrze zdefiniowaną funkcję odległości. Manhattan Odległość to kolejny użyteczny wybór czasami.
- Promień. Wszystkie piksele w tym promieniu (mierzone zgodnie z powyższą odległością) zostaną uwzględnione w obliczeniach.
- Różnica wartości. Ze wszystkich pikseli w promieniu r weźmiemy tylko te, których wartości mieszczą się w tej różnicy do obliczenia średniej
Należy pamiętać, że algorytm nie jest dobrze zdefiniowany na granicach, więc różne implementacje dadzą tam różne wyniki.
NIE będę omawiać tutaj krwawych szczegółów matematycznych, ponieważ nie da się ich pokazać bez odpowiedniej notacji matematycznej, niedostępnej w StackOverflow, a także dlatego, że można je znaleźć z dobrych źródeł gdzie indziej .
Spójrzmy na środek twojej macierzy:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
Przy rozsądnym wyborze promienia i odległości cztery środkowe piksele otrzymają wartość 97 (ich średnia) i będą się różnić od sąsiednich pikseli.
Obliczmy to w Mathematica . Zamiast pokazywać rzeczywiste liczby, wyświetlimy kodowanie kolorami, aby łatwiej było zrozumieć, co się dzieje:
Kodowanie kolorami macierzy to:
Następnie przyjmujemy rozsądną zmianę średniej:
MeanShiftFilter[a, 3, 3]
Otrzymujemy:
Gdzie wszystkie elementy środkowe są równe (do 97, BTW).
Możesz powtórzyć kilka razy za pomocą zmiany średniej, próbując uzyskać bardziej jednorodne zabarwienie. Po kilku iteracjach osiągniesz stabilną nieizotropową konfigurację:
W tym momencie powinno być jasne, że nie możesz wybrać, ile „kolorów” uzyskasz po zastosowaniu przesunięcia średniego. Pokażmy więc, jak to zrobić, ponieważ to druga część twojego pytania.
To, czego potrzebujesz, aby móc ustawić liczbę klastrów wyjściowych z wyprzedzeniem, to coś w rodzaju klastrów Kmeans .
Działa to w ten sposób dla twojej macierzy:
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}}
Lub:
Co jest bardzo podobne do naszego poprzedniego wyniku, ale jak widać, teraz mamy tylko trzy poziomy wyjściowe.
HTH!