Wykrywanie pików w macierzy 2D

| | | | | | | | | | | | | | | | | | | | | |

Pomagam klinice weterynaryjnej mierzyć ciśnienie pod łapą psa. Używam Pythona do analizy danych i teraz utknąłem, próbując podzielić łapy na (anatomiczne) podregiony.

Zrobiłem tablica 2D każdej łapy, która składa się z maksymalnych wartości dla każdego czujnika, który był ładowany przez łapę w czasie. Oto przykład jednej łapy, w której użyłem Excela do narysowania obszarów, które chcę „wykryć”. Są to pola 2 na 2 wokół czujnika z lokalnymi maksimami, które razem mają największą sumę.

tekst alt

Więc spróbowałem trochę poeksperymentować i postanowiłem po prostu poszukać maksimum każdej kolumny i rzędu (nie można patrzeć w jednym kierunku ze względu na kształt łapy). Wydaje się, że dość dobrze „wykrywa” położenie poszczególnych palców, ale oznacza również sąsiednie czujniki.

alt text

Więc jaki byłby najlepszy sposób na poinformowanie Pythona, które z tych wartości maksymalne to te, które chcę?

Uwaga: kwadraty 2x2 nie mogą się nakładać, ponieważ muszą być oddzielnymi palcami!

Także wziąłem 2x2 dla wygody każde bardziej zaawansowane rozwiązanie jest mile widziane, ale jestem po prostu naukowcem zajmującym się ruchem człowieka, więc nie jestem ani prawdziwym programistą, ani matematykiem, więc proszę, aby to było „proste”.

Tutaj"sa wersja, którą można załadować za pomocą np.loadtxt


Wyniki

Więc wypróbowałem rozwiązanie @jextee (zobacz wyniki poniżej). Jak widać, działa bardzo na przednich łapach, ale gorzej na tylnych.

Mówiąc dokładniej, nie może rozpoznać małego szczytu, który jest czwartym palcem u nogi. Jest to oczywiście nierozerwalnie związane z faktem, że pętla wygląda z góry na dół w kierunku najniższej wartości, nie biorąc pod uwagę tego, gdzie ona jest.

Czy ktoś wiedziałby, jak ulepszyć algorytm @jextee, aby mógł również znaleźć czwarty palec u nogi?

alt text

Ponieważ nie przeprowadziłem jeszcze żadnych innych prób, nie mogę dostarczyć żadnych innych próbek. Ale dane, które podałem wcześniej były wartościami średnimi każdej łapy. Ten plik jest tablicą z maksymalnymi danymi 9 łap w kolejności, w jakiej stykały się z płytką.

Ten obraz pokazuje, jak były one rozmieszczone przestrzennie na płytce.

tekst alt

Aktualizacja:

Założyłem bloga dla wszystkich zainteresowanych i Ustawiłem SkyDrive ze wszystkimi surowymi pomiarami. Więc dla każdego żądanie większej ilości danych: więcej mocy dla Ciebie!


Nowa aktualizacja:

Więc po otrzymaniu pomocy z moimi pytaniami dotyczącymi wykrywanie łap i sortowanie łap, wreszcie udało mi się sprawdzić wykrywanie palców każdej łapy! Okazuje się, że nie działa tak dobrze w niczym innym, jak tylko w łapach o rozmiarach takich jak ta z mojego własnego przykładu. Oczywiście z perspektywy czasu, to moja wina, że tak arbitralnie wybrałem 2x2.

Tutaj” to dobry przykład tego, co się nie udaje: gwóźdź jest rozpoznawany jako palec u nogi, a „pięta” jest tak szeroka, że rozpoznawana jest dwukrotnie!

alt text

Łapa jest za duża, więc wybranie rozmiaru 2x2 bez nakładania się powoduje, że niektóre palce są wykrywane dwukrotnie. Na odwrót , u małych psów często nie udaje się znaleźć piątego palca, co, jak podejrzewam, jest spowodowane zbyt dużym obszarem 2x2.

Po próbowanie obecnego rozwiązania na wszystkich moich pomiarach doszedłem do oszałamiającego wniosku, że dla prawie wszystkich moich małych psów nie znalazło piątego palec u nogi i że w ponad 50% uderzeń dużych psów znalazłby więcej!

Najwyraźniej muszę to zmienić. Domyślałem się, że zmieniłem rozmiar sąsiedztwa na mniejszy dla małych psów i większy dla dużych psów. Ale generate_binary_structure nie pozwoliłby mi zmienić rozmiaru tablicy.

Dlatego mam nadzieję, że ktoś inny ma lepszą sugestię dotyczącą lokalizacji palców, być może mając skala obszaru z rozmiarem łapy?