2013-05-22 16 views
5

私は画像のピクセルデータの配列を持っています。取得している画像はすでに270度に回転しています。だから正しい画像を得るために90度回転させようとしています。 data[x][y]data[y][x]に変更して転置アルゴリズムを試しましたが、正しい方法ではないと思います。私はそれを回転させるために何ができるのですか?2Dピクセル配列を90度回転させる

+0

:回転の90度のために例えば。プロセスを並列化して、より迅速に処理することができます。 –

答えて

7

これは余分なスペースを使わずに行うことができ、In-place matrix transposition(まったく同じではありません)と呼ばれます。転置後にいくつかのミラーリングを行うことを忘れないでください。

  1. 画像が正方形

    enter image description here

  2. ある場合、画像は、非正方行列について正方形

    • ない場合、アルゴリズムはより複雑です。 1980年以前のアルゴリズムの多くは、「follow-the-cycles」アルゴリズムと呼ばれることがあります。つまり、サイクルをループし、サイクル内のある場所から次の場所にデータを移動します。擬似コードの形式では:

    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度回転させる場合は、それぞれを逆にします。唯一の方法だ

    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]); 
        } 
    } 
    
関連する問題