Wyjaśnienie segmentacji obrazu przy użyciu przesunięcia średniego

107

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?

Sharpie
źródło
Trzy poziomy? Widzę numery około 100 i około 150.
John
2
Pomyślałem, że to rozdzielenie, ale myślałem, że liczby pośrodku będą zbyt daleko od numerów krawędzi, które zostaną uwzględnione w tej części granicy. Dlatego powiedziałem 3. Mogę się mylić, ponieważ nie bardzo rozumiem, jak działa ten rodzaj segmenacji.
Sharpie
Och ... może bierzemy poziomy, aby oznaczać różne rzeczy. Wszystko dobrze. :)
John
1
Podoba mi się zaakceptowana odpowiedź, ale nie sądzę, aby przedstawiała cały obraz. IMO ten pdf lepiej wyjaśnia segmentację średniej zmiany (przy użyciu większej przestrzeni wymiarowej jako przykładu jest lepsza niż 2d, jak sądzę). eecs.umich.edu/vision/teaching/EECS442_2012/lectures/…
Helin Wang

Odpowiedzi:

204

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:

wprowadź opis obrazu tutaj

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:

  1. 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.
  2. Promień. Wszystkie piksele w tym promieniu (mierzone zgodnie z powyższą odległością) zostaną uwzględnione w obliczeniach.
  3. 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:

wprowadź opis obrazu tutaj

Następnie przyjmujemy rozsądną zmianę średniej:

MeanShiftFilter[a, 3, 3]

Otrzymujemy:

wprowadź opis obrazu tutaj

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ę:

wprowadź opis obrazu tutaj

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:

wprowadź opis obrazu tutaj

Co jest bardzo podobne do naszego poprzedniego wyniku, ale jak widać, teraz mamy tylko trzy poziomy wyjściowe.

HTH!

Dr Belisarius
źródło
Czy istnieje implementacja zmiany średniej dla obrazu w Matlabie?
Kaushik Acharya
2
@KaushikAcharya Zobacz shawnlankton.com/2007/11/mean-shift-segmentation-in-matlab
Dr. belisarius
164

Segmentacja z przesunięciem średniej działa mniej więcej tak:

Dane obrazu są konwertowane na przestrzeń funkcji funkcja przestrzeni

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 wprowadź opis obrazu tutaj

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 wprowadź opis obrazu tutaj

2.) Okna są PRZESUNIĘTE do lokalizacji równych ich poprzednio obliczonym średnim wprowadź opis obrazu tutaj

Kroki 1.) i 2.) są powtarzane aż do osiągnięcia konwergencji, tj. Wszystkich okien ustalonych na ostatecznych lokalizacjach wprowadź opis obrazu tutaj

Okna, które znajdą się w tych samych lokalizacjach, zostaną scalone wprowadź opis obrazu tutaj

Dane są grupowane zgodnie z przemierzaniem okien wprowadź opis obrazu tutaj

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

mlai
źródło
czy przestrzeń nie może być trójwymiarowa, biorąc pod uwagę położenie każdego piksela?
Helin Wang
@HelinWang Tak, może.
mlai
Rozumiem, jak okno jest ustawione w przestrzeni funkcji 1D, ale nie widzę, jak można zastosować twoje wyjaśnienie do średnich algorytmów przesunięcia, które obejmują odległość wyszukiwania przestrzennego (np. W pikselach) i odległość widmową (różnica wartości), na przykład jak w odpowiedzi dr Belizariusa. Czy mógłbyś to wyjaśnić?
Lennert,
@Lennert Jeśli dobrze zrozumiem twoje pytanie, to zasadniczo powinieneś dodać lokalizacje pikseli (x, y) jako funkcje lub dodać inne funkcje oparte na lokalizacji do przestrzeni klastrowej. Wygląda na to, że odpowiedź Belizariusza odnosi się do konkretnej implementacji w Mathematica, która może zrobić coś bardziej wyrafinowanego. To pomaga?
mlai
1
@Lennert Yeah, myślę, że masz to. Rozumiem, dlaczego moja odpowiedź była dla Ciebie myląca. Narysowałem swoje „okna” jako dwuwymiarowe, ale tak naprawdę starałem się przedstawić skupianie się tylko na jednowymiarowych wartościach widmowych. Byłoby to całkiem fajne wizualizację średnią klaster przesunięcia w trójwymiarowej przestrzeni cech z rysunku lub animacji (może jeden z tych dni, jeśli mam czas)
mlai