Rilevamento del picco in un array 2D

| | | | | | | | | |

Sto aiutando una clinica veterinaria a misurare la pressione sotto la zampa di un cane. Uso Python per l'analisi dei dati e ora sono bloccato a provare a dividere le zampe in sottoregioni (anatomiche).

Ho creato un array 2D di ciascuna zampa, che consiste nei valori massimi per ciascun sensore che è stato caricato dalla zampa nel tempo. Ecco un esempio di una zampa, in cui ho usato Excel per disegnare le aree che voglio "rilevare". Si tratta di riquadri 2 per 2 attorno al sensore con massimi locali, che insieme hanno la somma più grande.

alt text

Quindi ho provato un po' di esperimenti e ho deciso di cercare semplicemente il massimi di ogni colonna e riga (non è possibile guardare in una direzione a causa della forma della zampa). Questo sembra "rilevare" abbastanza bene la posizione delle dita separate, ma segna anche i sensori vicini.

alt text

Quindi quale sarebbe il modo migliore per dire a Python quale di questi i massimi sono quelli che voglio?

Nota: i quadrati 2x2 non possono sovrapporsi, poiché devono essere dita separate!

Inoltre ho preso 2x2 per comodità, qualsiasi soluzione più avanzata è benvenuta, ma io sono semplicemente uno scienziato del movimento umano, quindi non sono né un vero programmatore né un matematico, quindi per favore mantienilo "semplice".

Qui"sa versione che può essere caricata con np.loadtxt


Risultati

Così ho provato la soluzione di @jextee (vedi i risultati sotto). Come puoi vedere, funziona molto sulle zampe anteriori, ma funziona meno bene per le zampe posteriori.

Più precisamente, non riesce a riconoscere il piccolo picco che è il quarto dito del piede. Ciò è ovviamente inerente al fatto che il loop guarda dall'alto verso il basso verso il valore più basso, senza tener conto di dove si trova.

Qualcuno sa come modificare l'algoritmo di @jextee, in modo che possa trovare anche il 4° dito del piede?

alt text

Dato che non ho ancora elaborato altre prove, non posso fornire altri campioni. Ma i dati che ho fornito prima erano le medie di ciascuna zampa. Questo file è un array con i dati massimi di 9 zampe nell'ordine in cui sono entrate in contatto con la lastra.

Questa immagine mostra come erano distribuite nello spazio sulla lastra.

alt text

Aggiornamento:

Ho creato un blog per chiunque sia interessato e Ho installato uno SkyDrive con tutte le misure grezze. Quindi per chiunque richiedere più dati: più potenza per te!


Nuovo aggiornamento:

Quindi, dopo l'aiuto che ho ricevuto con le mie domande relative a rilevamento zampa e ordinamento zampa, sono stato finalmente in grado di controllare il rilevamento della punta per ogni zampa! Si scopre che "non funziona così bene con nient'altro che zampe delle dimensioni di quella del mio esempio. Ovviamente con il senno di poi, è colpa mia se ho scelto il 2x2 in modo così arbitrario.

Qui" un bell'esempio di dove va storto: un'unghia viene riconosciuta come punta e il "tacco" è così largo che viene riconosciuto due volte!

alt text

La zampa è troppo grande, quindi prendendo una dimensione 2x2 senza sovrapposizioni, alcune dita dei piedi vengono rilevate due volte. Il contrario , nei cani di piccola taglia spesso non riesce a trovare un quinto dito, che sospetto sia causato dall'eccessiva dimensione dell'area 2x2.

Dopo provando la soluzione attuale su tutte le mie misurazioni sono giunto alla sconcertante conclusione che per quasi tutti i miei cani di piccola taglia non ha trovato un quinto dito del piede e che in oltre il 50% degli impatti per i cani di grossa taglia ne troverebbe di più!

Quindi chiaramente devo cambiarlo. La mia ipotesi era cambiare le dimensioni del quartiere in qualcosa di più piccolo per i cani di piccola taglia e più grande per i cani di grossa taglia. Ma generate_binary_structure non mi permette di cambiare la dimensione dell'array.

Pertanto, spero che qualcun altro abbia un suggerimento migliore per localizzare le dita dei piedi, magari avendo la punta scala dell'area con la dimensione della zampa?