à laide svp!!! exo sur C++

à laide svp!!! exo sur C++ - C++ - Programmation

Marsh Posté le 10-09-2006 à 16:24:44    

bonjour  
je voulais savoir s'il y aurait quelqu'un qui pourrais m'aider a faire un petit programme de remplissage d'une région avec C++  
Je souhaite donc écrire un programme permettant de remplir une région délimitée.
Pour manipuler les images, vous utiliserez le module image composé des fichiers image.h et image.cpp  
 
Le programme doit :  
– Ouvrir l’image de départ  
– Demander à l’utilisateur de saisir les coordonnées (x,y) du point de départ  
– Appliquer la procédure qui colore en gris les pixels à partir du point de départ  
– Enregistrer l’image obtenue  
 
y aura donc t il quelqu'un pour m'aider svp ???  
Je poste image.h et image.cpp ainsi que l'image de départ à votre demande;
Merci d'avance !

Reply

Marsh Posté le 10-09-2006 à 16:24:44   

Reply

Marsh Posté le 10-09-2006 à 16:54:40    

Voici un code, pourri et rafistolé, au passage, mais qui fonctionne:

Code :
  1. void Image24::region_h_rec(unsigned int x0,
  2.                                   unsigned int y0,
  3.                                   UInt8 threshold,
  4.                                   RGB24 c0,
  5.                                   Image32& res) const
  6. {
  7.   unsigned int _xmin; // position horizontale minimum
  8.   unsigned int xmax; // position horizontale max
  9.   // parcourrir les pixels à droite
  10.   for(xmax=x0+1; xmax<dx; xmax++)
  11.   {
  12.     RGB24 c=data[xmax+y0*dx];
  13.     if(c.delta(c0)>threshold) { xmax--; break; } // arrêter le parcours quand delta>threshold
  14.     RGBA32& r=res(xmax, y0); // lire le pixel de l'image résultat
  15.     if(r.a()!=0) { xmax--; break; } // si le pixel n'est pas transparent arrêter le parcours
  16.     r=c; // ranger le pixel (non transparent) dans l'image résultat
  17.   }
  18.   int xmin=0; // cas où il n'y a pas de pixels à gauche
  19.   if(x0>0) // s'il y a des pixels à gauche de celui de départ
  20.   { // parcourrir de la même manière à gauche
  21.     for(xmin=x0-1; xmin>=0; xmin--)
  22.     {
  23.       RGB24 c=data[xmin+dx*y0];
  24.       if(c.delta(c0)>threshold) break;
  25.       RGBA32& r=res(xmin,y0);
  26.       if(r.a()!=0) break;
  27.       r=c;
  28.     }
  29.     xmin++;
  30.   }
  31.   _xmin=xmin; // garder la coordonnée la plus à gauche
  32.   if(_xmin!=xmax) // si on a trouvé des pixels sur la bande horizontale
  33.   { // pour chacun des pixels de couleur proche trouvé, faire un parcours vertical
  34.     for(unsigned int x0=_xmin;x0<xmax;x0++)
  35.     {
  36.       region_v_rec(x0,
  37.                    y0,
  38.                    threshold,
  39.                    c0,
  40.                    res);
  41.     }
  42.   }
  43. }
  44. // le parcours vertical est symétrique au parcours horizontal
  45. void Image24::region_v_rec(unsigned int x0,
  46.                                   unsigned int y0,
  47.                                   UInt8 threshold,
  48.                                   RGB24 c0,
  49.                                   Image32& res) const
  50. {
  51.   unsigned int _ymin;
  52.   unsigned int ymax;
  53.   for(ymax=y0+1; ymax<dy; ymax++)
  54.   {
  55.     RGB24 c=data[ymax*dx+x0];
  56.     if(c.delta(c0)>threshold) { ymax--; break; }
  57.     RGBA32& r=res(x0,ymax);
  58.     if(r.a()!=0)  { ymax--; break; }
  59.     r=c;
  60.   }
  61.   int ymin=0;
  62.   if(y0>0)
  63.   {
  64.     for(ymin=y0-1; ymin>=0; ymin--)
  65.     {
  66.       RGB24 c=data[ymin*dx+x0];
  67.       if(c.delta(c0)>threshold) break;
  68.       RGBA32& r=res(x0,ymin);
  69.       if(r.a()!=0) break;
  70.       r=c;
  71.     }
  72.     ymin++;
  73.   }
  74.   _ymin=ymin;
  75.   if(_ymin!=ymax)
  76.   {
  77.     for(unsigned int y0=_ymin;y0<ymax;y0++)
  78.     {
  79.       region_h_rec(x0,
  80.                    y0,
  81.                    threshold,
  82.                    c0,
  83.                    res);
  84.     }
  85.   }
  86. }
  87. Image32* Image24::region(unsigned int x0,
  88.                                 unsigned int y0,
  89.                                 UInt8 threshold) const
  90. {
  91.   // une nouvelle image résultat
  92.   Image32& res=*new Image32(dx, dy);
  93.   res.clear(0); // effacer l'image
  94.   RGB24 c0=data[y0*dx+x0]; // prendre la couleur au point x0, y0
  95.   // parcours récursif
  96.   region_h_rec(x0, y0, // à partir de cette position
  97.                threshold, // avec un delta maximum
  98.                c0, // par rapport à la couleur de départ
  99.                res); // et copier le résultat dans res
  100.   return &res;
  101. }


