2013-05-22 7 views
5

Ho una matrice di dati di pixel per un'immagine. L'immagine che sto ottenendo è già ruotata a 270 gradi. Quindi sto provando a ruotarlo di nuovo di 90 gradi per avere l'immagine corretta. Ho provato un algoritmo di trasposizione, modificando data[x][y] a data[y][x], ma non penso che sia il modo corretto. Qualcuno può guidarmi cosa posso fare per farlo ruotare?Rotazione di un array di pixel 2D di 90 gradi

+0

Questo è l'unico modo. È possibile parallelizzare il processo per renderlo più veloce. –

risposta

7

Questo può essere fatto senza utilizzare alcuno spazio aggiuntivo, così chiamato In-place matrix transposition (non esattamente lo stesso). Ricordati di fare un po 'di mirroring dopo la trasposizione.

  1. Se l'immagine è quadrata

    enter image description here

  2. Se l'immagine non è quadrata

    • Per matrici non quadrati, gli algoritmi sono più complicate. Molti degli algoritmi precedenti al 1980 potrebbero essere descritti come algoritmi "follow-the-cycle". Cioè, passano sopra i cicli, spostando i dati da una posizione a quella successiva nel ciclo. In forma di pseudocodice:

    enter image description here

14

Hai old_data[rows][cols] e new_data[cols][rows], quindi:

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

Questo dovrebbe ruotare di 90 gradi old_data CW.

+0

Funzionerà se l'immagine non è quadrata? – noob

+0

Sì. Lo farà. Ho provato questo con una piccola matrice. :) Assicurati solo che se l'immagine di input è dell'ordine MxN, l'immagine di uscita è dell'ordine NxM. –

+0

Grazie, ci sto provando ora. – noob

5

Se si vuole fare sul posto con O (1) spazio, è possibile seguire questa:

  1. trasporre la matrice scambiando data[i][j] e 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. Invertire ogni riga o colonna per +90 o -90 gradi di rotazione, rispettivamente. Ad esempio, per +90 gradi di rotazione:

    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]); 
        } 
    }