2011-01-22 34 views
8

Actualmente, si quiero comparar la presión debajo de cada pata de un perro, solo comparo la presión debajo de cada uno de los dedos. Pero quiero intentar y comparar las presiones debajo de toda la pata.¿Cómo puedo rotar una matriz 3D?

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

alt text

Actualmente, calcular el ángulo de rotación, por mirando hacia arriba los dos dedos del medio y la parte trasera uno using the toe detection entonces calculo el ángulo entre la línea amarilla (eje entre dedo del pie verde y rojo) y la línea verde (eje neutral).

Ahora quiero rotar la matriz que giraría alrededor de la punta trasera, de modo 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 más matemáticamente correcta para calcular esto, soy todo oídos.

I have seen one study with pressure measurements on humans, donde 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!

alt text

Si alguien se siente la necesidad de experimentar, aquí hay un archivo con all the sliced arrays that contain the pressure data of each paw. Para clarificar: 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 mediciones. Cada medida contiene otro diccionario, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (ejemplo de 'sel_1') que representan los impactos que se extrajeron.

Respuesta

2

Utilizando el Python Imaging Library, puede girar una matriz con por ejemplo:

array(Image.fromarray(<data>).rotate(<angle>, resample=Image.BICUBIC)) 

A partir de ahí, sólo puede crear un bucle a través de las diferentes capas de la matriz 3D.

Si usted tiene su primera dimensión que las capas, entonces array[<layer>] volvería una capa 2D, por lo tanto:

for x in range(<amount of layers>): 
    layer = <array>[i] 
    <array>[i] = (Image.fromarray(layer).rotate(<angle>, resample=Image.BICUBIC)) 

Resultados por @IvoFlipse, con lo que sugiere a conversation:

  • Poner en la matriz una matriz más grande para remediar el fondo más oscuro.
  • Mire en el remuestreo, quizás escale primero la matriz.
  • Mover la punta trasera hacia el centro le permite girar alrededor de eso.
  • Se puede determinar una imagen más pequeña encontrando los bordes y colocándolos nuevamente en un 15x15.

alt text

alt text

+2

Creo que su solución es casi correcta. Todo lo que necesita además de mover la punta trasera hacia el centro, es hacer que la línea amarilla (el ángulo) también se base en la punta trasera. Por lo tanto, en el ejemplo dado, la imagen debe girarse hacia la izquierda (en sentido contrario a las agujas del reloj). Hacer que el espacio de trabajo sea más grande y más profundo produciría lo que Ivo quiere, que, según tengo entendido, es un acercamiento a las características de la pata con la punta trasera apuntando hacia el sur. – Apalala

3

¿Por qué lo haría 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 escalares que serían mucho más fáciles.

Si necesita comparar regiones de alguna manera (y por eso es por eso que necesita alinearlas), entonces quizás intente extraer y alinear una característica. Pero esto parecería fallar si los mapas de presión no son similares (digamos que alguien no está poniendo demasiada atención en un pie).

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

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

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

+0

me gusta su sugerencia acerca de tratar de correlacionar las imágenes, para llegar a todos ellos alineados, pero eso no me explican cómo puedo girar las imágenes. Además, si echas un vistazo [a mi pregunta sobre la clasificación de las patas] (http://stackoverflow.com/q/4502656/77595), verás que necesito rotar las patas para que estén correctamente estandarizadas. Debido a que actualmente la gran variación dentro de la población hace que sea difícil ordenar una pata que rota de forma diferente a la del conjunto de entrenamiento –

+0

Sus patas son "imágenes". Usted los rota como cualquier otra imagen. si su imagen está dada por f (x, y), entonces su imagen girada es f (x * cos (t) - y * sin (t), y * cos (t) + x * sin (t)). El único problema con este método es que no funciona bien en funciones discretas debido a aliasing. Estoy seguro de que puedes encontrar algún código o una biblioteca para rotar la imagen (matriz 2D). Es algo bastante común. Si desea rotar alrededor de un punto, primero debe traducir la imagen, rotar y luego traducir de nuevo. – AbstractDissonance

+0

Realmente no estoy seguro de que estés recibiendo una matriz 3D. Todo lo que he visto son gráficos de densidad que se supone corresponden a mapas de presión. Matemáticamente una función P (x, y) que es una función 2D. Si realmente necesita girar una matriz 3D, tendrá 3 ángulos para rotar. Esencialmente la función P (x, y, z). Puede encontrar una transformación de matriz desde cualquier sitio de programación de juegos. En este caso, deberá traducir cada punto. Esencialmente, el punto (x, y, z) en su matriz se convierte en (x ', y', z ') y (x', y ', z') provienen de la rotación de matriz – AbstractDissonance

Cuestiones relacionadas