Поворот numpy 2D массива



У меня есть набор изображений в оттенках серого в виде массивов 2D numpy.



Мне нужно повернуть изображения вокруг одной точки (внутри них) под разными, плавающими углами. Вращение не должно быть на месте, и я позволю (конечно, если я хорошо объяснил до сих пор) для интерполяции.



Я хотел бы остаться в numpy, так как мне нужно выполнить числовые операции над результатом, но я также могу (если это невозможно) разрешить шаг in/out; например, я попытался использовать PIL, а именно Image.вращать (тета) но не понимаю, как применить это к моим массивам и как получить массив обратно.



Спасибо за Ваш вклад.

641   3  

3 ответов:

Смотрите комментарий cgohlke Nov 10 ' 11 at 18: 34:

Рассмотрим Сципиона.ndimage.интерполяция .shift() и rotate() для интерполированных переводов и поворотов 2D массивов numpy.

Основные операции описаны на странице Wikipediatransformation matrix - я не буду пытаться сделать здесь ascii matrix art, но вывод P' = R*P, где P' - выходная точка, R-матрица преобразования 2x2, содержащая синус и косинус угла поворота, а P-входная точка. Если вы хотите вращаться вокруг чего-то, отличного от начала координат, то перед вращением сдвиньте начало координат: P' = T + R*(P-T), где T-координата перемещения. Базовая матрица операции не выполняют интерполяцию, поэтому, если вы не используете библиотеку обработки изображений на основе numpy , вы захотите выполнить обратное преобразование: для каждой (целочисленной) выходной координаты найдите (с плавающей точкой) координату точки, которая будет повернута в нее, и интерполируйте значение этой входной точки из окружающих пикселей.

Я хотел бы воспользоваться помощью выше и решить это на примере:

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

, выход которого будет выглядеть следующим образом:

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

Comments

    Ничего не найдено.