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

Langage Delphi Discussion :

Recherche dans une image


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de aliwassem
    Inscrit en
    Janvier 2004
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 293
    Points : 157
    Points
    157
    Par défaut Recherche dans une image


    comment je peut prendre les cordonnes d'un point dans une image comme l'image attachee?

    par example si j'ai un image de 10 *10 cm et il y a 30 points dans cette image est ce que je peut lister les corrdonnes de ces points ?


    d'avance
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Avec ScanLine, tu analyses point par point les pixels, et si tu connais la couleur du point, tu peux donc récupérer sa coordonnées ... après si ton point doit faire plusieurs pixels, avec une petite formule de pythagore, tu peux analyser tous les pixels à proximité et vérifier si ils sont tous de la bonne couleur ... c'est du traitement d'image, tu as des algos qui existe pour cela genre l'analyse de contour, j'avais fait cela à l'école, j'ai perdu ces sources, et c'est bien dommage, car je n'ai plus les supports de cours papiers non plus ...

    C'est beaucoup utilisé dans la reconnaissance de caractère (OCR), les stylo numériques, les pages tramées uniques, ... (technologie brevetée par ANOTO)

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Euh je ne suis pas sûr d'avoir bien compris ton histoire de points mais si tu veux accéder à tout les pixels de ton image tu peux, en partant du TPicture tu accède à la propriété Bitmap à partir de ce dernier tu accède au Canvas et là le Canvas possède la propriété Pixel qui est en fait un tableau de deux dimensions contenant la couleur du pixel.

    Edit : ha ben finalement y'a plus court pour accéder au tableau de pixel visiblement

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Attention, la propriété Pixels est plus lente que ScanLine ... voir ICI ou LA

  5. #5
    Membre habitué Avatar de aliwassem
    Inscrit en
    Janvier 2004
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 293
    Points : 157
    Points
    157
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Avec ScanLine, tu analyses point par point les pixels, et si tu connais la couleur du point, tu peux donc récupérer sa coordonnées ... après si ton point doit faire plusieurs pixels, avec une petite formule de pythagore, tu peux analyser tous les pixels à proximité et vérifier si ils sont tous de la bonne couleur ... c'est du traitement d'image, tu as des algos qui existe pour cela genre l'analyse de contour, j'avais fait cela à l'école, j'ai perdu ces sources, et c'est bien dommage, car je n'ai plus les supports de cours papiers non plus ...

    C'est beaucoup utilisé dans la reconnaissance de caractère (OCR), les stylo numériques, les pages tramées uniques, ... (technologie brevetée par ANOTO)


    alors ca si les points ont une couleur mais par example si il y a des des autres objects ont les couleurs comme les couleurs des points..

    aussi
    Images attachées Images attachées  

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    C'est pour cela que je parlais ensuite de faire test des pixels à proximité, pour savoir si c'est un point ou une zone de couleur ...

    et j'en reviens à l'analyse du contour qui fera la différence entre des zones et de points isolés ...

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Dans l'image attachée au message d'Aliwassem d'Hier, 16h02 le "point" central est blanc et comporte 16 Pixels disposés en croix dans un rectangle de 5x4 Pixels il est donc possible de balayer les ScanLines pour actualiser une Mire de 5x5 cases dans laquelle on compte le nombre de pixels "blancs":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type      TMire     = record                           
                           M : array[-2..2,-2..2] of byte; 
                           S : byte;  // S = nombre de points "blancs" dans la Mire                   
                          end;
    et l'on s'arrête lorsque le nombre de points blancs est égal à 16 que les "0" et les "1" dans la Mire sont bien disposés en forme de croix.

    Et voiçi un exemple de code qui balaye un BitMap via ScanLine pour actualiser une Mire de 3x3 cases utilisée pour la reconnaissance de trajectoires épaisses d'1 pixel et de couleur jaune, donc à modifier pour le cas de la Mire de 5x5 cases qui cherche un agrégat de "points" blancs :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    const     MaxPixelCount   = 50001; //<à augmenter si besoin est
     
    type      ppRGBArray  =  ^tTRGBArray;
              tTRGBArray  =  ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
     
    var        M : TMire;
     
    function  LisScanlinesVersMire(bmp : TBitMap; xc,yc : integer) : TMire;
    //        Il faut que le BitMap soit déclaré au préalable en PixelFormat:=pf24bit par exemple dès le chargement du Bmp
    //        xc et yc = coordonnées du centre de la Mire déplaçable
    var       Ligne : ppRGBArray;
              co,li,h,w : integer;
              cl    : TColor;
    begin     for co:=-1 to 1 do for li:=-1 to 1 do Result.M[co,li]:=0;
              Result.S:=0;
              with bmp do
              begin h:=bmp.height; w:=bmp.width;
                    for li:=-1 to 1 do
                    begin if (yc+li>=0) and (yc+li<=h-1) then
                          begin Ligne := ScanLine[yc+li];
                                for co:=-1 to 1 do
                                begin if (xc+co>=0) and (xc+co<=w-1) then
                                      begin with Ligne[xc+co] do
                                            begin cl:=RGB(rgbtRed,rgbtGreen,rgbtBlue);
                                                  if cl=clYellow then
                                                  begin Result.M[co,li]:=1;
                                                        inc(Result.S);
                                                  end;
                                            end;
                                      end; //if (xc
                                end; // for co
                          end; // if (yc
                    end; // for li
              end; // with bmp
    end; // LisScanlinesVersMire
    ... suffit d'ajouter ensuite une routine avec deux boucles imbriquées pour parcourir le Bmp et actualiser la Mire M:=LisScanlinesVersMire(bmp,X.Y) until (M.S=16) and (M.M[co,li]=1) and (M.M[i,j]) etc ... jusqu'à ce que les cases de la Mire coincident avec la croix qui forme le "point" recherché.

    ... bien entendu il faut avant tout créer le BitMap pf24bit à partir du fichier *.Gif

    A+

Discussions similaires

  1. Recherche dans une image
    Par lampard158 dans le forum 2D
    Réponses: 4
    Dernier message: 25/10/2010, 10h37
  2. recherche de points dans une image
    Par Clemsouille dans le forum Images
    Réponses: 4
    Dernier message: 26/05/2008, 14h38
  3. Réponses: 5
    Dernier message: 25/04/2008, 19h15
  4. Recherche d'une zone uniforme dans une image
    Par mm2405 dans le forum Traitement d'images
    Réponses: 14
    Dernier message: 26/04/2007, 14h23
  5. Recherche d'un motif dans une image ?
    Par MonsieurAk dans le forum Windows
    Réponses: 1
    Dernier message: 17/06/2006, 11h39

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