将2D像素阵列旋转90度
c++
image-processing
5
0

我有一张图像的像素数据数组。我正在获取的图像已经旋转到270度。因此,我尝试将其再次旋转90度以获取正确的图像。我已经尝试过将data[x][y]更改为data[y][x]的转置算法,但是我认为这不是正确的方法。谁能指导我该如何旋转?

参考资料:
Stack Overflow
收藏
评论
共 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度。

收藏
评论

这可以在不使用任何额外空间的情况下完成,即所谓的就地矩阵转置 (不完全相同)。请记住在转置后进行一些镜像。

  1. 如果图像是正方形的

    在此处输入图片说明

  2. 如果图像不是正方形

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

    在此处输入图片说明

收藏
评论

要将图像(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 =(矩阵(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]
]));
收藏
评论

如果要使用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]); } } 
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号