【问题标题】:Is there any easy way to rotate the values of a matrix/array?有没有简单的方法来旋转矩阵/数组的值?
【发布时间】:2015-06-12 14:59:32
【问题描述】:

所以,假设我有以下矩阵/数组 -

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

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

【问题讨论】:

    标签: python matrix rotation pixel image-rotation


    【解决方案1】:

    首先,当以如此低的“分辨率”完成时,以非 90 度角旋转一个只有 1 和 0 的形状根本不会看起来很像原始形状。但是,我建议您查看rotation matrices。正如您所说,您可能希望将每个值作为坐标对查找,然后围绕中心旋转。如果你把它做成一个二维数组可能会更容易。祝你好运!

    【讨论】:

      【解决方案2】:

      我认为这应该可行:

      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 大得多,并且原点应该(最好)在数组的中间。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 2017-04-22
        相关资源
        最近更新 更多