-2

二次元配列に変換する bmp 画像があります。それはうまくいきます。しかし、1 つのピクセル (座標 (i,j)) の色をその隣のピクセル (8 ピクセル) と比較する必要があります。1 つまたは複数が同じ色を持っている場合、それらを他の隣接する色と比較して.... そこで、再帰関数を使用する予定です。

コード:

void verifIdPoint (int TG[NBLIG][NBCOL], int T[NBLIG][NBCOL], short int Tpassage[NBLIG][NBCOL], int i, int j)
{
int u, v;

//printf ("saisie: %d   %d \n", i, j);

//system("pause");

for (u=i-1; u<=i+1; u++)
{
    for(v=j-1; v<=j+1; v++)
    {
               
        if(u>0 || v>0 || u<NBLIG || v<NBCOL)
        {
            if (TG[u][v] == TG[i][j])
            {
                tableauImgIntermediaire (TG, T, i, j);
                //printf ("TG[%d][%d]===== TG[%d][%d]\n", u, v, i, j);
                
                if (u<=0 || v<=0 || u>=NBLIG || v>=NBCOL)
                {
                }
                else
                {
                    if (Tpassage[u][v] == 0)
                    {
                    
                       printf ("Passage: u v T   %d %d %d \n", u, v, Tpassage[u][v]);
                       Tpassage[u][v] = 1;
                       verifIdPoint (TG, T, Tpassage, u, v);
                    }
                }        
            } 
        }                
    }               
}
} 

このコードは、画像の一部だけが同じ色 (中央の灰色の円など) の画像で機能します。しかし、色が (0,0) から (300,200) までの棒のようなものになると、「アクセス違反 (セグメントフォルト)」 エラーが発生します...

画像サイズは 300x200 です。割り当てられていない配列の一部にアクセスしようとしているからだと思います。

4

2 に答える 2

0

ご回答ありがとうございます。感謝します:)しかし、私は正しい方向には進んでいないと思います。フラッド フィル アルゴリズムについてどう思いますか?

私はそのようなコードを試しています:

 void fill(int TG[NBLIG][NBCOL], int i, int j, int couleurCible)
 {
     if (TG[i][j] == couleurCible)
     {
        TG[i][j] = couleurCible + 50;
        remplissage (TG[i][j+1], i, j, couleurCible);
        remplissage (TG[i][j-1], i, j, couleurCible);
        remplissage (TG[i+1][j], i, j, couleurCible);
        remplissage (TG[i-1][j], i, j, couleurCible);

     }
 }

couleurCible を使用すると、最初のピクセル (i,j) の色が変わります。

ありがとう !よろしくお願いします

于 2013-10-18T18:10:45.110 に答える