旋转NumPy的2D数组

15
我有灰度图像作为2D NumPy数组。我需要围绕其中一个点以不同的浮点角度进行旋转。旋转不需要原地进行,并且我允许插值。
我想使用NumPy,但也允许在内外进行步骤。我尝试使用PIL的Image.rotate(theta),但不知道如何将其应用到我的数组上以及如何获得一个数组返回。

我已将你的“灰度”标签更改为“图像处理”。我认为这更好地描述了你的意图。如有需要,可以随时将其更改回来。 - BlackBear
你可以直接在numpy中完成这个操作,但是如果需要进行来回转换,请参考http://effbot.org/zone/pil-numpy.htm。 - Josh Bleecher Snyder
谢谢您的建议,我刚刚注意到这个框! - astabada
@cgohlke,你的第二个链接有一个错别字(域名应该是http://scikit-image.org),目前它链接到了一个垃圾邮件发送者。 - tiago
1
在我的建议下,scikits-image 被重命名为 scikit-image。详情请见此链接 - cgohlke
3个回答

6

请参考cgohlke于2011年11月10日18:34的评论:

考虑使用scipy.ndimage.interpolation.shift() 和 rotate() 来对2D numpy数组进行插值平移和旋转。


谢谢@Vasco。有没有保持形状但只旋转“on”位的函数? - Nathan majicvr.com
1
在SciPy v1.1中,我认为现在应该使用scipy.ndimage.rotate()而不是scipy.ndimage.interpolation.rotate() - Grayscale

3
基本操作在维基百科的变换矩阵页面中有描述 - 我不会在这里尝试做ASCII矩阵艺术,但输出P' = R * P,其中P'是输出点,R是包含旋转角度的正弦和余弦的2x2变换矩阵,而P是输入点。如果您想围绕除原点以外的其他内容进行旋转,则在旋转之前移动原点:P'= T + R*(P-T),其中T是平移坐标。基本矩阵操作不进行插值,因此如果您没有使用基于numpy的图像处理库,则需要进行反向转换:对于每个(整数值)输出坐标,找到旋转到该坐标的点的(浮点数)坐标,并从周围的像素中插值该输入点的值。

如果你没有查看cgohlke的解决方案,那么这将是一种困难的方式......我在120±13秒内实现了它。 - astabada

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接