Le fonctionnement est simple: region fait appel récursivement et alternativement à region_horizontal et region_vertical. Ça ne fonctionne pas sur 1 seul pixel (car je nen avais pas besoin) donc il faut ajouter ce cas à la fonction region.
 
Il faut que tu ladapte puisque il prend en entrée une ImageRGB24 et renvoie une ImageRGBA32. La structure est la même dans les deux cas: data contient les pixels de gauche à droite et de haut en bas, et dx et dy sont les largeurs et hauteurs des images.
 
La fonction delta sur les couleurs RGB:

Code :
  1. inline UInt8 delta(const RGB24 other) const
  2.   {
  3.     Int16 d=_b-other._b; if(d<0) d=-d;
  4.     Int16 dmax=_g-other._g; if(dmax<0) dmax=-dmax;
  5.     if(d<dmax) d=dmax;
  6.     dmax=_r-other._r; if(dmax<0) dmax=-dmax;
  7.     if(d<dmax) d=dmax;
  8.     return (UInt8)d;
  9.   }


Avec Int8=char, Int16=short, Int32=int, UInt8=unsigned char, etc..
La fonction delta calcule: max(abs(r1-r2),abs(g1-g2),abs(b1-b2))
La fonction region copie dans une ImageRGBA32 les pixels adjacents dont le delta est inférieur au paramètre threshold.
 
Edit: jai honte de poster un code aussi crade, mais bon, si ça peut aider au moins sur le principe.


Message édité par nargy le 10-09-2006 à 21:59:17
Reply

Marsh Posté le 10-09-2006 à 21:40:16    

Merci beaucoup pour votre réponse déja je suis désolé paske je viens de voir votre message j'etais pas la donc je sais pas si t encore la j'ai besoin que tu m'explique encore plus stp? Merci beaucoup d'avance

Reply

Marsh Posté le 10-09-2006 à 21:43:28    

C'est à dire?

Reply

Marsh Posté le 10-09-2006 à 22:00:26    

J'ai commenté le code et corrigé un bug sur les pixels les plus à droite et les plus en bas.

Reply

Marsh Posté le 10-09-2006 à 22:08:29    

je te montre déjà le fichier image.h et image.cpp que j'ai comme données et je veux bien poster l'image de départ mais je n sais pas comment faire pour attacher un fichier sur ce forum
Bien merci

Reply

Marsh Posté le 10-09-2006 à 22:09:48    

image.h
#ifndef IMAGE_H
#define IMAGE_H
 
#define COTE_MAX 1000
#define NIVEAU_GRIS_MAX 2
 
#define NOIR 0
#define GRIS 1
#define BLANC 2
 
/* Module de manipulation des images de labyrinthes
   - Les pixels de l'image sont des entiers correspondant a des  
     niveaux de gris (voir definitions ci-dessus)
   - on accede a un pixel par image->mat[colonne][ligne]
     avec colonne compris entre 0 et (image->largeur - 1)
     et ligne compris entre 0 et (image->hauteur - 1)
   - Le pixel [0][0] est le pixel en haut a gauche
   - Exemple d'utilisation :
        image im;
 imageOuvrir(im, "maze.pgm" );
 im->mat[colonne][ligne] = BLANC;
 imageEnregistrerSous(im, "copiemaze.pgm" );
*/
 
struct Image {
  int mat[COTE_MAX][COTE_MAX];
  int hauteur, largeur;
};
typedef struct Image *image;
 
/* Opérations */
void imageOuvrir          (image &, char *nom);
void imageEnregistrerSous (image, char *);
void imageCopier          (image, image & );
 
#endif

Reply

Marsh Posté le 10-09-2006 à 22:10:52    

image.cpp
#include <cstdio>
#include <cassert>
 
#include "image.h"
 
void imageOuvrir (image &im, char *nom)
{
  FILE *pgm;
  int dummy, i, j;
 
  im = new Image;
  assert(im);
  pgm = fopen(nom, "r" );
  assert(pgm);
 
  // Lecture de 'P2'
  fscanf(pgm, "%c", &dummy);
  fscanf(pgm, "%c", &dummy);
 
  // Lecture de largeur, hauteur, et niveau gris max
  fscanf(pgm, "%d", &(im->largeur));
  assert((im->largeur>0)&&(im->largeur<=COTE_MAX));
  fscanf(pgm, "%d", &(im->hauteur));
  assert((im->hauteur>0)&&(im->largeur<=COTE_MAX));
  fscanf(pgm, "%d", &dummy);
   
  // Stockage dans la matrice
  for (j = 0; j < im->hauteur; j++)
    for (i = 0; i < im->largeur; i++)
      fscanf(pgm, "%d", &(im->mat[i][j]));
 
  fclose(pgm);
}
 
