Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3342 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  à laide svp!!! exo sur C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

à laide svp!!! exo sur C++

n°1439750
sadrine_gu​illerme
Posté le 10-09-2006 à 16:24:44  profilanswer
 

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 !

mood
Publicité
Posté le 10-09-2006 à 16:24:44  profilanswer
 

n°1439757
nargy
Posté le 10-09-2006 à 16:54:40  profilanswer
 

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
n°1439855
sadrine_gu​illerme
Posté le 10-09-2006 à 21:40:16  profilanswer
 

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

n°1439858
nargy
Posté le 10-09-2006 à 21:43:28  profilanswer
 

C'est à dire?

n°1439873
nargy
Posté le 10-09-2006 à 22:00:26  profilanswer
 

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

n°1439878
sadrine_gu​illerme
Posté le 10-09-2006 à 22:08:29  profilanswer
 

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

n°1439880
sadrine_gu​illerme
Posté le 10-09-2006 à 22:09:48  profilanswer
 

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

n°1439881
sadrine_gu​illerme
Posté le 10-09-2006 à 22:10:52  profilanswer
 

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" );
}
*/

n°1439891
nargy
Posté le 10-09-2006 à 22:27:10  profilanswer
 

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.

n°1439896
sadrine_gu​illerme
Posté le 10-09-2006 à 22:54:10  profilanswer
 

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

mood
Publicité
Posté le 10-09-2006 à 22:54:10  profilanswer
 

n°1439897
nargy
Posté le 10-09-2006 à 23:01:30  profilanswer
 

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

n°1439898
nargy
Posté le 10-09-2006 à 23:02:37  profilanswer
 

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

n°1439901
sadrine_gu​illerme
Posté le 10-09-2006 à 23:16:25  profilanswer
 

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

n°1439903
nargy
Posté le 10-09-2006 à 23:21:04  profilanswer
 

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
n°1439905
sadrine_gu​illerme
Posté le 10-09-2006 à 23:27:44  profilanswer
 

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

n°1439911
nargy
Posté le 10-09-2006 à 23:45:47  profilanswer
 

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
n°1439913
el muchach​o
Comfortably Numb
Posté le 10-09-2006 à 23:50:14  profilanswer
 

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


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1439915
apprentitu​x
Posté le 10-09-2006 à 23:53:48  profilanswer
 

clair !
Elle abuse trop sardine !

n°1439917
nargy
Posté le 10-09-2006 à 23:55:31  profilanswer
 

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.

n°1439918
nargy
Posté le 10-09-2006 à 23:56:08  profilanswer
 

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

n°1439920
sadrine_gu​illerme
Posté le 11-09-2006 à 01:06:30  profilanswer
 

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!

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  à laide svp!!! exo sur C++

 

Sujets relatifs
implementation de files a laide de pile[php/SQL] ajouter des enregistrement a laide d'une textarea
laide je cherche le crack de billpro 5.31 
Plus de sujets relatifs à : à laide svp!!! exo sur C++


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)