2011-11-10 25 views
9

Tengo un conjunto de imágenes en escala de grises como matrices numpy 2D.Rotar numpy 2D array

Necesito rotar las imágenes sobre un punto (dentro de ellas) de diferentes ángulos de flotación. La rotación no necesita estar en su lugar, y permitiré (por supuesto, si lo he explicado bien hasta el momento) para la interpolación.

Me gustaría permanecer en numpy, ya que necesito realizar operaciones numéricas en el resultado, pero también puedo (si eso es imposible) permitir el paso adentro/afuera; por ejemplo, traté de usar PIL, concretamente Image.rotate (theta), pero no entiendo cómo aplicar eso a mis matrices, y cómo recuperar una matriz.

Gracias por su contribución.

+0

Cambié tus 'grises cale 'tag para' procesamiento de imágenes '. Creo que describe mejor tus intenciones. No dude en volver a cambiarlo – BlackBear

+0

Puede hacerlo directamente en numpy, pero para la conversión de ida y vuelta, consulte http://effbot.org/zone/pil-numpy.htm. –

+0

Gracias por el consejo, ¡acabo de notar esta caja! – astabada

Respuesta

3

Ver el comentario de cgohlke Nov 10 '11 a las 18:34:

Considere scipy.ndimage.interpolation .shift() y gire() para traducciones interpolados y rotaciones de matrices 2D numpy.

2

Las operaciones básicas se describen en la página de Wikipedia transformation matrix - No voy a tratar de hacer arte ascii matriz aquí, pero la salida P '= R * P donde P' es el punto de salida, R es el 2x2 matriz de transformación que contiene seno y coseno del ángulo de rotación, y P es el punto de entrada. Si desea rotar sobre algo que no sea el origen, cambie el origen antes de la rotación: P '= T + R * (P-T) donde T es la coordenada de la traducción. Las operaciones de matriz básica no hacen interpolación, por lo que si no está usando image processing library basado en numpy, querrá hacer una transformación inversa: para cada coordenada de salida (de valor entero), encuentre la coordenada (coma flotante) del punto que se rotaría en él, e interpolar el valor de ese punto de entrada de los píxeles circundantes.

+0

Esta hubiera sido la peor manera ... en caso de que no verificara la solución de cgohlke, la implementé en 120 ± 13 segundos. – astabada

0

me gustaría tener ayuda de arriba y resolver esto con un ejemplo:

import pandas as pd 
 
import numpy as np 
 
bd = np.matrix([[44., -1., 40., 42., 40., 39., 37., 36., -1.], 
 
       [42., -1., 43., 42., 39., 39., 41., 40., 36.], 
 
       [37., 37., 37., 35., 38., 37., 37., 33., 34.], 
 
       [35., 38., -1., 35., 37., 36., 36., 35., -1.], 
 
       [36., 35., 36., 35., 34., 33., 32., 29., 28.], 
 
       [38., 37., 35., -1., 30., -1., 29., 30., 32.]]) 
 
def rotate45(array): 
 
    rot = [] 
 
    for i in range(len(array)): 
 
     rot.append([0] * (len(array)+len(array[0])-1)) 
 
     for j in range(len(array[i])): 
 
      rot[i][int(i + j)] = array[i][j] 
 
    return rot 
 

 
df_bd = pd.DataFrame(data=np.matrix(rotate45(bd.transpose().tolist()))) 
 
df_bd = df_bd.transpose() 
 
print df_bd

de los cuales será una salida como:

44 0 0 0 0 0 0 0 0 
 
42 -1 0 0 0 0 0 0 0 
 
37 -1 40 0 0 0 0 0 0 
 
35 37 43 42 0 0 0 0 0 
 
36 38 37 42 40 0 0 0 0 
 
38 35 -1 35 39 39 0 0 0 
 
0 37 36 35 38 39 37 0 0 
 
0 0 35 35 37 37 41 36 0 
 
0 0 0 -1 34 36 37 40 -1 
 
0 0 0 0 30 33 36 33 36 
 
0 0 0 0 0 -1 32 35 34 
 
0 0 0 0 0 0 29 29 -1 
 
0 0 0 0 0 0 0 30 28 
 
0 0 0 0 0 0 0 0 32