2013-10-15 34 views
-2

我有一個bmp圖像,可以轉換爲二維數組。這很好。 但我需要比較一個像素(coordonate(i,j))與其鄰居(8像素)的顏色。 如果一個或多個顏色相同,我將它們與其他鄰居進行比較,然後...... 所以我打算使用遞歸函數。訪問衝突:從bmp映像運行數組

的代碼:

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。 我想,這是因爲我試圖訪問我未分配的數組的一部分。

感謝, (對不起,我的英語)

問候

回答

1

您應該檢查範圍。

if(u>0 || v>0 || u<NBLIG || v<NBCOL) 

將評估爲(0,0)和(NBLIG,NBCOL)爲真。 (和(-1,-1))

​​

可能更符合您的要求。

你的第二個邊界檢查似乎是多餘的,但是如果你想保留它,你需要確保該值嚴格小於最大值。

+0

那些原來的'如果'是討厭的。但是在for循環中,'u'和'v'從* u = i-1 * *到*'u <= i + 1'。雖然沒有解釋「i」和「j」是什麼參數,但上下文表明他們是其他人稱之爲「x」和「y」的東西。在這種情況下,(1)檢查需要'if u> = 1'(並且鏡像爲'width-1'),但是(2)這種特殊的檢查是*不必要的(也就是說,如果輸入是正確)。 +1,但是,因爲注意到這些奇怪的測試搞砸了本應該是一個簡單的工作。 – usr2564301

+0

嗯,這裏是我的理解:給出函數('i','j'),然後'u','v'迭代,然後進行邊界檢查。因此,如果'i = j = 0','u'和'v'的範圍從-1到1.因爲我假設邊緣應該被測試(例如(0,1),(1,0) ),應該允許'u'和'v'採取這些值,而不是給他們一個額外的邊界。 – shade4159

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)的顏色。

謝謝! 最好的問候