Czy ktoś mógłby mi pomóc zrozumieć, jak właściwie działa segmentacja zmiany średniej?
Oto macierz 8x8, którą właśnie stworzyłem
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
Czy korzystając z powyższej macierzy można wyjaśnić, w jaki sposób segmentacja przesunięcia średniego rozdzieliłaby 3 różne poziomy liczb?
Odpowiedzi:
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:
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:
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:
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:
Lub:
Co jest bardzo podobne do naszego poprzedniego wyniku, ale jak widać, teraz mamy tylko trzy poziomy wyjściowe.
HTH!
źródło
Segmentacja z przesunięciem średniej działa mniej więcej tak:
Dane obrazu są konwertowane na przestrzeń funkcji
W twoim przypadku wszystko, co masz, to wartości intensywności, więc przestrzeń cech będzie tylko jednowymiarowa. (Możesz na przykład obliczyć niektóre cechy tekstury, a wtedy twoja przestrzeń funkcji byłaby dwuwymiarowa - i segmentowałbyś na podstawie intensywności i tekstury)
Okna wyszukiwania są rozmieszczone w przestrzeni funkcji
Liczba okien, rozmiar okna i początkowe lokalizacje są w tym przykładzie dowolne - coś, co można dostosować w zależności od konkretnych aplikacji
Iteracje zmiany średniej:
1.) Obliczane są średnie próbek danych w każdym oknie
2.) Okna są PRZESUNIĘTE do lokalizacji równych ich poprzednio obliczonym średnim
Kroki 1.) i 2.) są powtarzane aż do osiągnięcia konwergencji, tj. Wszystkich okien ustalonych na ostatecznych lokalizacjach
Okna, które znajdą się w tych samych lokalizacjach, zostaną scalone
Dane są grupowane zgodnie z przemierzaniem okien
... np. wszystkie dane, które przeszły przez okna, które znalazły się w, powiedzmy, lokalizacji „2”, utworzą klaster powiązany z tą lokalizacją.
Tak więc ta segmentacja (przypadkowo) da trzy grupy. Oglądanie tych grup w oryginalnym formacie obrazu może wyglądać jak ostatnie zdjęcie w odpowiedzi Belizariusza . Wybór różnych rozmiarów okien i początkowych lokalizacji może dać różne wyniki.
źródło