IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Champs vectoriel d'une image (Traitement d'image)


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 26
    Points : 20
    Points
    20
    Par défaut Champs vectoriel d'une image (Traitement d'image)
    Bonsoir,

    Je dois faire le champ vectoriel d'une image, j'ai d'abord commencé par lisser l'image avec un filtre moyenneur, ensuite j'ai fait une segmentation par croissement de régions. Maintenant je dois faire un champ vectoriel de cette image.

    Le professeur m'a donné les étapes :

    Tout d'abord je choisis n'importe quel filtre gradient sur Gx et Gy de l'image segmenté (j'ai pris celui de Sobel)
    Ensuite je dois calculer un Gmx et un Gmy de chaque région segmenté. (Gmx = la moyenne des Gx/ cardinal de la région) ,(Gmy=la moyenne des Gy/ cardinal de la région).

    Pour avoir le trait dans l'image je dois calculer encore Gmx= Gmx/ racine de (Gmx au carré+ Gmy au carré). Gmy= Gmy/ racine de (Gmx au carré+ Gmy au carré)

    Il m'a dit que Gmx et Gmy doivent etre compris entre 0 et 1.

    Le problème c'est l'affichage...

    Move to(i,j) // chaque pixel de l'image voir avoir un trait par rapport à Gmx et Gmy

    Lineto(?,?) //il m'a dit de prendre les indices de Gmx et Gmy, or Gmx et Gmy sont des valeurs

    Que faire s'il vous plait? c'est urgent et je ne sais plus quoi penser...

  2. #2
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Bonjour,

    Oula, ça sent les maths à plein nez tout ça, ça va être dur

    En fait je te conseille d'essayer de représenter de manière simple tes espaces de départs et d'arrivée.
    Tu as un espace de départ 2D (x,y), auquel tu appliques une série de fonctions f(x,y) g(x,y) etc. si tu préfères tu fais un h(g(f(x,y)), avec à chaque fois une association d'éléments de l'espace d'arrivée de manière involutive la plupart du temps (exemple du moyennage) ou pas (exemple de la compression JPG ).

    A l'arrivée, tu auras quoi qu'il arrive un espace 2D composé de 3 nombres entre 0 et 255 chacun ( donc entre 0 et 16M ) Edit : bien sur je pars d'un format standard RGB 24bits type Targa Truevision TGA ou équivalent BMP etc.

    Il faudrait que tu nous donnes le détail du calcul de ton Gx Gy mais ton Gmx ça ressemble, sauf erreur de ma part j'ai pas regardé plus que ça, au calcul du cosinus d'un angle ton truc à première vue, donc entre 0 et 1 je te confirme (avec gmx>0).

    Si c'est ton espace d'arrivé soit tu vas avoir une image complètement noire, soit tu dois convertir le 0 à 1 en 0 vers 255, je suppose que c'est ça donc multiplie par 255 et terminé.
    [ A moins que tu ne veuilles afficher l'angle sous forme de flèche ( vecteur ) auquel cas tu dois faire un cos-1(Gmx) et sin-1(Gmy)? et afficher graphiquement une flèche à la place de ton pixel ? ]

    Mais bon, c'est spéculatif ce que je te dis, il faudrait tout de même un peu plus de détails ( un peu de code surtout ) pour t'en dire plus, et savoir ce que veux-tu vraiment effectuer comme filtrage, dans quel but etc?
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse ! En faite, le but est de transformer une image 2D en une image non-photo réaliste (qui ressemble le plus possible à un dessin).

    L'image est en niveau de gris, j'ai appliqué le filtre moyenneur dessus, puis j'ai fais une segmentation par croissement de régions. Maintenant je dois faire un champs vectoriel de tout ça...pour ta question, ce sont des traits qui n'ont pas de flèches(sans orientation donc) , le professeur m'a dit que je pouvais tout aussi bien faire des ellipses, mais je préfère faire des lignes (ça me parait moins compliqué). Avec les traits obtenus je pourrai transformer ça en un dessin ( rendre certains traits plus épais que d'autres pour former le dessin).

    Question code maintenant ! :

    Ici j'ai calculé le masque de Sobel pour chaque régions de l'image (la matrice mat_moy contient les régions segmentés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int y=1; y<255; y++)
     {
     for(int x=1; x<255; x++)
     {
    Gx[x][y] = (int)(((mat_moy[x+1][y-1]-mat_moy[x-1][y-1]) + 2 * (mat_moy[x+1][y]-mat_moy[x-1][y]) + (mat_moy[x+1][y+1]-mat_moy[x-1][y+1]))/4);
    Gy[x][y] = (int)(((mat_moy[x-1][y+1]-mat_moy[x-1][y-1]) + 2 * (mat_moy[x][y+1]-mat_moy[x][y-1]) + (mat_moy[x+1][y+1]-mat_moy[x+1][y-1]))/4);
    Puis, j'ai déclaré le matrice Gmxy (qui va contenir la moyenne de Gx et de Gy)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     int **Gmxy;
     Gmxy = new int*[Nouvelle_Region-1]; // Nouvelle_Region m'a servi  à compter le nombre de classes, ce sont ici les lignes de Gmxy
     for(int i=0; i<Nouvelle_Region-1; i++)
     Gmxy[i] = new int[2]; // Les colonnes de Gmxy
    Puis, ici je compte le la somme de Gmx et la somme de Gmy ainsi que le cardinal (compteur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     for(int a=0; a<Nouvelle_Region-1; a++)
     {
     int Gmx = 0, Gmy = 0, GmxCompt = 0;
     for(int i=0; i<256; i++)
     {
     for(int j=0; j<256; j++)
     {
            if(Regions[i][j] == a)
            {
            Gmx += Gx[i][j];
            Gmy += Gy[i][j];
            GmxCompt++;
            }//Fin IF
     }//Fin boucle j
     }//Fin boucle i
     Gmxy[a][0] = (int)(Gmx/GmxCompt);
     Gmxy[a][1] = (int)(Gmy/GmxCompt);
    Et là j'affiche tout ça avec le move to et le lineto , pour chaque pixel de l'image, il va y avoir le trait en fonction de GMxy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Form2->Show();
     Form2->Canvas->Pen->Color = clBlue;
     for(int a=0; a<Nouvelle_Region-1; a++)
     {
     for(int i=0; i<256; i++)
     {
     for(int j=0; j<256; j++)
     {
            if(Regions[i][j] == a) // la matrice régions contient les classes de la ségmentation
            {
             Form2->Image1->Canvas->MoveTo(i,j);
             Form2->Image1->Canvas->LineTo(Gmxy[a][0],Gmxy[a][1]);
            }//Fin IF
    Sauf que l'image est noir...si j'arrete l'incrémentation jusqu'à 10, on peut voir des lignes noir mais rien avoir avec le champ vectoriel

    Merci de m'aider...

Discussions similaires

  1. [Traitement d'image] Aligner des images horizontales & verticales.
    Par Him dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 31/03/2008, 12h56
  2. [Traitement d'image] Redimensionner des images
    Par mireilleturrel dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 15/05/2006, 11h24
  3. [MySQL] Afficher une image d'un champ blob d'une base MySQL
    Par lolobedo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/11/2005, 10h10
  4. [Traitement d'image] halo de lumière incrusté dans une image
    Par cyber_N dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 17/06/2005, 15h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo