Detección de picos en una matriz 2D

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

Ayudo a una clínica veterinaria a medir la presión debajo de la pata de un perro. Uso Python para el análisis de datos y ahora estoy atascado tratando de dividir las patas en subregiones (anatómicas).

Hice una matriz 2D de cada pata, que consta de los valores máximos para cada sensor que ha sido cargado por la pata a lo largo del tiempo. Aquí hay un ejemplo de una pata, donde usé Excel para dibujar las áreas que quiero "detectar". Estas son cajas de 2 por 2 alrededor del sensor con máximos locales, que juntas tienen la suma más grande.

alt text

Así que probé un poco de experimentación y decidí simplemente buscar el máximos de cada columna y fila (no se puede mirar en una dirección debido a la forma de la pata). Esto parece "detectar" bastante bien la ubicación de los dedos separados, pero también marca los sensores vecinos.

alt text

Entonces, ¿cuál sería la mejor manera de decirle a Python cuál de estos máximos son los que quiero?

Nota: ¡Los cuadrados de 2x2 no pueden superponerse, ya que tienen que ser puntas separadas!

También tomé 2x2 para su conveniencia, cualquier solución más avanzada es bienvenida, pero simplemente soy un científico del movimiento humano, por lo que no soy ni un programador real ni un matemático, así que manténgalo "simple".

Aquí"sa versión que se puede cargar con np.loadtxt


Resultados

Así que probé la solución de @jextee (vea los resultados a continuación). Como puede ver, funciona muy bien en las patas delanteras, pero funciona menos bien en las patas traseras.

Más específicamente, no puede reconocer el pequeño pico que es el cuarto dedo del pie. Obviamente, esto es inherente al hecho de que el bucle mira de arriba hacia abajo hacia el valor más bajo, sin tener en cuenta dónde está este.

¿Alguien sabría cómo modificar el algoritmo de @jextee para que también pueda encontrar el cuarto dedo del pie?

alt text

Dado que aún no he procesado ninguna otra prueba, no puedo proporcionar ninguna otra muestra. Pero los datos que di antes fueron los promedios de cada pata. Este archivo es una matriz con los datos máximos de 9 patas en el orden en que hicieron contacto con la placa.

Esta imagen muestra cómo se distribuyeron espacialmente sobre la placa.

texto alternativo

Actualización:

He creado un blog para los interesados y Configuré un SkyDrive con todas las medidas sin procesar. Así que para cualquiera solicitando más datos: ¡más poder para ti!


Nueva actualización:

Entonces, después de la ayuda que recibí con mis preguntas sobre detección de patas y clasificación de patas, ¡finalmente pude comprobar la detección de dedos de cada pata! Resulta que no funciona tan bien en nada que no sean patas del tamaño de mi propio ejemplo. Por supuesto, en retrospectiva, es mi culpa por elegir el 2x2 tan arbitrariamente.

Aquí" Un buen ejemplo de dónde sale mal: una uña se reconoce como un dedo del pie y el "talón" es tan ancho que se reconoce dos veces.

alt text

La pata es demasiado grande, por lo que tomar un tamaño de 2x2 sin superposición hace que algunos dedos se detecten dos veces. Al revés , en perros pequeños a menudo no encuentra el quinto dedo, lo que sospecho que se debe a que el área de 2x2 es demasiado grande.

Después de probando la solución actual en todas mis medidas llegué a la asombrosa conclusión de que para casi todos mis perros pequeños no encontró un quinto dedo del pie y que en más del 50% de los impactos para los perros grandes encontraría más!

Así que claramente necesito cambiarlo. Mi propia suposición fue cambiar el tamaño del vecindario a algo más pequeño para perros pequeños y más grande para perros grandes. Pero generate_binary_structure no me permitió cambiar el tamaño de la matriz.

Por lo tanto, espero que alguien más tenga una mejor sugerencia para ubicar los dedos de los pies, tal vez teniendo el dedo del pie escala de área con el tamaño de la pata?