Поворот двумерного массива - PullRequest
15 голосов
/ 10 ноября 2011

У меня есть набор изображений в градациях серого в виде двумерных массивов.

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

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

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

Ответы [ 3 ]

6 голосов
/ 27 октября 2014

См. Комментарий cgohlke 10 ноября '11 в 18: 34:

Рассмотрим scipy.ndimage.interpolation .shift () и rotate () для интерполированных перемещений и вращений двумерных массивов.

2 голосов
/ 19 августа 2017

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

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
2 голосов
/ 10 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...