旋转NumPy二维数组

15 投票
3 回答
30427 浏览
提问于 2025-04-17 06:03

我有一些灰度图像,它们是以二维的NumPy数组形式存在的。我需要围绕图像中的一个点进行旋转,旋转的角度可以是不同的小数值。旋转不一定要在原地进行,我可以接受插值处理。

我想使用NumPy来实现这个功能,但也希望能有放大和缩小的效果。我试过使用PIL库里的Image.rotate(theta)方法,但我不太明白怎么把这个方法应用到我的数组上,以及怎么把结果再转回数组。

3 个回答

2

一个例子:

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
3

这些操作可以在维基百科的变换矩阵页面上找到。输出的公式是 P' = R*P,其中 P' 是输出的点,R 是一个包含旋转角度的正弦和余弦的2x2变换矩阵,而 P 是输入的点。如果你想围绕其他点进行旋转,而不是原点,那么在旋转之前需要先移动原点:P' = T + R*(P-T),这里的 T 是平移坐标。

基本的矩阵操作并不进行插值,所以如果你没有使用基于NumPy的图像处理库,你需要进行反向变换:对于每一个整数输出坐标,找到会被旋转到这个位置的浮点坐标,并从周围的像素中插值出这个输入点的值。

6

可以看看 scipy.ndimage.interpolation.shift()rotate() 这两个函数,它们可以用来对2D的numpy数组进行平移和旋转,并且会进行插值处理。

撰写回答