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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre averti
    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
    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
    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.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre averti
    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
    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 à 01h45.

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

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, 00h05
  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, 18h12
  3. Réponses: 4
    Dernier message: 31/03/2010, 14h37
  4. Distance euclidienne entre 2 matrices
    Par azerty09 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/02/2008, 18h43
  5. Distance euclidienne entre deux vecteurs
    Par larimoise dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2007, 22h44

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