Algorithm to rotate an image 90 degrees in place? (No extra memory)

前端 未结 9 841
囚心锁ツ
囚心锁ツ 2020-11-29 06:26

In an embedded C app, I have a large image that I\'d like to rotate by 90 degrees. Currently I use the well-known simple algorithm to do this. However, this algorithm requi

相关标签:
9条回答
  • 2020-11-29 07:03

    This might help: In-place matrix transposition.

    (You might also have to do some mirroring after the transposition, as rlbond mentions).

    0 讨论(0)
  • 2020-11-29 07:03

    Here is my attempt for matrix 90 deg rotation which is a 2 step solution in C.
    First transpose the matrix in place and then swap the cols.

    #define ROWS        5
    #define COLS        5
    
    void print_matrix_b(int B[][COLS], int rows, int cols) 
    {
        for (int i = 0; i <= rows; i++) {
            for (int j = 0; j <=cols; j++) {
                printf("%d ", B[i][j]);
            }
            printf("\n");
        }
    }
    
    void swap_columns(int B[][COLS], int l, int r, int rows)
    {
        int tmp;
        for (int i = 0; i <= rows; i++) {
            tmp = B[i][l];
            B[i][l] = B[i][r];
            B[i][r] = tmp;
        }
    }
    
    
    void matrix_2d_rotation(int B[][COLS], int rows, int cols)
    {
        int tmp;
        // Transpose the matrix first
        for (int i = 0; i <= rows; i++) {
            for (int j = i; j <=cols; j++) {
                tmp = B[i][j];
                B[i][j] = B[j][i];
                B[j][i] = tmp;
            }
        }
        // Swap the first and last col and continue until
        // the middle.
        for (int i = 0; i < (cols / 2); i++)
            swap_columns(B, i, cols - i, rows);
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int B[ROWS][COLS] = { 
                      {1, 2, 3, 4, 5}, 
                          {6, 7, 8, 9, 10},
                              {11, 12, 13, 14, 15},
                              {16, 17, 18, 19, 20},
                              {21, 22, 23, 24, 25}
                            };
    
        matrix_2d_rotation(B, ROWS - 1, COLS - 1);
    
        print_matrix_b(B, ROWS - 1, COLS -1);
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-29 07:09

    Not sure what processing you will do after the rotation, but you can leave it alone and use another function to read rotated pixel from the original memory.

    uint16_t getPixel90(Image *img, int x, int y) 
    {
        return img->data[(img->height - x) * img->width + y];
    }
    

    Where input parameter x and y has swapped dimension from original

    0 讨论(0)
提交回复
热议问题