begin process at 2012 02 11 01:10:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

OpenGL

 > 

Probleme avec filtre image en c


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme avec filtre image en c

jeudi 2 juillet 2009 à 17:46:39 | Probleme avec filtre image en c

simomiso

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..
jeudi 2 juillet 2009 à 18:59:52 | Re : Probleme avec filtre image en c

Chouchou182

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,
--
Chouchou.

vendredi 3 juillet 2009 à 02:13:09 | Re : Probleme avec filtre image en c

simomiso

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

vendredi 3 juillet 2009 à 09:53:44 | Re : Probleme avec filtre image en c

Chouchou182

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,
--
Chouchou.

Ps:
Que fait le fragment de code suivant ?
int ia = 0;
for ( i = 0 ; i < width ; i++ )
  for ( j = 0 ; j < height ; j++ )
    ia++;

Une multiplication. C'est bien d'un point de vue théorique de savoir que l'on peut faire ainsi cette opération, ou bien pour programmer en brainF**k. En C on écrit plutôt:
int ia;
for (ia = 0 ; ia < width * height ; ++ia) {}
Mais bon, ton compilateur rectifie peut-être tout seul...

vendredi 3 juillet 2009 à 11:31:14 | Re : Probleme avec filtre image en c

simomiso

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

dimanche 5 juillet 2009 à 21:51:03 | Re : Probleme avec filtre image en c

Chouchou182

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.)
--
Chouchou.



Cette discussion est classée dans : image, double, pixels, i1, filtre5


Répondre à ce message

Sujets en rapport avec ce message

extraction du contour d'une image BMP [ par juliette ] On a une image en noir et blanc et on souhaiterait extraire son contour.Les images sont sous le format BMP.Extraire le contour d'une image consiste à pixels en C ! [ par toto000 ] Bonjour,J'ai une image et je voudrai savoir comment récupérer les données de chaque pixel c'est-à-dire son taux de rouge, de vert et de bleu afin de r image gif dans un programme MFC [ par ventreapatte ] don't worry be happyJe réalise un programme MFC.Je voudrais parcourir une image au format Gif pixels par pixels et récupérer les coordonnées et 3 comp [GDI / GDI+ analyse de pixels] [ par lcprog ] Salut tout le monde!Alors si quelqu'un pouvait me sauver la vie, je bloque sur un problème depuis bientot 20h...j'utilise l'api gdi+je voudrai récupér Je sèche : types et pointeurs [ par benlustr ] Bonjour à tous, je galère depuis quelques temps pour essayer de comprendre un programme que je suis en train de revoir et d'améliorer. Actuellement, comment récupérer un tableau des pixels d'un System::Drawing::Image [ par rgiud ] Bonjour, Je développe un programme de traitement d'image et cherche à récupérer sous la forme d'une structure ou un buffer les pixels d'un System::Dr déplacement des pixels d'une image [ par mabrouka ] bonjour comment déplacer les pixels d'une imageMerci traitement d'image à l'aide de Cximage [ par yoben ] Bonjour,L'objectif de mon programme est de récupérer un tableau de pixels d'un fichier contenant une image à partir d'un emplacement quelconque du dis accés aux pixelx d'une image [ par noussagh ] Bonjour je sais pas si je suis dans le bon thème pour ma question.j'aimerai savoir comment accéder aux pixels de mon image qui a été chargée avec Op pixels d'une image couleur opencv [ par noussagh ] salut j'utilise opencv et j'aimerai savoir comment une image couleur est stockée dans la mémoire, est ce que c'est dans une matrice ? si c'est le cas


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales