Поворот numpy 2D массива
У меня есть набор изображений в оттенках серого в виде массивов 2D numpy.
Мне нужно повернуть изображения вокруг одной точки (внутри них) под разными, плавающими углами. Вращение не должно быть на месте, и я позволю (конечно, если я хорошо объяснил до сих пор) для интерполяции.
Я хотел бы остаться в numpy, так как мне нужно выполнить числовые операции над результатом, но я также могу (если это невозможно) разрешить шаг in/out; например, я попытался использовать PIL, а именно Image.вращать (тета) но не понимаю, как применить это к моим массивам и как получить массив обратно.
Спасибо за Ваш вклад.
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