【问题标题】:Rotating a 2D pixel array by 90 degrees将 2D 像素阵列旋转 90 度
【发布时间】:2013-05-17 02:19:33
【问题描述】:

我有一个图像的像素数据数组。我得到的图像已经旋转到 270 度。所以我试图将它再次旋转 90 度以获得正确的图像。我尝试了转置算法,将data[x][y] 更改为data[y][x],但我认为这不是正确的方法。谁能指导我如何让它旋转?

【问题讨论】:

  • 这是唯一的方法。您可以并行化流程以使其更快。

标签: c++ image-processing rotation pixel


【解决方案1】:

要将图像(2D 矩阵)旋转 90 度,您可以通过在将其旋转 90 度后在初始状态和结束状态之间映射出一个模式来轻松完成此操作。


a[i][j] => a[m][n]
a[0][0] => a[0][2]
a[0][1] => a[1][2]
a[0][2] => a[2][2]
a[1][0] => a[0][1]
a[1][1] => a[1][1]
a[1][2] => a[2][1]
a[2][0] => a[0][0]
a[2][1] => a[1][0]
a[2][2] => a[2][0]

现在解决方案很明显。所有的 J 轮到 M 和 N = (Size of matrix(2) - I)。


const rotateImage = (a) => {
  let size = a.length;
  let results = new Array(size);
  for (let i = 0; i < size; i++) {
    results[i] = new Array(size);
  }
  for (let i = 0; i < size; i++) {
    for (let j = 0; j < size; j++) {
      results[j][(size - 1) - i] = a[i][j];
    }
  }
  return results;
}

console.log(rotateImage([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]));

【讨论】:

    【解决方案2】:

    如果您想在 O(1) 空间内就地执行此操作,可以按照以下步骤操作:

    1. 通过交换data[i][j]data[j][i] 来转置矩阵:

      for (int i = 0; i < n; i += 1) {
          for (int j = i+1; j < n; j += 1) {
              swap(data[i][j], data[j][i]);
          }
      }
      
    2. 反转每一行或每一列,分别旋转 +90 度或 -90 度。例如 +90 度旋转:

      for (int i = 0; i < n; i += 1) {
          for (int j = 0; j < n/2; j += 1) {
              swap(data[i][j], data[i][n-1-j]);
          }
      }
      

    【讨论】:

      【解决方案3】:

      这可以在不使用任何额外空间的情况下完成,所谓的In-place matrix transposition(不完全相同)。记得在转置后做一些镜像。

      1. 如果图片是方形的

      2. 如果图像不是正方形

        • 对于非方阵,算法更复杂。 1980 年之前的许多算法可以被描述为“跟随周期”算法。也就是说,它们循环循环,将数据从一个位置移动到循环中的下一个位置。伪代码形式:

      【讨论】:

        【解决方案4】:

        你有old_data[rows][cols]new_data[cols][rows],那么:

        for(int i=0; i<cols; i++) {
            for(int j=0; j<rows; j++) {
                new_data[i][j] = old_data[rows-1-j][i];
            }
        }
        

        这应该将 old_data 顺时针旋转 90 度。

        【讨论】:

        • 是的。它会。我用一个小矩阵试过这个。 :) 只需确保输入图像的顺序为 MxN,然后输出图像的顺序为 NxM。
        • 谢谢,我现在正在尝试。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多