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 :

copier un triangle dans un autre triangle [Débutant]


Sujet :

Images

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut copier un triangle dans un autre triangle
    Bonjour je suis débutant en matlab et je suis entrain de créer un algorithme qui permet de copier la totalité des pixels qui se trouve dans un triangle dans un autre triangle d'une autre image,mais malheureusement je n'arrive pas a le faire. Quelqu'un pourra m'aider SVP?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Montre nous ce que tu as déjà codé (même si c'est faux)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    étant donnée que xa,xb,xc,ya,yb,yc sont les coordonnées du 1ier triangle et xa1,xb1,xc1,ya1,yb1,yc1 sont les coordonnées du 2ieme triangle
    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
    x=imread('image112.png');
    y=imread('image111.png');
     
    xa=114;
    ya=50;
    xb=122;
    yb=92;
    xc=122;
    yc=23;
    xa1=100;
    ya1=50;
    xb1=117;
    yb1=92;
    xc1=117;
    yc1=23;
    B=((xa1-xb1)*(xa-xb)-(xa1-xb1)*(xc-xb))/((yc-yb)*(xa-xb)-(ya-yb)*(xc-xb));
    A=(xa1-xb1-B*(ya-yb))/(xa-xb) ;
    C= xb1-A*xb-B*yb;
    E=((ya1-yb1)*(xa-xb)-(ya1-yb1)*(xc-xb))/((yc-yb)*(xa-xb)-(ya-yb)*(xc-xb));
    D=(ya1-yb1-E*(ya-yb))/(xa-xb);
    F=yb1-D*xb-E*yb;
     
    t=[A B C;D E F;0 0 1];
    for i=220:280
    for j=130:160
    x(i,j,1)=y(i,j,1)*t1;
    end;
    end;
     
    imshow(x);
    sachant que mon but est appliquer une transformation affine sur le triangle pour le rendre sous forme du 2eime tringle c'est pour cela j'ai calculé la matrice t qui permet la transformation et je suis entrain de l'appliquer sur un triangle de l'image x

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut copier un triangle dans un autre triangle
    Bonjour,

    Un essai avec un carré :
    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
    clear
    im1=imread('****.jpg');
    im2=imread('****.jpg');
    imshow(im1);
    hold on
    % Positionnement du carré
    x=300:400;
    y=100:200;
    xv=[300 400 400 300 300];
    yv=[200 200 100 100 200];
    % Tracé du carré
    plot(xv,yv)
    figure
    imshow(im2);
    hold on
    % Tableau de l'image choisie
    C=im1(y,x,1:3);
    % Changement d'échelle
    C1=imresize(C,1.5);
    image('XData',xv,'YData',yv,'CData',C1)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci phryte pour votre réponse mais je ne veux pas tracer le triangle sur l'image je veux appliquer une transformation affine c'est à dire je prends 3 points de la première image(triangle) et je calcule sa matrice de transformation puis j'applique cette matrice sur le triangle initiale afin de déformer une partie de l'image initiale pour aller vers la deuxième image.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Voici l'idée de base :

    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
    65
    66
    clc
    clear all
     
    % Coordonnees des sommets du triangle sur l'image 1
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
    % Une image test
    load clown
     
    figure(1)
    clf
    colormap(map)
     
    % Image 1 + triangle 1
    s(1) = subplot(2,1,1);
    imagesc(X)
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s(2) = subplot(2,1,2);
    imagesc(X)
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], 'faces', [1 2 3], 'facecolor', 'none')
    axis image
     
    linkaxes(s,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X,2), 1:size(X,1));
    idx = inpolygon(x(:), y(:), [xa xb xc], [ya yb yc]);
    idx = find(idx);
    [r,c] = ind2sub(size(X), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A;
     
    % Application de la transformation aux pixels contenus dans le triangle 1
    pts = T * [c(:).' ; r(:).' ; ones(1,numel(c))];
     
    % Affichage de la localisation des pixels traites sur les deux images
    axes(s(1))
    plot(c, r, 'r.')
    axes(s(2))
    plot(pts(1,:), pts(2,:), 'r.')
    Par contre, en faisant comme ceci, tu te rendras compte que les points sur l'image n°2 ne correspondent pas précisément aux pixels de cette image. Tu auras donc des "trous" dans l'image finale.

    Dans la pratique, il faut appliquer la transformation inverse en partant des pixels de l'image n°2 vers ceux de l'image n°1 :

    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
    65
    66
    clc
    clear all
     
    % Coordonnees des sommets du triangle sur l'image 1
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
    % Une image test
    load clown
     
    figure(1)
    clf
    colormap(map)
     
    % Image 1 + triangle 1
    s(1) = subplot(2,1,1);
    imagesc(X)
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s(2) = subplot(2,1,2);
    imagesc(X)
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], 'faces', [1 2 3], 'facecolor', 'none')
    axis image
     
    linkaxes(s,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X,2), 1:size(X,1));
    idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
    idx = find(idx);
    [r,c] = ind2sub(size(X), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A;
     
    % Application de la transformation inverse aux pixels contenus dans le triangle 2
    pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
     
    % Affichage de la localisation des pixels traites sur les deux images
    axes(s(1))
    plot(pts(1,:), pts(2,:), 'r.')
    axes(s(2))
    plot(c, r, 'r.')
    Fais un zoom sur les points tracés pour visualiser la différence entre les deux méthodes.

    Il te reste ensuite à appliquer aux pixels de l'image 2 la valeur interpolée des points calculés sur l'image 1
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci Jerome pour votre réponse mais j'ai toujours le mm pb qui est la transformation affine. Je ne cherche pas a tracer des triangles sur les images, en fait, ce tringle est extrait de l'image1 et je doit l'appliquer sur l'image2, mais vous, vous avez tracé un triangle rouge sur l'image de clown sans pour autant déformer l'image mon problème c'est que je suis débutant et je voulais utilisé l'algorithme de delaunay pour découper l'image en des triangles afin de la déformer comme dans cette image:Nom : intro.png
Affichages : 348
Taille : 456,8 Ko
    Merci encore une fois,

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Mon code ne sert pas juste à tracer des triangle mais bel et bien à effectuer une transformation affine entre deux portions d'images

    Les points rouges montrent les pixels de l'image n°2 contenus dans le triangle puis leurs équivalents sur l'image n°1

    Il faut ensuite calculer la valeur de chaque point transformé sur l'image n°1 et l'appliqué aux pixels correspondants sur l'image n°2
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    j'ai utilisé votre code sur mes deux images mais ça n'a pas marché voila:
    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
     
     
    s1=imread('image112.png');
    s2=imread('image111.png');
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
     
    s1= subplot(2,1,1);
    imagesc(X)
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s2 = subplot(2,1,2);
    imagesc(X)
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], 'faces', [1 2 3], 'facecolor', 'none')
    axis image
     
    linkaxes(s1,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X,2), 1:size(X,1));
    idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
    idx = find(idx);
    [r,c] = ind2sub(size(X), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A;
     
    % Application de la transformation inverse aux pixels contenus dans le triangle 2
    pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
     
    % Affichage de la localisation des pixels traites sur les deux images
    axes(s1)
    plot(pts(1,:), pts(2,:), 'r.')
    axes(s2)
    plot(c, r, 'r.')

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Fais attention à nommer correctement les variables. Tu as pas exemple deux variables s1 pour deux objets différents dans ton code…
    Et tu te rends bien compte que la variable X n'est pas initialisée dans ton code , non ?

    Voici une version corrigée :

    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
    % Image 1
    X1 = imread('image112.png');
    % Image 2
    X2 = imread('image111.png');
     
    % Coordonnees des sommets du triangle sur l'image 1
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
    % Image 1 + triangle 1
    s(1) = subplot(2,1,1);
    imagesc(X1)
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s(2) = subplot(2,1,2);
    imagesc(X2)
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    linkaxes(s,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X1,2), 1:size(X1,1));
    idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
    idx = find(idx);
    [r,c] = ind2sub(size(X1), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A;
     
    % Application de la transformation inverse aux pixels contenus dans le triangle 2
    pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
     
    % Affichage de la localisation des pixels traites sur les deux images
    axes(s(1))
    plot(pts(1,:), pts(2,:), 'r.')
    axes(s(2))
    plot(c, r, 'r.')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci bcp Jerome,
    vous m'avez dit qu'il me reste ensuite à appliquer aux pixels de l'image 2 la valeur interpolée des points calculés sur l'image 1 comment je pourrai faire ça?

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    La variable pts contient les valeurs approximatives des indices des pixels "cibles" dans l'image n°1

    Par exemple pour une colonne de pts :

    Cela signifie que le point se trouve sur le pixel d'indice [96 125]

    Tu peux obtenir cette valeur en faisant :

    Une fois que tu as des valeurs entières d'indices, tu peux t'en servir avec les tableaux des deux images :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X2(r(1), c(1)) = X1(pts(1,1), pts(2,1))
    À répéter pour chaque pixel.

    C'est la méthode la plus simple mais pas forcément la meilleure. Plutôt que d'utiliser floor, tu peux utiliser des fonctions d'interpolation telle que interp2
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    voila j'ai fait une boucle mais ça n'a pas marché:
    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
    65
    66
     
    % Image 1
    X1 = imread('image112.png');
    % Image 2
    X2 = imread('image111.png');
     
    % Coordonnees des sommets du triangle sur l'image 1
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
    % Image 1 + triangle 1
     
    s(1) = subplot(2,1,1);
    imagesc(X1)
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s(2) = subplot(2,1,2);
    imagesc(X2)
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    linkaxes(s,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X1,2), 1:size(X1,1));
    idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
    idx = find(idx);
    [r,c] = ind2sub(size(X1), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A
     
    % Application de la transformation inverse aux pixels contenus dans le triangle 2
    pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
    pts = floor(pts);
    for i=50:200
    for j=50:200
     X2(r(i), c(j)) = X1(pts(i,j), pts(i+1,j));
    end;
    end;
    imshow(X2);

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par talbis Voir le message
    ça n'a pas marché
    Pourrais-tu nous donner plus d'informations ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    alors vous m'avez dit que "À répéter pour chaque pixel" donc j'ai crée une boucle pour parcourir tous les pixels dans le premier triangle et j'ai affecté chaque pixel de X1 vers X2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=50:200
    for j=50:200
     X2(r(i), c(j)) = X1(pts(i,j), pts(i+1,j));
    end;
    end;
    et puis j'ai affiché l'image pour voir si c'est appliqué sur la deuxième ou non:

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    load clown
     
    X1 = X;
    X2 = X;
     
    figure(1)
    clf
    colormap(map)
     
    % % Image 1
    % X1 = imread('image112.png');
    % % Image 2
    % X2 = imread('image111.png');
     
    % Coordonnees des sommets du triangle sur l'image 1
    xa = 114;
    ya = 50;
    xb = 122;
    yb = 92;
    xc = 122;
    yc = 23;
    % Coordonnees des sommets du triangle sur l'image 2
    xa1 = 100;
    ya1 = 50;
    xb1 = 117;
    yb1 = 92;
    xc1 = 117;
    yc1 = 23;
     
    % Image 1 + triangle 1
    s(1) = subplot(2,1,1);
    im(1) = imagesc(X1);
    hold on
    patch('vertices', [xa ya ; xb yb ; xc yc], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    % Image 2 + triangle 2
    s(2) = subplot(2,1,2);
    im(2) = imagesc(X2);
    hold on
    patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], ...
          'faces', [1 2 3], ...
          'facecolor', 'none')
    axis image
     
    linkaxes(s,'xy')
     
    % Detection des pixels à l'intérieur du triangle 1
    [x,y] = meshgrid(1:size(X1,2), 1:size(X1,1));
    idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
    idx = find(idx);
    [r,c] = ind2sub(size(X1), idx);
     
    % Transformation affine triangle 1 => triangle 2
    A = [xa xb xc 
         ya yb yc
         1 1 1];
    X = [xa1 xb1 xc1
         ya1 yb1 yc1
         1 1 1];
    T = X/A;
     
    % Application de la transformation inverse aux pixels contenus dans le triangle 2
    pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
     
    % % Affichage de la localisation des pixels traites sur les deux images
    % axes(s(1))
    % plot(pts(1,:), pts(2,:), 'r.')
    % axes(s(2))
    % plot(c, r, 'r.')
     
    pts = floor(pts);
     
    for n = 1:size(pts,2)
       X2(r(n), c(n)) = X1(pts(2,n), pts(1,n));   
    end
     
    set(im(2), 'cdata', X2)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    ce code ne marche que sur l'image de clown si j'essaye de le tester sur mes deux images je trouve le résultat sous la forme d'un triangle rempli en bleu sur l'image 2

  18. #18
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Peux-tu nous fournir les deux images que tu utilises ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    alors c'est simple je peux vous fournir les deux images suivantesNom : image1.png
Affichages : 363
Taille : 99,3 KoNom : image2.png
Affichages : 345
Taille : 98,9 Ko
    Mais regardez le résultat:Nom : Sans titre.png
