2013-05-22 259 views
5

我有一個圖像的像素數據陣列。我得到的圖像已經旋轉到270度。所以我試圖再次旋轉90度以獲得正確的圖像。我已經嘗試了轉置算法,將data[x][y]更改爲data[y][x],但我不認爲這是正確的方法。任何人都可以指導我怎樣才能讓它旋轉?將2D像素陣列旋轉90度

+0

這是唯一的辦法。您可以並行化流程以使其更快。 –

回答

7

這可以在不使用任何額外空間的情況下完成,因此稱爲In-place matrix transposition(不完全相同)。記得在轉位後做一些鏡像。

  1. 如果圖像是正方形

    enter image description here

  2. 如果圖像不是方形

    • 對於非方陣,該算法更復雜。 1980年以前的許多算法可以被描述爲「循環週期」算法。也就是說,他們在循環中循環,將數據從一個位置移動到另一個位置。在僞代碼形式:

    enter image description here

14

你有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]; 
    } 
} 

這應該由90度旋轉CW OLD_DATA。

+0

如果圖像不是方形的,它會工作嗎? – noob

+0

是的。它會。我用一個小矩陣試了一下。 :) 只要確定輸入圖像的順序是MxN,那麼輸出圖像的順序是NxM。 –

+0

謝謝,我正在嘗試這個。 – noob

5

如果你想要做的就地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]); 
        } 
    }