2013-10-15 31 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)的颜色。

谢谢! 最好的问候