Piekdetectie in een 2D-array

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

Ik help een dierenkliniek met het meten van de druk onder een hondenpoot. Ik gebruik Python voor mijn data-analyse en nu zit ik vast met het proberen om de poten in (anatomische) subregio's te verdelen.

Ik heb gemaakt een 2D-array van elke poot, die bestaat uit de maximale waarden voor elke sensor die in de loop van de tijd door de poot is geladen. Hier is een voorbeeld van één poot, waarbij ik Excel heb gebruikt om de gebieden te tekenen die ik wil "detecteren". Dit zijn 2 bij 2 dozen rond de sensor met lokale maxima, die samen de grootste som hebben.

alt text

Dus ik probeerde wat te experimenteren en besloot om gewoon te zoeken naar de maxima van elke kolom en rij (kan niet in één richting kijken vanwege de vorm van de poot). Dit lijkt de locatie van de afzonderlijke tenen redelijk goed te "detecteren", maar het markeert ook naburige sensoren.

alt text

Dus wat is de beste manier om Python te vertellen welke van deze maxima zijn degene die ik wil?

Opmerking: De 2x2 vierkanten mogen elkaar niet overlappen, aangezien het aparte tenen moeten zijn!

Ook nam ik 2x2 voor het gemak is elke meer geavanceerde oplossing welkom, maar ik ben gewoon een bewegingswetenschapper, dus ik ben geen echte programmeur of wiskundige, dus houd het alsjeblieft "simpel".

Hier is een versie die kan worden geladen met np.loadtxt


Resultaten

Dus ik probeerde de oplossing van @jextee (zie de resultaten hieronder). Zoals je kunt zien, werkt het erg op de voorpoten, maar het werkt minder goed voor de achterpoten.

Meer specifiek, het kan de kleine piek die de vierde teen is niet herkennen. Dit is natuurlijk inherent aan het feit dat de lus van boven naar beneden naar de laagste waarde kijkt, zonder rekening te houden met waar deze is.

Zou iemand weten hoe het algoritme van @jextee kan worden aangepast, zodat het ook de 4e teen kan vinden?

alt text

Omdat ik nog geen andere proeven heb verwerkt, kan ik geen andere monsters aanleveren. Maar de gegevens die ik eerder heb gegeven waren de gemiddelden van elke poot. Dit bestand is een array met de maximale gegevens van 9 poten in de volgorde waarin ze contact maakten met de plaat.

Deze afbeelding laat zien hoe ze ruimtelijk over de plaat waren verspreid.

alt text

Update:

Ik heb een blog opgezet voor iedereen die geïnteresseerd is en Ik heb een SkyDrive ingesteld met alle ruwe metingen. Dus voor iedereen meer data opvragen: meer power to you!


Nieuwe update:

Dus na de hulp die ik kreeg met mijn vragen over pootdetectie en pootsortering, ik kon eindelijk de teendetectie voor elke poot controleren! Het blijkt dat het niet zo goed werkt in iets anders dan poten die zo groot zijn als die in mijn eigen voorbeeld. Achteraf gezien is het natuurlijk mijn eigen schuld dat ik de 2x2 zo willekeurig heb gekozen.

Hier" een mooi voorbeeld van waar het mis gaat: een spijker wordt herkend als een teen en de "hiel" is zo breed dat hij twee keer wordt herkend!

alt text

De poot is te groot, dus als je een maat van 2x2 neemt zonder overlap, worden sommige tenen twee keer gedetecteerd. Andersom , bij kleine honden lukt het vaak niet om een 5e teen te vinden, waarvan ik vermoed dat dit wordt veroorzaakt doordat het gebied van 2x2 te groot is.

Na de huidige oplossing proberend op al mijn metingen Ik kwam tot de verbluffende conclusie dat het voor bijna al mijn kleine honden geen 5e teen en dat in meer dan 50% van de effecten voor de grote honden het meer zou vinden!

Dus het is duidelijk dat ik het moet veranderen. Mijn eigen gok was om de grootte van de buurt te veranderen in iets kleiners voor kleine honden en groter voor grote honden. Maar generate_binary_structure laat me de grootte van de array niet veranderen.

Daarom hoop ik dat iemand anders een betere suggestie heeft voor het lokaliseren van de tenen, misschien met de teen oppervlakteschaal met de pootgrootte?