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

Images Discussion :

Cercle pour image processing


Sujet :

Images

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut Cercle pour image processing
    Bonsoir,

    J'aurais besoin d'un petit conseil;
    Je dois "nettoyer" une image en y appliquant un cercle et en effaçant tout ce qui y est a l'extérieur.
    Mais j'ai un peu de mal avec les cercles, quelqu'un pourrait-il me dire si il existe une fonction déjà toute faite pour ça, ou comment faire ?
    Je ne me souviens plus comment appliquer un cercle.
    Mon algo serait le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Pour tous les points X de mon image
         Pour tous les points Y de mon image
              Si on est a l'intérieur du cercle
                   Copier la valeur de l'ancienne image dans la nouvelle
              Sinon (Si on est à l'extérieur du cercle)
                   La valeur de la nouvelle image sera 0
              fin si
         fin pour Y
    fin pour X
    Mon problème c'est le SI on est a l'intérieur du cercle.
    Je connais le rayon du cercle, et aussi son centre.

    Merci beaucoup
    Thomas

  2. #2
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    tu regardes si la distance euclidienne de ton point au centre du cercle est inferieure au rayon.
    distance euclidienne + sqrt(dx*dx+dy*dy), avec dx et dy les differences de coordonnnees en x et y.

    je crois pas qu'il y ait de fct toute faite, tu peut regarder 'strel' qui te genere un element structurant, mais tu auras surement un peu d'emballage a faire.

    A+

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Je vais essayer de faire ca, merci.
    Si j'ai des soucis je reviens ;-)

    Merci encore
    Thomas

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Si ca peut aider quelqu'un, voici ma solution, elle est extrèmement simple et fonctionne parfaitement:
    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
     
    function TestCircle
        Radius=500;
        A=500;
        B=500;
        for y=1:1000
            for x=1:1000
                CircleEquation=sqrt(((x-A)^2)+((y-B)^2));
                if(CircleEquation>Radius)
                    NewImage(y,x)=0;
                else
                    NewImage(y,x)=255;
                end
            end
        end
        figure(1)
        colormap('gray');
        imshow(NewImage);
     
    end
    Celle-ci permet déterminer les points a l'intérieur du cercle de ceux a l'extérieur.

    Bye
    THomas

  5. #5
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    merci pour ton programme, juste une remarque si je peux me permettre, l'executer tel quel met 22 secondes sur ma machine, en préallouant la mémoire j'arrive à aller 100 fois plus vite , environ 0.2 secondes

    juste avant ta boucle for j'ecris:
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  6. #6
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    on peut aussi vectoriser le code :
    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
     
     
    % nb de points dans chaque direction
    Nx=1000;
    Ny=1000;
    A=500; B=500;R=500;
     
    % vecteur de coordonnees dans caque directions
    lx = 1:Nx;
    ly = 1:Ny;
     
    % matrice des coordonnees de chaque pixel, centree sur le cercle
    x = repmat(reshape(lx, [1 Nx]), [Ny 1]) - A;
    y = repmat(reshape(ly, [Ny 1]), [1 Nx]) - B;
     
    % on cree une image binaire comme resultat d'une operation de comparaison
    img = (x*x+y*y)<R*R;
    Par contre attention, c'est plus gourmand en memoire...

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par tug83
    merci pour ton programme, juste une remarque si je peux me permettre, l'executer tel quel met 22 secondes sur ma machine, en préallouant la mémoire j'arrive à aller 100 fois plus vite , environ 0.2 secondes

    juste avant ta boucle for j'ecris:
    Merci pour le conseil, je ne savais pas le fait de ne pas définir la taille de la matrice pouvait tellement ralentir le temps d'éxécution.
    Je te remercie, je vais peut etre pouvoir gagner pas mal de temps sur mes scripts, je n'initialise que très rarement la taille des tableaux.
    Simplement parce que comme ca je suis sur d'avoir la matrice la plus petite possible.

    Merci pour le tuyau ;-)

  8. #8
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    tu pourrais regarder la note technique suivante pour comprendre l'importance de la préallocation:
    http://www.mathworks.fr/support/solu...lution=1-18150
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par totoc1001
    Si ca peut aider quelqu'un, voici ma solution, elle est extrèmement simple et fonctionne parfaitement:
    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
     
    function TestCircle
        Radius=500;
        A=500;
        B=500;
        for y=1:1000
            for x=1:1000
                CircleEquation=sqrt(((x-A)^2)+((y-B)^2));
                if(CircleEquation>Radius)
                    NewImage(y,x)=0;
                else
                    NewImage(y,x)=255;
                end
            end
        end
        figure(1)
        colormap('gray');
        imshow(NewImage);
     
    end
    Celle-ci permet déterminer les points a l'intérieur du cercle de ceux a l'extérieur.

    Bye
    THomas

    attention : l'équation d'un cercle de centre (x0,y0) est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (x-x0)^2+(y-y0)^2=rayon^2
    toi tu as écrit :

    CircleEquation=sqrt(((x-A)^2)+((y-B)^2));
    if(CircleEquation>Radius)
    n'est-ce pas plutot Radius^2 ?

  10. #10
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    il a mis une racine carree...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqrt((x-xc)^2+(y-yc)^2)) < r
    est la meme chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (x-xc)^2+(y-yc)^2 < r^2

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Kangourou
    il a mis une racine carree...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqrt((x-xc)^2+(y-yc)^2)) < r
    est la meme chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (x-xc)^2+(y-yc)^2 < r^2
    oups, effectivement, je n'avais pas vu la racine carrée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une bonne bibliothèque pour 3d image processing c++
    Par Akramou dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 08/03/2012, 14h19
  2. CSS Alignement vertical pour images dynamiques
    Par bébé dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 17/09/2005, 15h43
  3. Champ BLOB pour IMAGE format JPG and TImage et Interbase
    Par alain_bastien dans le forum InterBase
    Réponses: 1
    Dernier message: 20/10/2004, 16h15
  4. [apache] alias pour images
    Par romuald9999 dans le forum Apache
    Réponses: 2
    Dernier message: 13/08/2004, 09h44
  5. recherche des algorythmes pour images 2d
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/05/2002, 13h46

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