将2D像素阵列旋转90度

noo*_*oob 10 c++ pixel image-processing rotation

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

raj*_*raj 20

你有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];
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该将old_data旋转90度CW.


mha*_*hat 13

如果您想使用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]);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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]);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


her*_*tao 10

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

  1. 如果图像是方形的

    在此输入图像描述

  2. 如果图像不是正方形

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

    在此输入图像描述