Probleme avec filtre image en c

Signaler
Messages postés
3
Date d'inscription
jeudi 2 juillet 2009
Statut
Membre
Dernière intervention
3 juillet 2009
-
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011
-
Bonjour,
tout d'abords un GRAND MERCI a tous ceux ki ont participé ds la conception de ce site.
En fait j'ai un proble avec un filtre image avec matrice 5*5, ca compile mais quand je le lance il bloque et note: SEGUEMENTATION FAULT? voici une partie du code:

dans image.c///////////////

ImagePtr Filtre5(ImagePtr I1 , double ** M)
{
int i,j;
double k;

ImagePtr I3=ImageConstructeur(I1->Largeur,I1->Hauteur);

for(i=2;i<(I1->Hauteur)-1;i++)
{
for(j=2;j<(I1->Largeur)-1;j++)
{
k=(double)I1->Pixels[i-2][j-2]*M[4][0]+(double)I1->Pixels[i-2][j-1]*M[4][1]+(double)I1->Pixels[i-2][j]*M[4][2]+(double)I1->Pixels[i-2][j+1]*M[4][3]+(double)I1->Pixels[i-2][j+2]*M[4][4]+(double)I1->Pixels[i-1][j-2]*M[3][0]+(double)I1->Pixels[i-1][j-1]*M[3][1]+(double)I1->Pixels[i-1][j]*M[3][2]+(double)I1->Pixels[i-1][j+1]*M[3][3]+(double)I1->Pixels[i-1][j+2]*M[3][4]+(double)I1->Pixels[i][j-2]*M[2][0]+(double)I1->Pixels[i][j-1]*M[2][1]+(double)I1->Pixels[i][j]*M[2][2]+(double)I1->Pixels[i][j+1]*M[2][3]+(double)I1->Pixels[i][j+2]*M[2][4]+(double)I1->Pixels[i+1][j-2]*M[1][0]+(double)I1->Pixels[i+1][j-1]*M[1][1]+(double)I1->Pixels[i+1][j]*M[1][2]+(double)I1->Pixels[i+1][j+1]*M[1][3]+(double)I1->Pixels[i+1][j+2]*M[1][4]+(double)I1->Pixels[i+2][j-2]*M[0][0]+(double)I1->Pixels[i+2][j-1]*M[0][1]+(double)I1->Pixels[i+2][j]*M[0][2]+(double)I1->Pixels[i+2][j+1]*M[0][3]+(double)I1->Pixels[i+2][j+2]*M[0][4];

if( k>255)
k=255;
if( k<0)
k=0;
I3->Pixels[i][j]=k;
}
}

return I3;
}

////////////////////////////////////////////////////////////////
dans projetimage.c////////////////////////////////////

case 18:
{

double **M;
M=(double**)malloc(sizeof(double*));

M[0][0]=1/25; M[3][0]=1/25;
M[0][1]=1/25; M[3][1]=1/25;
M[0][2]=1/25; M[3][2]=1/25;
M[0][3]=1/25; M[3][3]=1/25;
M[0][4]=1/25; M[3][4]=1/25;
M[1][0]=1/25; M[4][0]=1/25;
M[1][1]=1/25; M[4][1]=1/25;
M[1][2]=1/25; M[4][2]=1/25;
M[1][3]=1/25; M[4][3]=1/25;
M[1][4]=1/25; M[4][4]=1/25;
M[2][0]=1/25;
M[2][1]=1/25;
M[2][2]=1/25;
M[2][3]=1/25;
M[2][4]=1/25;

anImagePtr=Filtre5(Image1Ptr,M);
break;
}

case 19:
{
double **M;
M=(double**)malloc(sizeof(double*));
M[0][0]=11/864; M[3][0]=23/864;
M[0][1]=23/864; M[3][1]=48/864;
M[0][2]=29/864; M[3][2]=62/864;
M[0][3]=23/864; M[3][3]=48/864;
M[0][4]=11/864; M[3][4]=23/864;
M[1][0]=23/864; M[4][0]=11/864;
M[1][1]=48/864; M[4][1]=23/864;
M[1][2]=62/864; M[4][2]=29/864;
M[1][3]=48/864; M[4][3]=23/864;
M[1][4]=23/864; M[4][4]=11/864;
M[2][0]=29/864;
M[2][1]=62/864;
M[2][2]=80/864;
M[2][3]=62/864;
M[2][4]=29/864;

anImagePtr=Filtre5(Image1Ptr,M);
break;
}

case 20:
{
double **M;
M=(double**)malloc(sizeof(double*));
M[0][0]=1/80; M[3][0]=1/80;
M[0][1]=1/80; M[3][1]=3/80;
M[0][2]=3/80; M[3][2]=7/80;
M[0][3]=1/80; M[3][3]=3/80;
M[0][4]=1/80; M[3][4]=1/80;
M[1][0]=1/80; M[4][0]=1/80;
M[1][1]=3/80; M[4][1]=1/80;
M[1][2]=7/80; M[4][2]=3/80;
M[1][3]=3/80; M[4][3]=1/80;
M[1][4]=1/80; M[4][4]=1/80;
M[2][0]=3/80;
M[2][1]=7/80;
M[2][2]=16/80;
M[2][3]=7/80;
M[2][4]=3/80;

anImagePtr=Filtre5(Image1Ptr,M);
break;
}

///////////////////////////////////////////////////////

est ce que klk1 peut m'aidez svp..

5 réponses

Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Bonjour,