void imageEnregistrerSous (image im, char *nom)
{
  FILE *pgm;
  int i, j;
 
  pgm = fopen(nom, "w" );
  assert(pgm);
 
  fprintf(pgm, "P2\n" );
  fprintf(pgm, "%d %d\n", im->largeur, im->hauteur);
  fprintf(pgm, "%d\n", NIVEAU_GRIS_MAX);
 
  for (j = 0; j < im->hauteur; j++) {
    for (i = 0; i < im->largeur; i++)
      fprintf(pgm, "%d ", im->mat[i][j]);
    fprintf(pgm, "\n" );
  }
 
  fclose(pgm);
}
 
void imageCopier(image im, image &copie) {
  int i, j;
 
  copie = new Image;
  copie->hauteur = im->hauteur;
  copie->largeur = im->largeur;
  for (j = 0; j < im->hauteur; j++)  
    for (i = 0; i < im->largeur; i++)
      copie->mat[i][j] = im->mat[i][j];
}
 
/*
int main() {
  image im, im2;
  imageOuvrir(im, "maze8.pgm" );
  imageCopier(im, im2);
  imageEnregistrerSous(im2, "copiemaze.pgm" );
}
*/

Reply

Marsh Posté le 10-09-2006 à 22:27:10    

mouais...
L'image de départ n'a pas d'importance. Essaye de comprendre comment le code que j'ai posté fonctionne.
Tu peut le réutiliser en simplifiant puisque tu n'a pas besoin de détection de couleur complexe mais uniquement de vérifier si les pixels sont exactement de même couleur.
Puis poste ton code si tu as des problèmes.

Reply

Marsh Posté le 10-09-2006 à 22:54:10    

pourriez vous m'expliquer la 1ere ligne pourquoi vous avez mis unsigned?

Reply

Marsh Posté le 10-09-2006 à 22:54:10   

Reply

Marsh Posté le 10-09-2006 à 23:01:30    

olala ça va être dur...
unsigned int: un entier non signé, soit positif ou nul
celà représente une coordonnée dans l'image.

Reply

Marsh Posté le 10-09-2006 à 23:02:37    

commence par regarder la dernière fonction region().

Reply

Marsh Posté le 10-09-2006 à 23:16:25    

Ah bon d'accord!
c ok
mais pour inline ? elle signifie quoi? on doit vraiment le dire (je suis débutante :$)

Reply

Marsh Posté le 10-09-2006 à 23:21:04    

laisse tomber inline. c'est pas important pour les trois fonctions region.., et la fonction delta ne te servira pas (c'est pour la couleur).


Message édité par nargy le 10-09-2006 à 23:21:20
Reply

Marsh Posté le 10-09-2006 à 23:27:44    

le truc c ke je trouve des delats partout tu pourrais me donner la version finale stp?

Reply

Marsh Posté le 10-09-2006 à 23:45:47    

En deuxième, regarde la fonction region_h_rec, elle est commentée. remplace couleur1.delta(couleur0)>threshold par mat[x][y]!=c0. Au lieu d'utiliser la transparence pour marquer les pixels déjà parcourrus, utilise la couleur GRIS.


Message édité par nargy le 10-09-2006 à 23:46:43
Reply

Marsh Posté le 10-09-2006 à 23:50:14    

La résolution d"exercices est prohibée.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 10-09-2006 à 23:53:48    

clair !
Elle abuse trop sardine !

Reply

Marsh Posté le 10-09-2006 à 23:55:31    

L'algorithme commence au point indiqué x0,y0.
Puis, il parcours horizontalement, à gauche puis à droite, à la recherche d'un pixel de couleur différent de celui de départ. Il note les coordonnées horizontales xmin et xmax, la ligne de pixel horizontale entre ces coordonnées ont la même couleur.
Pour chacun de ces nouveaux pixels, il parcours verticalement suivant le même principe, etc.. tant qu'une ligne horizontale n'est pas vide (xmin!=xmax), ou qu'une ligne verticale n'est pas vide il continue alternativement horizontalement puis verticalement. Enfin, il colorie tous les pixels trouvés en GRIS.

Reply

Marsh Posté le 10-09-2006 à 23:56:08    

ouais, de toutes façon ell va devoir se débrouiller parceque je vais y aller.

Reply

Marsh Posté le 11-09-2006 à 01:06:30    

bom bah merci bcp pour ton aide nargy :) c très gentil de ta part g du temps devant moi pour mieux affiner ma recherche:) bonne nuit!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed