¿Cómo puedo rotar una matriz 3D?

Actualmente, si quiero comparar la presión debajo de cada una de las patas de un perro, solo comparo la presión debajo de cada uno de los dedos. Pero quiero probar y comparar las presiones debajo de toda la pata.

Pero para hacerlo tengo que rotarlos, así los dedos de los pies se superponen (mejor). Debido a que la mayoría de las veces, las patas izquierda y derecha se giran ligeramente hacia afuera, así que si no puedes simplemente proyectar una encima de la otra. Por lo tanto, quiero rotar las patas, para que todas estén alineadas de la misma manera.

texto alternativo

Actualmente, calculo el ángulo de rotación, mirando hacia arriba los dos dedos del medio y el trasero con la detección del dedo del pie, luego calculo el ángulo entre la línea amarilla (eje entre el dedo del pie verde y rojo) y la línea verde (eje neutral) .

Ahora quiero rotar la matriz giraría alrededor de la punta posterior, de manera que las líneas amarilla y verde estén alineadas. Pero, ¿cómo hago esto?

Tenga en cuenta que si bien esta imagen es solo 2D (solo los valores máximos de cada sensor), quiero calcular esto en una matriz 3D (10x10x50 en promedio). También una desventaja de mi cálculo de ángulo es que es muy sensible a la detección de dedos, por lo que si alguien tiene una propuesta matemática más correcta para calcular esto, soy todo oídos.

He visto un estudio con mediciones de presión en humanos , en el que utilizaron el método del eje inercial geométrico local, que al menos era muy confiable. ¡Pero eso todavía no me ayuda a explicar cómo rotar la matriz!

texto alternativo

Si alguien siente la necesidad de experimentar, aquí hay un archivo con todas las matrices cortadas que contienen los datos de presión de cada pata . Para aclarar: walk_sliced_data es un diccionario que contiene [‘ser_3’, ‘ser_2’, ‘sel_1’, ‘sel_2’, ‘ser_1’, ‘sel_3’], que son los nombres de las medidas. Cada medida contiene otro diccionario, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (ejemplo de ‘sel_1’) que representa los impactos que se extrajeron.

Usando la biblioteca de imágenes de Python , puede rotar una matriz por ejemplo:

array(Image.fromarray().rotate(, resample=Image.BICUBIC)) 

A partir de ahí, puede crear un bucle for sobre las diferentes capas de su matriz 3D.

Si tiene su primera dimensión como las capas, la array[] devolverá una capa 2D, por lo tanto:

 for x in range(): layer = [i] [i] = (Image.fromarray(layer).rotate(, resample=Image.BICUBIC)) 

Resultados de @IvoFlipse, con una conversación que sugiere:

  • Poner la matriz en una matriz más grande para remediar el fondo más oscuro.
  • Mira en el remuestreo, tal vez la escala de la matriz primero.
  • Mover la punta trasera hacia el medio te permite girar alrededor de eso.
  • Se puede determinar una imagen más pequeña encontrando los bordes y posicionándolos nuevamente en un 15×15.

texto alternativo

texto alternativo

¿Por qué lo harías de esa manera? ¿Por qué no simplemente integrar toda la región y comparar? En este caso, obtendrás una magnitud de la fuerza y ​​puedes simplemente comparar los escalares, lo que sería mucho más fácil.

Si necesita comparar de alguna manera las regiones (y, por lo tanto, es por eso que necesita alinearlas), tal vez intente una extracción y alineación de características. Pero esto parece fallar si los mapas de presión no son similares (digamos que alguien no está esperando mucho con un pie).

Supongo que puede ser realmente complejo, pero parece que simplemente calcular la fuerza es lo que quiere.

Por cierto, puede utilizar una prueba de correlación simple para encontrar el ángulo óptimo y la traducción si las imágenes son similares.

Para hacer esto, simplemente calcula la correlación entre las dos imágenes diferentes para varias traducciones y rotaciones.