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 :

Comparer deux images python


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de luclucdu38
    Homme Profil pro
    autre
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut Comparer deux images python
    Bonjour à tous,

    j'ai beau chercher sur internet, rien a faire, je ne trouve pas ou comprend pas comment comparer deux images. En tout cas comme j'en ai besoin.

    Je voudrais créer une fonction('Image.png') qui prend une capture d'écran puis compare avec celle de la base de donnée. Pas de problème pour la capture d'écran...

    L'image chargé peut être très petite, 10px par 10px comme 500px par 500px. Il faudrait que ma fonction me retourne une réponse positive si cette petite image est présente dans la capture d'écran (donc dans la grande) mais ça peut être n'importe ou dans cette screenshot. Et une réponse négative si celle-ci n'est pas présente bien sûr.

    Je recherche de l'aide car cela fait 1 semaine que je nages littéralement dedans... je suis débutant en python donc mollo les explications svp les gens pas trop technique si vous voyez ce que je vais dire.

    je vous remercie d'avance

    luc

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut,

    Comparer 2 images est d'abord une question d'algorithme.
    Lorsque vous aurez les idées plus claires sur "comment" faire cette comparaison, il sera temps de voir comment coder cela avec Python (ou un autre langage).
    Et les personnes qui vous permettront de définir un algorithme qui tienne la route fréquentent plutôt le forum "Algo".
    Bon courage,

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de luclucdu38
    Homme Profil pro
    autre
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Merci, je vais voir la-bas parce que en fait j'avais pensé à comparer pixel par pixel mais j'ai vite abandonné vue comment c'est long et pas efficace. En cherchant sur internet certaines personnes dises qu'il existe des algorithmes de comparaison pixel par pixel rapide mais je trouve pas et je n'ai pas idée de comment ils font...

    Je ne connais pas le forum, je suis nouveau.

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

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

    apparemment, tu cherches une égalité stricte. Donc la recherche pixel par pixel n'est pas mauvaise en elle-même. Mais il ne faut pas comparer tous les pixels quand il y en a déjà un qui diffère...

    De la même façon, ce qui peut devenir infiniment long, c'est de vouloir récupérer les pixels un a un par une méthode getPixel(), lente. Alors que d'autres méthodes te mettent, en 1 seule fois, ton bout d'image dans un tampon (buffer) dans lequel tu travailles très vite.

    [dernierrecours] Ensuite, des images identiques ont probablement des sommes identiques ou valeurs moyennes identiques, écarts-type identiques, etc... Donc pour rejeter une possibilité, il suffit qu'une fonction comme celles citées, déjà implémentée et super rapide te donne un résultat pour trancher. [/dernierrecours]

  5. #5
    Membre averti Avatar de luclucdu38
    Homme Profil pro
    autre
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    j'ai réussit avec une moyenne de gris pour chaque pixel.

    La grande image est couper en lamelles qui correspondes à 1 pixel de haut. Cet lamelle est comparé avec la première lamelle de la petite image. Si la petite est comprise dans la grande alors on passe à la suivant. Sinon on recommence à la lamelle suivante.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from PIL import Image, ImageGrab
    from os import chdir
    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
     
    # Compare deux listes (l'une dans l'autre) -------------------------------------
     
    def compare_liste(grande,petite):
     
        presence = 0
     
        difference = len(grande)-len(petite)
     
        for n in range(difference):
     
            if grande[n:n+len(petite)] == petite :
                presence = 1
                break
     
        return presence
    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
     
    # Compare ligne par ligne sous forme de liste ----------------------------------
     
    def compare_image(w):
     
        # Variables / Listes -------------------------------------------------------
     
        compteur = 0
        variable = 0
        ecart = 0
     
        # Images -------------------------------------------------------------------
     
        chdir('Images')
     
        screen = ImageGrab.grab() # Screen tout l'ecran (ou une partie de l'ecran)
        taille_screen = screen.size
     
        image = Image.open(w)
        taille_image = image.size
     
        # Capture d'ecran ----------------------------------------------------------
     
        for y in range (taille_screen[1]):
     
            # Reset des listes -----------------------------------------------------
     
            L_screen = []
            L_image = []
     
            # Cree la grande liste -------------------------------------------------
     
            for x in range (taille_screen[0]):
     
                ps = screen.getpixel((x,y))
                L_screen.append(int((ps[0]+ps[1]+ps[2])/3))
     
            # Cree la petite liste -------------------------------------------------
     
            for x in range (taille_image[0]):
     
                ps = image.getpixel((x,y-ecart))
                L_image.append(int((ps[0]+ps[1]+ps[2])/3))
     
            # Compare ligne par ligne ----------------------------------------------
     
            if compare_liste(L_screen,L_image) == 1 :
                compteur = compteur + 1
     
                if compteur == taille_image[1]:
                    variable = 1
                    break
     
            else :
                ecart = ecart + 1
     
        return variable
    La fonction compare_image('photo.png') :

    Renvoie "1" si la photo est comprise dans l'écran, le screen.
    Renvoie "0" si la photo n'est pas comprise dans l'écran, le screen.

    Le temps de traitement est maximum 10 secondes pour une petite photo de 100 par 100.

    De la même façon, ce qui peut devenir infiniment long, c'est de vouloir récupérer les pixels un a un par une méthode getPixel(), lente. Alors que d'autres méthodes te mettent, en 1 seule fois, ton bout d'image dans un tampon (buffer) dans lequel tu travailles très vite.
    Il faudrait que mon temps de traitement soit <1 seconde voir <0.5 secondes pour le top du top.
    ton histoire de buffer m'intéresse mais je ne vois pas comment je peux l'utiliser.

  6. #6
    Membre averti Avatar de luclucdu38
    Homme Profil pro
    autre
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut
    Apres modifications, j'ai réussit à faire mieux :

    La fonction renvoie 'True',x_milieu,y_milieu si l'image est trouvé dans le champs de recherche allant de x1,y1,x2,y2. Par défaut, si les 4 dernières variables ne sont pas entrées, la fonction fait la recherche dans tout l'écran.

    La fonction renvoie 'False','None','None' si l'image n'est pas présente dans le champs de recherche.

    compare_image('image_a_rechercher.png',x1,y1,x2,y2)

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
    def compare_image(image_a_rechercher,*arg):
     
        from PIL import ImageGrab
     
        if len(arg) < 4 :
            x1 = 0
            y1 = 0
            x2 = (ImageGrab.grab().size)[0]
            y2 = (ImageGrab.grab().size)[1]
     
        else :
            x1 = arg[0]
            y1 = arg[1]
            x2 = arg[2]
            y2 = arg[3]
     
        # Variables / Listes -------------------------------------------------------
     
        variable = 'False'
        compteur = 0
        ecart = 0
        dernier = 0
        presence = 0
     
        # Images -------------------------------------------------------------------
        try :
            chdir('Images')
        except:
            int() # Ne fait rien
     
        from PIL import Image
     
        image = Image.open(image_a_rechercher)
        taille_image = image.size
     
        screen = ImageGrab.grab()
        taille_screen = screen.size
     
        # Capture d'ecran ----------------------------------------------------------
     
        for y in range (y1,y2):
            if variable == 'True' : break
     
            # Reset des listes -----------------------------------------------------
     
            L_screen = []
            L_image = []
            presence = 0
     
            # Cree la grande liste -------------------------------------------------
     
            for x in range (x1,x2):
     
                ps = screen.getpixel((x,y))
                L_screen.append(int((ps[0]+ps[1]+ps[2])/3))
     
            # Cree la petite liste -------------------------------------------------
     
            for x in range (taille_image[0]):
     
                ps = image.getpixel((x,y-ecart-y1))
                L_image.append(int((ps[0]+ps[1]+ps[2])/3))
     
            # Compare ligne par ligne ----------------------------------------------
     
            difference = len(L_screen)-len(L_image)
     
            for n in range(difference):
     
                if L_screen[n:n+len(L_image)] == L_image :
                    presence = 1
                    break
     
            # Compte les lignes ----------------------------------------------------
     
            if presence == 1 :
                compteur = compteur + 1
     
                if compteur == taille_image[1]:
                    variable = 'True'
                    break
     
            else :
                if compteur != 0 :
                    ecart = y-y1
                    compteur = 0
     
                else :
                    ecart = ecart + 1
     
        # Sortie de recherche ------------------------------------------------------
     
        if variable == 'False' :
     
            x_milieu, y_milieu = 'None','None'
     
        else :
     
            x_milieu = int(n+taille_image[0]/2)+x1
            y_milieu = int(y-taille_image[1]/2)
     
        return variable, x_milieu, y_milieu
    Si quelqu'un trouve une technique plus rapide, je suis preneur.

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

Discussions similaires

  1. Comparer deux images (100% identiques ou non)
    Par FluidBlow dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/04/2008, 13h40
  2. Comparer deux images
    Par GwenZephyr dans le forum Windows Forms
    Réponses: 6
    Dernier message: 04/03/2008, 16h09
  3. comparer deux images en vbnet
    Par offspring dans le forum VB.NET
    Réponses: 9
    Dernier message: 06/11/2007, 14h13
  4. comparer deux images
    Par alex01pernot dans le forum Delphi
    Réponses: 4
    Dernier message: 03/04/2007, 16h08
  5. Comparer deux images pas directement superposables
    Par Byhias dans le forum Images
    Réponses: 2
    Dernier message: 12/03/2007, 16h41

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