begin process at 2010 02 10 12:55:42
  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 Conversion image BMP [ par emrod ] Salut, j'aimerais convertir une image BMP 16 bits en image BMP 24 bits, est-ce qu'il existe une fonction ou un programme pour faire ça ?En fait, j'ai affichage d'images par une fonction [ par Dr_zoidberg ] Bonjour, Je cherche à créer une fonction permettant d'afficher une image dans un "drawingarea" mais sans devoir faire appel à un expose_event. Le but


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,452 sec (3)

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