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 :

calculer la distance euclidienne entre les pixels de la matrice d'une image bitmap [Débutant]


Sujet :

Images

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut calculer la distance euclidienne entre les pixels de la matrice d'une image bitmap
    Bonjour

    Je sais que ce sujet a déja plus ou moins été abordé mais mon cas a des nuances: il s'agit de calculer la distance euclidienne entre les pixels des régions voisines d'une image bitmap convertie en matrice. Ces régions sont représentées par des numéros (labels) de 1 a N (dans mon code N est désigné par la variable number). Donc ici il s'agira de déterminer la distance di, entre les pixels des régions 1 et 2, 2 et 3,..., number -1 et number. Pour chaque couple de régions je retiens la plus petite distance min(d), ce qui me permettra apres de regrouper les régions selon que leurs distances minimales soient plus ou moins grandes.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    function proxym(filename);
    img = imread(filename);
    bw=(img);
    bw=~bw;
    [Labeling,number]=bwlabel(bw)
    p = 0;
    q = 0;
    for Label_number = 1 : number   %number est le nombre de regions
        count= 1;
     
        %Scan de l’image de gauche a droite
        for x = 1 : 256
            for y = 1 : 256
     
                %lecture de la premiere region labelisée et extraction des coordonnées des  % pixels
                if (bw(x,y)==Label_number)
     
                    Array_Label_number([x count])=x;
                    Array_Label_number([y count])=y;
     
     
                    % lecture de la region suivante
                else
     
                    Array_Label_number([x count+1])=x;
                    Array_Label_number([y count+1])=y;
     
                    p = x;
                    q = y;
     
                end
                count = count+1;
                d = distance(x,y,p,q);
            end
        end
     
        edismin = min(d);
        disp('Component:');
        disp(Label_number);
        disp(edismin);
        %
        %                  disp(count);
    end
    Je ne suis vraiment pas un expert en matlab, donc je demande votre indulgence si vous constatez de grossieres erreurs.

    La fonction distance calcule la distance euclidienne entre 2 pixels en prenant comme parametres les coordonnées des pixels:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Dist = distance(m,n,o,p)
    x1=m;
    y1=n;
    x2=o;
    y2=p;
    Dist=((x1-x2)^2+(y1-y2)^2)^0.5;
    end
    Merci de vos conseils et suggestions!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    • Une seule ligne suffit : bw = ~img;
    • Petite erreur : if (bw(x,y)==Label_number)
    • Je n'ai pas trop compris ce que tu souhaitais obtenir avec Array_Label_number
    • d = distance(x,y,p,q); comme ceci, d est un simple scalaire. Si tu veux à la fin obtenir le minimum de toutes ces valeurs calculées, c'est un tableau qu'il te faut, ou une comparaison avec la valeur précédente pour garder le minimum des deux.
    • Copies inutiles :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      function Dist = distance(m,n,o,p)
      x1=m;
      y1=n;
      x2=o;
      y2=p;
      function Dist = distance(x1, y1, x2, y2) ou Dist = ((m-o)^2+(n-p)^2)^0.5;

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Precisions sur le code
    Salut Winjerome

    Merci pour ta contribution. les variables ''Array_Label_number'' doivent en principe contenir les valeurs de x et de y de chaque region. Ce que je veux en fait c'est stocker les coordonnees des pixels de chaque regions labelisees dans un tableau et les reutiliser apres dans le calcul des distances avec la fonction distance.

    Je pensais d'abord calculer toutes les distances entre pixels avec mes boucles ''for'' et en utilisant les tableaux ''Array_Label_number'' pour stocker les coordonnees des pixels de chaque regions et applique la fonction min de matlab pour l'affichage de chaque minium distance entre chaque couple de regions voisines.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,
    Citation Envoyé par Initiatic Voir le message
    Salut Winjerome

    Merci pour ta contribution. les variables ''Array_Label_number'' doivent en principe contenir les valeurs de x et de y de chaque region. Ce que je veux en fait c'est stocker les coordonnees des pixels de chaque regions labelisees dans un tableau et les reutiliser apres dans le calcul des distances avec la fonction distance.
    Utilise plutôt la fonction find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ligne colonne] = find(Labeling==Label_number);
    ligne et colonne contiennent les coordonnées des pixels égaux à Label_number.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Merci pour la grosse contribution mais...
    Merci Magelan

    J'avais pense a la fonction find, Mais comment je fais pour incrementer mes valeurs?...je veux dire le code suivant servait a avancer dans la lecture des valeurs de la matrice bw et du stockage des coordonnees:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
               else
     
                       Array_Label_number([x count+1])=x;
                       Array_Label_number([y count+1])=y; 
     
                       p = x;
                       q = y;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ligne colonne] = find(bw,Label_number)
    prend les valeurs des coordonnees si la condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (bw(x,y)==Label_number)
    est remplie. Pourrais-tu me preciser comment je pourrais faire pour avancer d'une valeur de Label_number a une autre, sachant qu'elles sont comprises entre 1 et number qui est le nombre de regions de mon image donc le nombre de labels?

  6. #6
    Invité
    Invité(e)
    Par défaut
    La syntaxe avec find est fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [lignes colonnes] = find(Labeling==Label_number)
    qui récupère dans lignes et colonnes les couples (i,j) où Labeling est égal à Label_number.

    NB : bw est une image binaire (valeurs 0/1), tandis que Labeling contient bien les valeurs de 1 à number correspondant aux régions.
    Dernière modification par Invité ; 28/10/2012 à 02h45.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Pour revenir a mon code
    Citation Envoyé par Winjerome Voir le message
    La syntaxe avec find est fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [lignes colonnes] = find(Labeling==Label_number)
    qui récupère dans lignes et colonnes les coubles (i,j) où Labeling est égal à Label_number.

    NB : bw est une image binaire (valeurs 0/1), tandis que Labeling contient bien les valeurs de 1 à number correspondant aux régions.
    Merci Winjerome pour la syntaxe de find, mais comment je fais pour incrementer les valeurs de Labeling, si nous revenons a mon code, qu'est ce que je mets dans mon else?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if (bw(x,y)==Label_number)
     
                     [lignes colonnes] = find(Labeling==Label_number)    
     
               else

    Je voudrais recuperer le couple de coordonnees (x,y) pour chacun des pixels de mes regions voisines afin de calculer les distances entre regions voisines d'apres les numeros de labels...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu devrais regarder ce que contiennent toutes tes variables et relire calmement mes réponses.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Suis-je sur la bonne voie??
    Merci a tous

    Mes prochaines questions vont parraitre stupides pour des pros, je prefere deja vous le dire...En Matlab, je suis vraiment a l'etat d'initiation, c'est d'ailleurs pour ca que j'ai pris ce pseudo ''Initiatic'':

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [lignes colonnes] = find(Labeling==Label_number)
    me renvera les coordonnees des pixels de toutes mes regions de 1 a number? Si c'est le cas, et la les gars ne vous fachez pas devant tant d'ignorance, comment je distingue les couples (i,j)appartenant a chaque region.

    Je pense bien a envoyer les valeurs dans autant de tableau que de regions...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    [lignes colonnes] = find(Labeling==Label_number)
    for Labeling = 1 : Label_number
       result=(lignes,colonnes);
    end
    Merci pour vos conseils

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Initiatic Voir le message
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [lignes colonnes] = find(Labeling==Label_number)
    me renvera les coordonnees des pixels de toutes mes regions de 1 a number? Si c'est le cas, et la les gars ne vous fachez pas devant tant d'ignorance, comment je distingue les couples (i,j)appartenant a chaque region.
    Non, ce code n'est valable que pour une seule région.

    Par contre attention, le code que je t'ai fourni utilisait Labeling comme étant le résultat de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Labeling,number]=bwlabel(bw);
    et Label_number la variable itérative de ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for Label_number = 1 : number
    Tu as un peu tout change depuis

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Comment faire alors?
    Winjerome,
    Merci pour les précisions sur les variables. Comme le code n'est variable que pour une seule région comment je peux obtenir les valeurs de (x,y) pour toutes les régions et les stocker dans autant de tableaux que de régions?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Une simple boucle remplissant deux tableaux de cellules.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Questions sur les boucles
    Citation Envoyé par Winjerome Voir le message
    Une simple boucle remplissant deux tableaux de cellules.
    La tu vas sans doute te dire que je pousse un peu...mais avec le peu de savoir que j'ai sur la programmation avec les matrices, si je ne demande pas je ne pourrais pas m'en sortir... j'ai ecris le code suivant pour obtenir le couple (x,y) pour toutes mes regions et les afficher dans des tableaux de 1 a number...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for Label_number = 1 : number
    [lignes colonnes] = find(Labeling==Label_number)
    result{Label_number} =[lignes colonnes]
     
    end

    Le resultat n'est pas ce a quoi je m'attendais. Merci de m'indiquer mes erreurs et surtout pour ta disponibilite

  14. #14
    Invité
    Invité(e)
    Par défaut
    Le savoir ça s'apprend
    Entre-autres, tu as les tutoriels et la FAQ du site, ainsi qu'une multitude d'exemples parmi toutes les discussions du forum

    Citation Envoyé par Initiatic Voir le message
    Merci de m'indiquer mes erreurs
    Aucune erreur en vue, ton code est bon.
    Citation Envoyé par Initiatic Voir le message
    Le résultat n'est pas ce a quoi je m'attendais.
    Et tu t'attendais à quoi ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Le savoir ça s'apprend
    Entre-autres, tu as les tutoriels et la FAQ du site, ainsi qu'une multitude d'exemples parmi toutes les discussions du forum


    Aucune erreur en vue, ton code est bon.

    Et tu t'attendais à quoi ?
    Bonjour

    je m'attendais a avoir des tableaux de 1 a number avec des couples de valeurs, au lieux de ca j'obtiens ca:


    255

    Component:
    5

    [6807x2 double] [6773x2 double] [6828x2 double] [6808x2 double] [6778x2 double]

    Component:
    2

    [6807x2 double] [6773x2 double] [6828x2 double] [6808x2 double] [6778x2 double]

    Component:
    3

    [6807x2 double] [6773x2 double] [6828x2 double] [6808x2 double] [6778x2 double]

    Component:
    4

    [6807x2 double] [6773x2 double] [6828x2 double] [6808x2 double] [6778x2 double]

    Component:
    5

    [6807x2 double] [6773x2 double] [6828x2 double] [6808x2 double] [6778x2 double]

    la variable ''components'' designe les regions...

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut Ca marche peut-etre
    Je crois que ca marche, parce que quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(result{Label_number})
    J'obtiens une double liste de valeurs qui semblent etre les coordonnees des pixels de mes differentes regions de 1 a number. A ce niveau, il y a tellement de valeurs que la fenetre ''Command Window'' de matlab ne peut pas toutes les afficher...

    Maintenant ma question est comment appliquer l'indexage pour effectuer le calcul de distance entre les pixels de la region 1 et ceux de la region 2 et ainsi de suite.


    L'indexage s'effectue soit :

    avec () pour récupérer la cellule
    avec {} pour récupérer la valeur contenue dans la cellule.

  17. #17
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Comment accéder à un élément particulier d'une cellule ?
    Ensuite il suffit de faire des boucles par exemple pour calculer les distances.

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Initiatic Voir le message
    Je crois que ca marche, parce que quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(result{Label_number})
    J'obtiens une double liste de valeurs qui semblent etre les coordonnees des pixels de mes differentes regions de 1 a number. A ce niveau, il y a tellement de valeurs que la fenetre ''Command Window'' de matlab ne peut pas toutes les afficher...

    Maintenant ma question est comment appliquer l'indexage pour effectuer le calcul de distance entre les pixels de la region 1 et ceux de la region 2 et ainsi de suite.


    L'indexage s'effectue soit :

    avec () pour récupérer la cellule
    avec {} pour récupérer la valeur contenue dans la cellule.
    Et si c'est une boucle de la forme (la syntaxe ne doit probablement pas etre correcte) dans laquelle on effectue le calcul de distance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for Label_number = 1: number
    i = result{Label_number}(lignes)
    j = result{Label_number}(colonnes)
     
    end

    Etant donnne que la fonction de calcul de distance prend en entree 4 parametres comment les obtenir.

    En resumee, comment calculer la distance avec les couples (i,j) de deux regions voisines et pour au final ne retenir que la plus petite distance a chaque fois, donc au final je dois obtenir n-1 distances

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Déjà, on va essayer de s'entendre sur ce que tu essaies de faire : qu'entends-tu par "2 régions voisines"? Comment sais-tu si les 2 régions sont voisines ou non?

    Pour la syntaxe, tu n'as pas besoin de créer des nouvelles variables qui seraient des copies inutiles, tu peux accéder aux éléments directement (comme indiqué dans mon précédent post).

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par magelan Voir le message
    Déjà, on va essayer de s'entendre sur ce que tu essaies de faire : qu'entends-tu par "2 régions voisines"? Comment sais-tu si les 2 régions sont voisines ou non?

    Pour la syntaxe, tu n'as pas besoin de créer des nouvelles variables qui seraient des copies inutiles, tu peux accéder aux éléments directement (comme indiqué dans mon précédent post).
    Salut

    Une fois les regions labelisees, elles ont un numero de 1 a n c'est d'alleurs ce numero qui est contenu dans la variable Labeling, je crois.
    Je ne sais pas si je me trompe, mais si n = 5 par exemple, les regions seront designee par des numeros de 1 a 5. Est-ce inexact de considerer les regions 1 et 2 voisines, 2 et 3 voisines, 3 et 4 voisines et 4 et 5 voisines?

    Je drevais donc avoir 5 tableaux contenant chacun des couples (i,j) et je voudrais pour les couples de regions decrits plus haut calculer la plus petites distances entre regions.

    Et comme je disais je ne sais a l'affichage de mon premier resultat si tout les couples de valeurs affiches font partie d'un tableau ou de n tableau, vue que l'affichage sort du cadre de l'ecran "Command Window"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. convertir les pixels d'un objet dans une image
    Par janhong dans le forum Images
    Réponses: 1
    Dernier message: 12/11/2013, 01h05
  2. [Débutant] calcul distance euclidienne entre labels dans une image binaire
    Par angel_tn dans le forum Images
    Réponses: 8
    Dernier message: 04/05/2010, 19h12
  3. Réponses: 4
    Dernier message: 31/03/2010, 15h37
  4. Distance euclidienne entre 2 matrices
    Par azerty09 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/02/2008, 19h43
  5. Distance euclidienne entre deux vecteurs
    Par larimoise dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2007, 23h44

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