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 :

comparaison deux images


Sujet :

Images

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut comparaison deux images
    bonjour j'ai commencé à travailler sur matlab il y a deux jours et j'y comprends pas grand chose.
    j'ai une image de référence et une autre identique mais le motif à l'intérieur à un angle différent.
    je dois calculer cet angle et faire que les deux images soient rigoureusement identiques.
    j'ai pensé faire une boucle for pour parcourir tous les pixels mais je ne sais pas comment pouvoir calculer la pente du motif de l'image 2 par rapport à celui de l'image 1
    merci d'avance

  2. #2
    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
    Salut,

    avant de penser à coder, il serait peut-être judicieux de savoir la méthode que tu vas adopter...

    Et la méthode dépend du motif que tu étudies...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Alors en fait il s'agit d'un billet de banque (donc en gros d'un rectangle) et je voulais parcourir l'image pixel par pixel pour déterminer les coins du billet comme il est sur fond noir il y a un fort contraste mais j'arrive pas à obtenir leurs coordonnées.(je voulais faire une boucle genre for l de 1 jusqu'au nombre de ligne
    for c de 1 jusqu'au nombre de colonnes
    if [l,c]> genre 1 alors noter les valeurs de l et de c
    et après récupérer le couple de valeurs pour lequel l est minimum d'une part et d'autre part le couple de valeur pour lequel c est minimum
    Si je les avais je pourrais déterminer la pente et ainsi 'redresser l'image'

    Je sais pas si je suis très claire mais j'espère que vous pourrez m'aider
    merci d'avance

  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
    Je pense que tu peux y arriver avec la méthode que tu décris, même si ça me parait un peu lourd.... (d'ailleurs ou ça bloque? n'hésite pas à nous mettre ton code pour que l'on voit ce qui cloche).

    Ce n'est qu'une idée, mais ce serait plus simple de travailler sur une image binaire si le contraste entre ton billet de banque et le fond le permet. Ensuite, tu pourras facilement avoir toutes les coordonnées des points de ton billets de banque (en utilisant la fonction find), puis dans ces coordonnées, tu recherches les min et max qui t'intéressent.

    Après ça dépend aussi de l'amplitude de l'orientation de ton billet (<ou > 90° par exemple)...

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Le plus simple serait que tu nous montres une des images sur laquelle tu travailles...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Je vais essayer de trouver aujourd'hui si je ne trouve pas je vous demande votre aide dès ce soir en mettant ce que j'ai codé et mon image
    merci de votre aide

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    voila, j'ai une question comment je peux faire si je veux écrire :
    si le pixel vérifie une condition alors je veux pouvoir afficher les coordonnées du pixel et à la fin avoir les coordonnées de tous les pixels qui vérifient cette condition
    parce que j'ai bien tenté un truc mais j'obtiens que le dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    m=size(billet,1);
    n=size(billet,2);
    d=0;
    e=0;
    for l=1:m
        for c=1:n
            if(billet(l,c)>10)
                d=c;
                e=l;
            end
        end
    end
    Je comprends que ça me donne que le dernier qui vérifie la condition et j'aimerai bien les avoir tous pour pouvoir ensuite extraire ceux qui m'intéressent
    merci d'avance

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    m=size(billet,1);
    n=size(billet,2);
     
    k = 1;
    for l=1:m
        for c=1:n
            if(billet(l,c)>10)
                d(k)=c;
                e(k)=l;
                k = k+1;
            end
        end
    end
    ou plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [e,d] = find(billet>10);

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    coucou me revoilà je ne me sors pas de ce problème
    En fait je veux récupérer les composantes d'une des arêtes du billet comme ça je pourrais par la suite faire une régression linéaire et pouvoir déterminer avec précision de quel angle je dois tourner mon image
    pour que mon billet soit 'droit'.
    Alors je vois comment isoler par exemple tous les pixels blancs de l'image mais alors je n'ai aucune idée de
    comment isoler en particulier ceux-là
    Je m'y prends peut-être mal
    Sinon en partant de l'image 'good'
    je pensais parcourir ligne par ligne et dès que je rencontre le premier pixel blanc je note les coordonnées.
    comme ça j'aurai tous les points d'une des arêtes,qu'en pensez vous?
    Par contre je ne sais pas comment je vais coder ça !!j'essairai demain matin mais votre aide est la bienvenue
    Encore merci de m'aider
    Fichiers attachés Fichiers attachés

  10. #10
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    je ne te dis pas que le code qui suit pourra t'aider mais ça t'aidera sûrement à prendre pied sur le problème.

    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
    44
    45
    billet = imread('billet.jpg');
    billetG=rgb2gray(billet);
    imshow(billetG)
     
    j=1;
    for ii = 1 : size(billetG, 1)
        res = find(billetG(ii,:)>10);
        if ~isempty(res)
         y_billet(j,:) = [ii res(1) res(end)];
         j=j+1;
        end
    end
     
    j=1;
    for ii = 1 : size(billetG, 2)
        res = find(billetG(:,ii)>10);
        if ~isempty(res)
         x_billet(j,:) = [ii res(1) res(end)];
         j=j+1;
        end
    end
     
    figure, hold on
    plot(x_billet(:,1),x_billet(:,2))
    plot(x_billet(:,1),x_billet(:,3))
    plot(y_billet(:,2),y_billet(:,1))
    plot(y_billet(:,3),y_billet(:,1))
     
    res1 = find(x_billet(:,1)==min(x_billet(:,1)));
    X1 = x_billet(res1(1),1);
    Y1 = x_billet(res1(1),2);
    plot(X1, Y1,'+')
     
    res2 = find(x_billet(:,3)==max(x_billet(:,3)));
    X2 = x_billet(res2(1),1);
    Y2 = x_billet(res2(1),3);
    plot(X2, Y2,'+')
     
    coteadj = Y2-Y1;
    coteopp = X2-X1;
     
    angle = atan(coteopp/coteadj);
     
    billetrot = imrotate(billetG, -angle*180/pi);
    figure, imshow(billetrot);
    Et n'écoute pas les grincheux qui diront le code est pas beau, que ça ne marche que dans ce cas et qu'il y a plein de fautes parce qu'ils auraient raison

    bon, je crois que j'ai fait assez de bêtises pour aujourd'hui, je vais me coucher!

  11. #11
    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
    Salut,

    une autre version :
    supposons que le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [e,d] = find(billet>10);
    donne une image binaire (comme celle que tu as dans good?).
    Alors pour trouver les 2 extrémités de la longueur en haut du billet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % Tous les sommets (x,y) qui vérifie x=xmin :
    ptAs = [e(find(d==min(d))) d(find(d==min(d)))];
    % Le sommet en haut à gauche :
    ptA = ptAs(find(ptAs(:,1)==max(ptAs(:,1))),:);
    % Tous les sommets (x,y) qui vérifie y=ymin :
    ptBs = [e(find(e==min(e))) d(find(e==min(e)))]
    % Le sommet en haut à droite (c'est à dire le sommet qui vérifie  x=xmax)
    ptB = ptBs(find(ptBs(:,2)==max(ptBs(:,2))),:);
    Ensuite avec ces 2 points, tu peux facilement calculer l'orientation de la droite. Je ne l'ai pas testé donc il y a peut-être des fautes de frappe (ou de raisonnement )
    cela ne marche que sous la condition : 0 ≤ orientation ≤ 90

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Avec l'Image Processing Toolbox :

    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
    % Binarisation de l'image
    BW = C~=0;
    % Operation morphologique de fermeture
    se = strel('disk',15);
    closeBW = imclose(BW,se);
     
    %Identification des zones d'interet
    L = bwlabel(closeBW);
     
    %Calcul des proprietes interessantes
    %Orientation est l'angle recherché
    reg = regionprops(L,{'extrema' 'orientation' 'centroid'});
     
    % Affichage des resulats
    figure
    imshow(closeBW)
     
    hold on
    plot(reg.Extrema(:,1),reg.Extrema(:,2),'r*');
    plot(reg.Centroid(1,1),reg.Centroid(1,2),'g*');
    quiver(reg.Centroid(1,1),reg.Centroid(1,2),cos(-reg.Orientation*pi/180),sin(-reg.Orientation*pi/180),size(C,2)/2)
    Sans l'Image Processing Toolbox (mais avec le code de magelan un peu modifié )
    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
    % Binarisation de l'image
    BW = C~=0;
     
    [d,e] = find(BW);
     
    % Tous les sommets (x,y) qui vérifie x=xmin :
    idx = d==min(d);
    ptAs = [e(idx) d(idx)];
    % Le sommet en haut à gauche :
    ptA = ptAs(ptAs(:,1)==max(ptAs(:,1)),:);
    % Tous les sommets (x,y) qui vérifie y=ymin :
    idx = e==min(e);
    ptBs = [e(idx) d(idx)];
    % Le sommet en haut à droite (c'est à dire le sommet qui vérifie  x=xmax)
    ptB = ptBs(ptBs(:,2)==min(ptBs(:,2)),:);
     
    %Calcul de l'angle par produit scalaire entre le vecteur BA et l'axe x
    V = ptA-ptB;
    V = V./norm(V);
     
    ang = 180*acos(V*[1;0])/pi;
     
    % Affichage des resulats
    figure
    colormap(gray)
    imagesc(BW)
    hold on
    plot(ptA(1,1),ptA(1,2),'r*',ptB(1,1),ptB(1,2),'g*')
    Dans les deux cas, la matrice C est obtenue à partir du .fig avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Lecture du fichier
    l('good.fig');
     
    %Recuperation de l'identifiant de l'objet Image
    im = findobj('type','image');
    %Recuperation des valeurs des pixels de l'image
    C = get(im,'cdata');
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Lecture du fichier
    load('good.fig','-mat')
    %Recuperation des valeurs des pixels de l'image
    C = hgS_050200.children.children(1).properties.CData;
    Voila tout ceci est loin d'être parfait mais c'est globalement un bon départ... qui ne demande qu'à être amélioré

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    merci beaucoup c 'est trop sympa de m'aider
    J'essaie de comprendre vos codes et de les réécrire.
    De plus à partir de là je vais essayer d'obtenir les coordonnées des points de l'arête entre les deux extrémités parce qu'avec seulement les sommets ça marche mais c'est pas très précis
    Je crois que j'aurai encore besoin de votre aide pour ça parce qu'en français je sais très bien ce que je veux faire mais c'est dur de le traduire en matlab

  14. #14
    Membre habitué
    Avatar de mr_langelot
    Profil pro
    Inscrit en
    Août 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 113
    Points : 150
    Points
    150
    Par défaut
    enfin, mon avis personnel, et je t'engage à lancer mon code pour t'en convaincre, est qu'il vaudrait mieux partir sur définir les 4 droites qui passent par ton billet et ainsi calculer les intersections.

    Ca marchera certainement mieux que les points

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Regarde aussi les demo Image Registration ici : http://www.mathworks.fr/products/image/demos.html?BB=1

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Merci, Dut c'est une des premières choses que j'ai regardé.
    Je crois que j'arriverai jamais à me démerder avec Matlab
    J'arrive toujours pas à obtenir tous les points d'une arête, mais je ne désespère pas, je décortique toujours vos codes...

  17. #17
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Voici une version légèrement modifiée du code utilisant l'Image Processing Toolbox :

    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
    close('all')
    clc
    %Lecture du fichier
    open('good.fig');
     
    %Recuperation de l'identifiant de l'objet Image
    im = findobj('type','image');
    % Recuperation des valeurs des pixels de l'image
    C = get(im,'cdata');
     
    % Binarisation de l'image
    BW = C~=0;
    % Operation morphologique de fermeture
    se = strel('disk',15);
    closeBW = imclose(BW,se);
     
    %Identification des zones d'interet
    L = bwlabel(~closeBW);
    BW = ~(L==1);
    %Calcul des proprietes interessantes
    reg = regionprops(double(BW),{'extrema' 'orientation' 'centroid'});
     
    % Affichage des resulats
    figure
    imshow(BW)
     
    hold on
    plot(reg.Extrema(:,1),reg.Extrema(:,2),'r*');
    plot(reg.Centroid(1,1),reg.Centroid(1,2),'g*');
    quiver(reg.Centroid(1,1),reg.Centroid(1,2),cos(-reg.Orientation*pi/180),sin(-reg.Orientation*pi/180),size(C,2)/2)
    Qu'entends-tu par "c'est pas très précis" ?

    Si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    B = imrotate(C,-reg.Orientation);
     
    figure
    imshow(B)
    Le résultat me semble cohérent...

    Il ne faut pas oublier que ton billet est un morceau de papier qui même si neuf à une forme (presque) parfaitement rectangulaire, c'est loin d'être le cas après avoir été mis en circulation et scanné.

    On peut donc supposer que la forme du billet n'est pas représentée par un rectangle mais plutôt par un polygone, non ?
    Il est possible de se limiter à un polygone à quatre coté dans un premier temps...

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    En fait je ne comprends pas trop le code que tu me proposes
    je préfèrerai réussir en utilisant des boucles par exemple (comme ça je comprends )
    En fait je comprends le code de mr langelot (à peu près ) à part qu'au lieu d'avoir que les sommets je voudrais les coordonnées de toute l'arête mais j'y arrive pas.
    je voulais faire
    [d,e]=find(imgbina>250);
    for i=1:d(end) ....

    je veux en fait obtenir les coordonnées des pixels d'une arête
    ce problème m'énerve au plus haut point!j'y suis depuis lundi et j'ai pas beaucoup avancé
    Parce qu'en calculant que les sommets c'est moins précis que si je fais une régression linéaire à partir de tous les points de l'arête
    désolé de vous embêter autant

  19. #19
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 896
    Points
    52 896
    Par défaut
    OK... mais tu va voir que ce que tu veux faire n'est pas plus simple ni plus robuste...

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    clc
    close('all')
     
    %Lecture du fichier
    open('good.fig');
     
    %Recuperation de l'identifiant de l'objet Image
    im = findobj('type','image');
    %Recuperation des valeurs des pixels de l'image
    C = get(im,'cdata');
     
    % Binarisation de l'image
    BW = C~=0;
     
    % Parcours de chaque ligne de gauche à droite
    limite_droite = [];
    for r = 1:size(C,1)
        for c = 1:size(C,2)
            if C(r,c)~=0
                limite_droite = [limite_droite ; r c];
                break
            end
        end
    end
     
    % Parcours de chaque ligne de droite à gauche
    limite_gauche = [];
    for r = 1:size(C,1)
        for c = size(C,2):-1:1
            if C(r,c)~=0
                limite_gauche= [limite_gauche ; r c];
                break
            end
        end
    end
     
    % Parcours de chaque colonne du "haut" vers le "bas"
    limite_dessus = [];
    for c = 1:size(C,2)
        for r = 1:size(C,1)
            if C(r,c)~=0
                limite_dessus= [limite_dessus ; r c];
                break
            end
        end
    end
     
    % Parcours de chaque colonne du "bas" vers le "haut"
    limite_dessous = [];
    for c = 1:size(C,2)
        for r = size(C,1):-1:1
            if C(r,c)~=0
                limite_dessous= [limite_dessous ; r c];
                break
            end
        end
    end
     
    hold on
     
    plot(limite_droite(:,2),limite_droite(:,1),'r*', ...
        limite_gauche(:,2),limite_gauche(:,1),'m*', ...
        limite_dessus(:,2),limite_dessus(:,1),'g*', ...
        limite_dessous(:,2),limite_dessous(:,1),'b*')
    L'algorithme est très simple, tu parcours à chaque fois une dimension dans une sens puis dans l'autre et tu relèves les coordonnées du premier pixel dont la valeur est différente de 0. Tu passes à la composante suivante de la dimension (on sort de la boucle intérieure avec BREAK) dès qu'un pixel non nul est rencontré.

    Je te laisse étudier le résultat

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 4
    Points
    4
    Par défaut
    Salut, alors grâce à vos codes je calcule les coordonnées du bord haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for c=1:size(noirblanc,2)
        for r=1:size(noirblanc,1)
            if noirblanc(r,c)~=0
                bord_haut=[bord_haut;r c];
                break
            end
        end
    end
    Après je calcule les coordonnées du sommet en haut à droite (avec avant :[e,d]=find(noirblanc>180)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idx=e==min(e);
    sommet2=[e(idx) d(idx)];
    haut_droit=sommet2(sommet2(:,2)==max(sommet2(:,2)),:);
    plot(haut_droit(:,2),haut_droit(:,1),'b<')
    j'obtiens le bon sommet

    maintenant je veux qu'un seul coté donc je pensais refaire la procédure du bord haut comme suit mais en arrêtant les boucles aux coordonnées du sommet mais quand je trace ça me donne la même chose et je n'obtiens pas qu'une seule arête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for c=1:haut_droit(:,2)
        for r=1:haut_droit(:,1)
            if noirblanc(r,c)~=0
                bord_haut=[bord_haut;r c];
                break
            end
        end
    end
    Vous savez ce qu'il ne va pas dans ce que j'ai écrit,

Discussions similaires

  1. Matrice de cooccurrences pour la comparaison de deux images
    Par bilzzbenzbilz dans le forum Traitement d'images
    Réponses: 28
    Dernier message: 01/07/2017, 16h12
  2. comparaison entre deux images
    Par gash59 dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/03/2008, 20h05
  3. comparaison deux images
    Par nicolovitch dans le forum Windows
    Réponses: 3
    Dernier message: 27/04/2007, 17h25
  4. [GD] Comparaison de deux images
    Par jack_1981 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 03/04/2007, 16h03
  5. Réponses: 10
    Dernier message: 30/06/2005, 12h20

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