Spitzendetektion in einem 2D-Array

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

Ich helfe einer Tierklinik dabei, den Druck unter einer Hundepfote zu messen. Ich verwende Python für meine Datenanalyse und jetzt stecke ich bei dem Versuch fest, die Pfoten in (anatomische) Unterregionen zu unterteilen.

I made ein 2D-Array jeder Pfote, das aus den Maximalwerten für jeden Sensor besteht, der von der Pfote im Laufe der Zeit belastet wurde. Hier ist ein Beispiel für eine Pfote, bei der ich Excel verwendet habe, um die Bereiche zu zeichnen, die ich "erkennen" möchte. Dies sind 2 mal 2 Kästchen um den Sensor mit lokalen Maxima, die zusammen die größte Summe haben.

alt text

Also habe ich etwas experimentiert und mich entschieden, einfach nach dem zu suchen Maxima jeder Spalte und Reihe (kann aufgrund der Form der Pfote nicht in eine Richtung schauen). Dies scheint die Position der einzelnen Zehen ziemlich gut zu "erfassen", markiert aber auch benachbarte Sensoren.

alt text

Was wäre also der beste Weg, um Python mitzuteilen, welche davon Maximalwerte sind die, die ich will?

Hinweis: Die 2x2-Quadrate können sich nicht überlappen, da sie separate Zehen sein müssen!

Außerdem habe ich 2x2 genommen Der Einfachheit halber ist jede fortgeschrittenere Lösung willkommen, aber ich bin einfach ein Bewegungswissenschaftler, also weder ein echter Programmierer noch ein Mathematiker, also halten Sie es bitte "einfach".

Hier"eine Version, die mit np.loadtxt


Ergebnisse

Also habe ich die Lösung von @jextee ausprobiert (siehe die Ergebnisse unten). Wie Sie sehen können, funktioniert es sehr gut an den Vorderpfoten, aber weniger gut an den Hinterbeinen.

Genauer gesagt kann es die kleine Spitze, die der vierte Zeh ist, nicht erkennen. Dies hängt offensichtlich damit zusammen, dass die Schleife von oben nach unten zum niedrigsten Wert schaut, ohne zu berücksichtigen, wo sich dieser befindet.

Könnte jemand wissen, wie man den Algorithmus von @jextee so anpassen kann, dass er möglicherweise auch den vierten Zeh findet?

alt text

Da ich noch keine anderen Versuche bearbeitet habe, kann ich keine weiteren Proben liefern. Aber die Daten habe ich vorher gegeben waren die Mittelwerte jeder Pfote. Diese Datei ist ein Array mit den maximalen Daten von 9 Pfoten in der Reihenfolge, in der sie die Platte berührten.

Dieses Bild zeigt, wie sie räumlich über die Platte verteilt waren.

alt text

Aktualisierung:

Ich habe einen Blog für alle Interessierten eingerichtet und Ich habe ein SkyDrive mit allen Rohmessungen eingerichtet. Also an alle mehr daten anfordern: mehr power für sie!


Neues Update:

Also nach der Hilfe, die ich bei meinen Fragen zu bekommen habe Pfotenerkennung und Pfotensortierung konnte ich endlich die Zehenerkennung für jede Pfote überprüfen! Es stellt sich heraus, dass es in nichts so gut funktioniert, außer in Pfoten, die so groß sind wie in meinem eigenen Beispiel. Natürlich bin ich im Nachhinein selbst schuld, dass ich das 2x2 so willkürlich gewählt habe.

Hier" Ein schönes Beispiel dafür, wo es schief geht: Ein Nagel wird als Zeh erkannt und die "Ferse" ist so breit, dass sie zweimal erkannt wird!

alt text

Die Pfote ist zu groß, sodass bei einer Größe von 2x2 ohne Überlappung einige Zehen doppelt erkannt werden. Andersherum , bei kleinen Hunden wird oft kein 5. Zeh gefunden, was meiner Meinung nach dadurch verursacht wird, dass der 2x2-Bereich zu groß ist.

Nach Als ich die aktuelle Lösung bei all meinen Messungen ausprobierte, kam ich zu dem erstaunlichen Schluss, dass sie für fast alle meine kleinen Hunde keinen 5. fand Zehe und das in über 50% der Schläge für die großen Hunde würde es mehr finden!

Also klar muss ich es ändern. Meine eigene Vermutung war, die Größe der Nachbarschaft für kleine Hunde kleiner und für große Hunde größer zu machen. Aber generate_binary_structure ließ mich die Größe des Arrays nicht ändern.

Deshalb hoffe ich, dass jemand anderes einen besseren Vorschlag zum Lokalisieren der Zehen hat, vielleicht mit der Zehe Bereich mit der Pfotengröße skalieren?