2011-02-02 5 views
2

Pls。これは家事に関する質問ではありませんが、私がやっている仕事や、いくつかの指針が必要な場所に注意してください。画像アレイのパディングのロジック

私は2D画像を1D配列(行の大部分の順序)に格納しています。私は境界線ピクセルの複製を上のパディングの1行、下の1行、右のパディングから1列、イメージの1列から左にパディングする必要があります。私はこれをCコードで実行しようとしています。

以下に示すimg []として1次元配列に格納された2D画像を考えてみましょう。実際のイメージは3x4サイズ(4行3列)で、上下左右に1行1列のパディングを行った後、最終イメージのサイズは5x6(6行、5列)になります。私の場合

int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0}; 

、パディングのサイズは、公知の上下にわずか1行、右に1列及び画像の左されます。そこで私が実装した方法の1つは、指定されたイメージ配列内のピクセルのインデックスと、パディングされた出力ピクセルインデックスとの間のマッピングを作成することです。このマッピングをあらかじめ計算されたルックアップテーブルに保存し、そのテーブルをパディングロジックで使用しました。

int lut[6,6,7,8,8,...]; 

と、次のように、このテーブルを使用します。

for(i=0;i<30;i++) 
{ 
img[i] = img[lut[i]]; //something on this lines... 
} 

しかし、私を - :

int img[30] = {1,1,2,3,3,1,1,2,3,3,4,4,5,6,6,7,7,8,9,9,7,7,8,9,9}; 

私が作成したルックアップテーブルをした出力をパディングした後

は次のようになります。ルックアップテーブルベースのmetを使用するよりもプログラム的にこのイメージパディングロジックを実装することに興味がありますhod。つまり、実行時にコード内のピクセルインデックスを計算したいと考えています。 EDIT:また、埋め込まれたイメージを所定の位置に取得する必要があります(追加の埋め込み済み行/列用のストレージを提供する同じバッファ内にあります)。

コードはどのようなポインタになりますか。

ありがとうございました。

〜AD

答えて

5
#include <stdio.h> 

void pad_image(int* img, int cols, int rows) 
{ 
    for(int i = 0 ; i < cols ; ++i) 
    { 
     // top and bottom 
     img[i]    = img[i+cols]; 
     img[i+cols*(rows-1)] = img[i+cols*(rows-1)-cols]; 
    } 
    for(int j = 0 ; j < rows ; ++j) 
    { 
     // left and right 
     img[j*cols]  = img[j*cols+1]; 
     img[j*cols+cols-1] = img[j*cols+cols-2]; 
    } 
} 

int main(int argc, char** argv) 
{ 
    int img[30] = {0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,10,11,12,0,0,0,0,0,0}; 
    for(unsigned int i = 0 ; i < 30 ; ++i) 
     printf("%d ",img[i]); 
    printf("\n"); 
    pad_image(img,5,6); 
    for(unsigned int i = 0 ; i < 30 ; ++i) 
     printf("%d ",img[i]); 
    printf("\n"); 
} 
+0

とても良いです。ロジックを理解するために、そしてそれもメイン()と一緒に!ありがとうございました。 – goldenmean

3

あなたのイメージがすでに転送先配列内の正しい位置に配置されているので、これは合理的に簡単です - あなたはそれをコピーし、アレイ内の周りのすべてのデータを移動する必要はありません。

次の関数は、パッド付きサイズ(例ではpad_image(img, 5, 6);)で呼び出されます。最初と最後の列を埋めて、塗りつぶされた行を反復処理します。次に、埋め込まれた最初と最後の行を複製します。

#include <string.h> 

void pad_image(int img[], int n_cols, int n_rows) 
{ 
    int row; 

    if (n_cols < 3 || n_rows < 3) 
     return; 

    for (row = 1; row < (n_rows - 1); row++) 
    { 
     /* Duplicate first column in this row */ 
     img[row * n_cols] = img[row * n_cols + 1]; 
     /* Duplicate last column in this row */ 
     img[row * n_cols + n_cols - 1] = img[row * n_cols + n_cols - 2]; 
    } 

    /* Duplicate first row */ 
    memcpy(&img[0 * n_cols], &img[1 * n_cols], n_cols * sizeof img[0]); 
    /* Duplicate last row */ 
    memcpy(&img[(n_rows - 1) * n_cols], &img[(n_rows - 2) * n_cols], n_cols * sizeof img[0]); 
} 
+0

これは、要素のコピー操作の少ない数の点でややより最適なようです!ありがとうございました。 – goldenmean

関連する問題