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 :

Connectivité pour délimiter des formes sur une photo


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Connectivité pour délimiter des formes sur une photo
    Bonjour,

    Je dois délimiter une forme sur une photo, soit joindre les pixels "identiques" entre eux. L'utilisation de boucles et de if semble compliquée et surtout si la forme prend une allure etrange des bouts risquent d'être coupé. Quant a une fonction qui s'appelle elle même, ca demande trop de ressource pour mon pauvre petit ordi
    Quelqu'un aurait une idée??
    Merci d'avance.

    PS: J'ai oublié de préciser que l'intensité de chaque pixels était déja placé dans une matrice...

  2. #2
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Bonjour,

    Peux-tu être plus précis pour que les forumeurs peuvent t'aider car ton problème est intéressant mais pas très clair !

    Ok !
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    C vrai que ce n'est pas clair, mais car ce n'est pas evident a expliquer...hmmm...
    Imaginons une image en 2 couleurs: noir et blanc, chaque valeur de chaque pixel est ds une matrice booléenne définie préalablement (blanc=true;noir=false). Ce que je cherche c delimiter la plus grosse forme en blanc, et éliminer les autres pixels blancs sur l'image, d'ou une fonction de connectivité. Jusqu'a present ce que je fais c'est dertermier le centre de masse de tous les pixels blancs, en toute logique, il se trouvera sur la plus grosse forme blanche, puis de ce centre de masse je regarde ts ses voisins blancs...
    Le bout de programme donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Centre_Masse_Bin(xcm,ycm,ppgus);
     
            if (xcm!=0||ycm!=0){
                    try { 
                            Application->ProcessMessages();
                            Conectivité(ppgus,aux2Bin,xcm+3,ycm+3,xcm,pixelsX-1,ycm,pixelsY-1);
                            Conectivité(ppgus,aux2Bin,xcm+3,ycm-3,xcm-1,pixelsX-1,1,ycm-1);
                            Conectivité(ppgus,aux2Bin,xcm-3,ycm+3,1,xcm-1,ycm+1,pixelsY-1);
                            Conectivité(ppgus,aux2Bin,xcm-3,ycm-3,1,xcm-1,1,ycm-1);
                       }
    aux2Bin est une matrice de passage
    et ppgus la matrice booleenne initiale, pixelsX et pixelsY les bouts de notre image, xcm et ycm les coordonées du centre de gravité

    Et enfin la connectivité se calcule ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void TForm1::Conectivité(bool **entré,bool **sortie,int x, int y, int xinf, int xsup, int yinf,int ysup)
    {
      if ((entré[x][y]) && (!sortie[x][y]))
      {
        sortie[x][y] = true;
        if (y > yinf-1) Conectivité(entré,sortie,x,y-1,xinf,xsup,yinf,ysup);
        if (y < ysup+1) Conectivité(entré,sortie,x,y+1,xinf,xsup,yinf,ysup);
        if (x > xinf-1) Conectivité(entré,sortie,x-1,y,xinf,xsup,yinf,ysup);
        if (x < xsup+1) Conectivité(entré,sortie,x+1,y,xinf,xsup,yinf,ysup);
     
      }

    Ce qui marche tres bien jusqu'a ce qu'il y ait trop de pixels blancs...
    Comme la fonction se rappelle toujours elle meme, l'ordi sature
    L'image est deja decoupé en 4 cuadrants, recoupée encore en deux (2*4=8!!) ca fonctionne, mais je me demandais s'il y avait plus simple, sans être obligé d'étudier mini bouts par mini bouts...
    et autre probleme: si le centre de gravité est noir et qquns de ses voisins aussi... nooooooooooooo!! la fonction connectivité se retourve I-NU-TI-LE!!
    J'espere que cette fois c claire mais g dû mal parfois, donc dsl!!

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/10/2012, 08h49
  2. digitalisation des chiffres ( sur une photo)
    Par Lebryanjames dans le forum Visual Studio
    Réponses: 0
    Dernier message: 19/04/2011, 14h15
  3. Macro pour grouper des lignes sur une plage qui peut varier
    Par RichRich59 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/01/2011, 13h04
  4. Macro pour grouper des lignes sur une plage qui peut varier
    Par girardinho dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/07/2010, 09h43
  5. Créer des ballons sur une photo
    Par flamel dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/03/2007, 15h01

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