Si tu utilises un debugger, il pourra te dire précisément quelle instruction provoque l'erreur...

Comment le tableau Pixel est-il défini ?
Je pense que lorsque i == Hauteur - 2 (dernier passage dans la boucle), les accès à Pixel[i+2] sont hors du tableau.

Cela dit, il y a des problèmes ailleurs.

double **M;
Cela déclare un pointeur vers un pointeur vers un double, pas de problème.

M=(double**)malloc(sizeof(double*));
Ici on alloue de quoi stocker UN pointeur vers un double. Ce n'est vraisemblablement pas assez.

Corrigeons par exemple en allouant de quoi stocker 25 doubles:
M = malloc(sizeof(double) * 25);

M pointe donc vers un endroit dans la mémoire où l'on peut stocker 25 doubles contigus. Est-ce ce que l'on veut ?
Si oui, M devrait être de type double*.
Si non, on peut écrire (mais je te le déconseille dans ton cas):

#define LIGNES 5
#define COLONNES 5
M = malloc(sizeof(*M) * LIGNES) ;
int i ;
for( i = 0 ; i < LIGNES ; ++i)
  M[i] = malloc(sizeof(*(M[i])) * COLONNES) ;

Une autre petite remarque: écris un programme qui contient ces quelques lignes
printf("%d", 1/25);
printf("%f", 1/25);
printf("%d", 1./25);
printf("%f", 1./25);
Cela ne devrait pas compiler silencieusement...

Bon courage,
Messages postés
3
Date d'inscription
jeudi 2 juillet 2009
Statut
Membre
Dernière intervention
3 juillet 2009

Merci pour ta reponse si précise..
en fait j'ai rectifier dans la boucle de i et j elle s'arrete a hauteur-2 et largeur-2 mais le probleme perciste. comme ta dis j'ai des doutes aussi ds la declaration de M je sais pas koi faire. j'ai essayé ske ta dis avec malloc(sizeof(double)*25) en declarant double **M dans le .h mais ca donne rien, pour le tableau de Pixel voila comment il est declaré:

GLvoid ReadPixels(char * fichier )
{
  static GLboolean ImageSwitch = GL_FALSE ;
  int i , j;
  FILE *file;
  file=fopen(fichier,"r");
  fscanf(file,"%d %d \n",&width,&height);
  printf("%d %d\n",width,height);
  anImagePtr=ImageConstructeur( width,height);
  int ia = 0;
  for ( i = 0 ; i < width ; i++ )
    {
      for ( j = 0 ; j < height ; j++ )
 {
   fscanf(file,"%d ",&anImagePtr->Valeurs[ia]) ;
   ia++;
 }
    }
 


  if(mode==GL_FALSE)
    {
      if(ImageSwitch==GL_FALSE) Image1Ptr=anImagePtr ;
      else
 Image2Ptr=anImagePtr;
      ImageSwitch=!ImageSwitch;
 
    }
  else
    {
      Image1Ptr=anImagePtr;
      ImageSwitch=GL_FALSE;
    }
 printf("\n");
  fclose(file);
}

merci encore
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Bonjour,

Il me semble qu'il n'y a pas trace de «déclaration» du tableau Pixels de la structure ImagePtr dans le code que tu montres. En revanche, il y a quelque chose d'intéressant: le membre Valeurs a l'air d'être un tableau unidimensionnel, moins source d'erreurs.
Cela rejoint ce que j'ai dit plus haut : si tu te sers de M comme d'un tableau unidimensionnel, son type devrait être double* et pas double**.

Si M est de type double**, c'est une variable dont la valeur droite est une adresse (notons-la x). Lorsque tu écris M[0], c'est que tu vas chercher la valeur (de type double*) stockée à l'adresse x. À nouveau, cette valeur est une adresse. Notons-la y. Quand tu écris M[0][0], tu vas chercher la valeur stockée à l'adresse y. Cela revient à faire ce qui suit:
double ** M;
/*...*/
double ** x = M ;
double * y = *x ; // M[0]
double m = *y ; // M[0][0]

Pour t'en sortir, je te conseille deux choses:
1. Sers-toi d'un débugger. Par exemple avec gcc/gdb, tu compiles (gcc -ggbd) et tu exécutes dans gdb (gdb a.out //si a.out est le nom de ton exécutable) puis la commande magique est «help» (mais tu peux aussi faire «run» pour simplement exécuter le programme a.out). Il te dira quelle instruction provoque l'erreur.
2. Contente-toi de tableaux unidimensionnels, et teste sur de petits exemples: fais un programme qui remplit une matrice et l'affiche, compile, exécute. Si tout va bien, tu sais qu'il n'y a pas d'erreur dans cette portion de code et tu peux passer à la suite avec confiance.

Bonne prog,
Messages postés
3
Date d'inscription
jeudi 2 juillet 2009
Statut
Membre
Dernière intervention
3 juillet 2009

j'ai essayé avec le debugeur maisje sais pas vraiment le manipulé, et le probleme est ke je doit l'envoyé au prof avant lundi soir. est ce ke je peu t'envoyé tout le code pour y jetter un coup d'oeil? voici mon adresse simpleboy75 (at) hotmail (poin) com

merci encore
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Salut,

Le plus simple revient peut-être à allouer M statiquement?:

.h?:
extern
double M[5][5];

.c?:
double M[5][5];

et de ne plus le passer en paramètre à la fonction Filtre5.

Du coup, plus de malloc, de free, de problème…

Et je persiste?: emploie gdb?! (c’est facile…)