Tourner numpy tableau 2D

j'ai un ensemble d'images à l'échelle de gris comme des tableaux 2D numpy.

j'ai besoin de faire tourner les images autour d'un point (à l'intérieur d'eux) de différents angles de flotteur. La rotation n'a pas besoin d'être en place, et je vais permettre (bien sûr, si j'ai bien expliqué jusqu'à présent) pour l'interpolation.

je voudrais rester à numpy, car j'ai besoin d'effectuer des opérations numériques sur le résultat, mais je peux aussi (si c'est impossible) permettre d'entrer/sortir; par exemple, j'ai essayé d'utiliser PIL, à savoir Image.tourner(theta) mais ne savent pas comment l'appliquer à mes tableaux, et comment obtenir un tableau arrière.

je vous Remercie pour votre contribution.

12
demandé sur BlackBear 2011-11-10 21:45:34

3 réponses

Voir le commentaire de cgohlke 10 Nov '11 à 18:34:

Considérer scipy.ndimage.interpolation.maj() et rotate() pour interpolées les translations et les rotations de la 2D tableaux numpy.

5
répondu Vasco 2014-10-27 11:23:28

les opérations de base sont décrites dans Wikipedia matrice de transformation page-je ne vais pas essayer de faire l'art de matrice ascii ici, mais la sortie P' = R*P où P' est le point de sortie, R est la matrice de transformation 2x2 contenant sine et cosine de l'angle de rotation, et P est le point d'entrée. Si vous voulez tourner autour de quelque chose d'autre que l'origine, alors déplacez l'origine avant la rotation: P' = T + R*(P-T) Où T est la coordonnée de traduction. Base les opérations de matrix ne font pas d'interpolation, donc si vous n'utilisez pas un traitement d'image library, vous voulez faire une transformation inverse: pour chaque coordonnée de sortie (valeur entière), trouvez la coordonnée (point flottant) du point qui serait tourné en elle, et interpolez la valeur de ce point d'entrée à partir des pixels environnants.

2
répondu Dave 2011-11-10 18:45:27

je voudrais prendre l'aide de ci-dessus et résoudre ceci par un exemple:

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

dont la sortie sera comme:

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
1
répondu Sandeep Sharma 2017-08-19 09:01:52