有没有简单的方法来旋转矩阵/数组的值?

时间:2015-06-12 14:59:33

标签: python matrix rotation pixel image-rotation

所以,让我们说我有以下矩阵/数组 -

    [0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 1 1 1 0 0 0 0 0
     0 0 0 1 1 1 1 0 0 0 0 0
     0 0 1 1 1 1 1 1 0 0 0 0
     0 0 1 1 1 1 1 1 0 0 0 0
     0 0 0 1 1 1 1 0 0 0 0 0 
     0 0 0 0 1 1 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0]

写一些可以上下翻译这些值的东西是相当简单的。如果我想将它旋转一个不是90度的倍数的角度怎么办?我知道由于网格的性质,显然不可能得到完全相同的形状(由1s组成)。想到的想法是将每个值1转换为坐标向量。然后它将相当于一个点旋转坐标(应该更简单)。然后可以编写一些可以获取坐标的东西,并将它们与矩阵网格进行比较,如果右侧框中有一个点,它将被填充。我知道我还必须找到一个可以旋转的中心。

这看起来像是一种合理的方法吗?如果有人有更好的主意,我会全力以赴。我知道像这样的小网格,形状可能会完全不同,但是如果我有一个大的形状由1表示,在大网格中,表示之间的差异会更小。

2 个答案:

答案 0 :(得分:1)

首先,在非90度的角度下旋转这样的形状只有1和0,并不是真的会像原来一样,当它完成时在如此低的分辨率下#34;但是,我建议调查rotation matrices。就像你说的那样,你可能想要找到每个值作为坐标对,并围绕中心旋转它。如果你把它变成一个二维数组可能会更容易。祝你好运!

答案 1 :(得分:1)

我认为这应该有效:

from math import sin, cos, atan2, radians
i0,j0 = 0,0 #point around which you'll rotate
alpha = radians(3) #3 degrees

B = np.zeros(A.shape)
for i,j in np.swapaxes(np.where(A==1),0,1):
    di = i-i0
    dj = j-j0
    dist = (di**2 + dj**2)**0.5
    ang = atan2(dj,di)

    pi = round(sin(ang+alpha)*dist) + i0
    pj = round(cos(ang+alpha)*dist) + j0
    B[pi][pj] = 1

但是,请不要忘记分段错误!

B数组应该比A大得多,并且原点应该(最佳地)在数组的中间。