Affichages : 340
Taille : 158,8 Ko

  20. #20
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Ce sont des images RGB. La couleur de chaque pixel est codée avec 3 composantes.

    Remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for n = 1:size(pts,2)
       X2(r(n), c(n)) = X1(pts(2,n), pts(1,n));   
    end
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for n = 1:size(pts,2)
       X2(r(n), c(n), 1) = X1(pts(2,n), pts(1,n), 1);   
       X2(r(n), c(n), 2) = X1(pts(2,n), pts(1,n), 2); 
       X2(r(n), c(n), 3) = X1(pts(2,n), pts(1,n), 3); 
    end
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for n = 1:size(pts,2)
       X2(r(n), c(n), :) = X1(pts(2,n), pts(1,n), :);   
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

Discussions similaires

  1. Copier un formulaire dans une autre base
    Par Bercud dans le forum IHM
    Réponses: 2
    Dernier message: 08/06/2006, 12h15
  2. [C#]Copier un treeview dans un autre
    Par fafa139 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/04/2006, 02h35
  3. copier une table dans une autre
    Par Dionisos dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/07/2005, 11h24
  4. Copier une texture dans une autre?
    Par supergrey dans le forum DirectX
    Réponses: 9
    Dernier message: 28/07/2004, 11h12
  5. copier une ligne dans une autre table
    Par BoeufBrocoli dans le forum SQL
    Réponses: 5
    Dernier message: 24/10/2003, 22h59

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