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

Traitement d'images Discussion :

Morphisme koala en tigre


Sujet :

Traitement d'images

  1. #1
    Candidat au Club
    Homme Profil pro
    UPVD Perpignant
    Inscrit en
    Décembre 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : UPVD Perpignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2024
    Messages : 2
    Par défaut Morphisme koala en tigre
    Bonjour,

    J'aurais besoin d'aide. Voilà, j'ai un exercice en Python où je dois partir d'une image d'un koala et, à la fin, obtenir une image d'un tigre.
    Je pense avoir écrit le bon code, mais j'ai un problème : lorsque j'exécute mon programme, l'image n'est pas normale, elle apparaît sous forme de diagonale.

    Dans l'archive "partie 3", vous trouverez l'image du koala ainsi que celle du tigre. Je ne peux pas vous envoyer les différentes étapes de la transformation.

    Cordialement,

    PS : Je ne suis pas sûr que ce soit le bon endroit pour poster.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    Bonjour

    Le forum peut afficher du texte, du code et des images. Alors pourquoi ces fichiers attachés ? Tu devrais poster directement ton contenu, si tu veux susciter des retours.

  3. #3
    Candidat au Club
    Homme Profil pro
    UPVD Perpignant
    Inscrit en
    Décembre 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : UPVD Perpignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2024
    Messages : 2
    Par défaut
    voila mon code:

    Code python : 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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    import numpy as np
    import cv2
     
    def gauss(A, y):
        n = len(A)
     
        for i in range(n):
            max_row = i + max(range(n - i), key=lambda r: abs(A[i + r][i]))
            A[i], A[max_row] = A[max_row], A[i]
            y[i], y[max_row] = y[max_row], y[i]
            for j in range(i + 1, n):
                if A[j][i] != 0:  
                    factor = A[j][i] / A[i][i]
                    for k in range(i, n):
                        A[j][k] -= factor * A[i][k]
                    y[j] -= factor * y[i]
     
        return A, y
     
     
    def solve_upper_triangular(A, y):
        n = len(A)
        x = [0] * n
     
        for i in range(n - 1, -1, -1):
            if A[i][i] == 0:
                raise ValueError("La matrice A est singulière, impossible de résoudre.")
            sum_ax = sum(A[i][j] * x[j] for j in range(i + 1, n))  
            x[i] = (y[i] - sum_ax) / A[i][i]  
     
        return x
     
    def get_affine_transform(start, end):
        if len(start) != 3 or len(end) != 3:
            raise ValueError("Les listes de points doivent contenir exactement 3 points.")
        A = []
        B = []
     
        for i in range(3):
            x, y = start[i]
            x_prime, y_prime = end[i]
            A.append([x, y, 1, 0, 0, 0])
            A.append([0, 0, 0, x, y, 1])
            B.append(x_prime)
            B.append(y_prime)
     
        A = np.array(A)
        B = np.array(B)
     
        a = np.linalg.solve(A, B)
     
        affine_matrix = np.array([[a[0], a[1], a[2]], 
                                   [a[3], a[4], a[5]]])
     
        return affine_matrix
     
    def morph_images(img1, img2, alpha, points1, points2):
        if img1.shape != img2.shape:
            raise ValueError("Les images doivent avoir la même taille.")
     
        affine_transform = get_affine_transform(points1, points2)
     
        morphed_image = np.zeros_like(img1)
     
        for y in range(img1.shape[0]):
            for x in range(img1.shape[1]):
                src_point = np.array([x, y, 1])  
                transformed_point = affine_transform @ src_point  
     
                x_transformed = int(transformed_point[0])
                y_transformed = int(transformed_point[1])
     
                if 0 <= x_transformed < img1.shape[1] and 0 <= y_transformed < img1.shape[0]:
                    color1 = img1[y_transformed, x_transformed]
                    color2 = img2[y, x]  
                    morphed_color = (1 - alpha) * color1 + alpha * color2
                    morphed_image[y, x] = morphed_color
     
        return morphed_image.astype(np.uint8)
     
    def main():
        start_image = cv2.imread('koala.ppm')
        end_image = cv2.imread('tigre.ppm')
     
        # Points correspondants pour le morphing
        points_start = [(174, 167), (202, 196), (188, 176)]  # Exemple de points sur l'image de départ
        points_end = [(188, 183), (201, 193), (202, 196)]    # Exemple de points sur l'image d'arrivée
     
        for i in range(0, 101, 4):
            alpha = i / 100.0
            morphed_image = morph_images(start_image, end_image, alpha, points_start, points_end)
            cv2.imwrite(f'morphing_{i}.ppm', morphed_image)
     
    if __name__ == "__main__":
        main()

    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Le forum peut afficher du texte, du code et des images. Alors pourquoi ces fichiers attachés ? Tu devrais poster directement ton contenu, si tu veux susciter des retours.
    je peux poster des .ppm ?

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 244
    Par défaut
    Les 6 points que tu donnes semblent problématiques.
    Avance étape par étape , vérifie si ton programme marche avec ces données par exemple.

    points_start = [(174, 167), (202, 196), (188, 176)] # Exemple de points sur l'image de départ
    points_end = [(174, 167), (202, 196), (190, 174)]
    Ou encore
    points_start = [(174, 167), (202, 196), (188, 176)] # Exemple de points sur l'image de départ
    points_end = [(171, 170), (202, 196), (191, 173)]

    Essaie sur des morphing 'simples', puis petit à petit plus tordus.
    Ici, tu parles de 'diagonale', et ça ne me surprend pas du tout.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 244
    Par défaut
    En fait, il y a à mon avis plein de problèmes dans le choix de tes points.
    Tes 3 points de départ sont quasiment alignés, c'est pas terrible. Le morphing va savoir quoi faire avec les points à l'intérieur du triangle, mais ce qu'il va faire pour les points à l'extérieur du triangle, c'est plus 'aléatoire'.
    Prends pour Points_start 3 points qui forment un triangle qui couvre une grande partie de l'image.
    Et dans Points_End, tu déplaces chaque point de quelques pixels.

    Quand tu auras bien vu et assimilé ce qu'il fait, tu peux passer à des transformations plus violentes,

Discussions similaires

  1. Réponses: 32
    Dernier message: 02/11/2009, 15h26

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