2016-03-29 26 views
0

この問題を解決するためのコードを書きました。Flatindexed 2D配列 - 画像を縦方向/横方向に反転する

私は、X11を使ってグレイスケール画像を描画するプログラムを与えられました。

私は画像を水平/垂直に反転させる機能を記述するように求められました。ここで

は私のコードスニペットは、

// flip the image, left-to-right, like in a mirror. 
void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

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

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     } 
    } 
    return; 
} 

私がいる問題がされている私の横の機能は、画像の半分だけの道を反転させ、残りの半分は元の値を保持することです。

私の垂直フリップ機能も混乱していて、生成されたイメージはまったく同じではないので、私は関数を書くロジックを間違えたところでデバッグしようとしています。

私は2D配列値にアクセスするためにフラットインデックスメソッドを使用しています。

+0

C '='では、「スワップ」を意味しません。たとえそれがあったとしても、あなたは古典的な「単語逆」の鳴き声を作り、文字を入れ替えて再び入れ替えました。 –

+0

フラットインデックス: 'array [rows * i + j]' - > 'array [cols * i + j]' –

答えて

-1
static uint8_t temp; 

void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

    int i; 
    int j; 
    for (i=0; i<rows/2;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*i+(cols-1-j)]; 
     array[rows*i+(cols-1-j)]=temp; 
     } 
    } 
} 

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols/2;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     array[rows*(rows-1-i)+j]=temp; 
     } 
    } 
    return; 
} 

このコードは、効率改善の多くを立つこともできますが、基本的に私がやったことは、あなたがスワップ操作を行う回数を半分にして、私はスワップ操作中にデータを保持するために一時変数を導入しました。

+0

フラットインデックスエラーを修正していません: 'array [rows * i + j]' - > ' 'array [cols * i + j]' –

2

水平フリップでは、内側のループがすべての列を通過し、ピクセルにミラーリングされた値が割り当てられます。一番左の画素が100、一番右の画素が23であるとしましょう。一歩後に左端が23になります。右端の画素を見ると左端の画素が見え、もう一方の画素は23になります。値100はすでに失われています。そういうわけで、イメージの右半分は変わらないでしょう。

垂直フリップにも同じ問題があります。

また、インデックスに問題があります。私はcolsと仮定しますは列の数を意味し、は行の数を意味します。イメージが格納されていると仮定すると、フラット配列のレイアウトが行の後ろ、つまり読取り順と同じであるとすると、行iと列jのピクセルは、の代わりにcols * i + j * i + j。 Unintuitively、colsは列の数であり、同時に行のサイズです。ハッピーデバッグ:)

関連する問題