Comparaison d'image

Soyez le premier à donner votre avis sur cette source.

Vue 21 117 fois - Téléchargée 816 fois

Description

Un code simple et rapide pour comparer deux images.
Ma fonction fait une première passe rapide sur la couleur moyenne, regarde les proportions puis si nécessaire vérifie les couleurs par pixels sur un échantillon.

On peut régler en fonction du besoin la tolérance de couleur et la tolérance de forme.

'SYNTAXE: ComparerDeuxImages(image1,image2,verifierProportions,TailleEchantillon,toleranceDeCouleur)

'PARAMETRES:
'verifierProportions: si ce parametre est à true, on différencie les images de proportions différentes (ex: 9*10 et 10*10) -tolérance de 1%
'TailleEchantillon: définit la taille de la miniature qui sera utilisée pour la comparaison. La fonction est plus rapide sur un echantillon proche de 1 et plus précise (et moins tolérante) si l'échantillon est loin de 1. Par experience 25 donne des résultats satisfaisants pour moi.
'toleranceDeCouleur: nombre entre 0 et 255 qui définit la différence de couleur autorisée sur chaque canal

Source / Exemple :


#Region "Comparer deux images"
    'PARAMETRES: 
    'verifierProportions: si ce parametre est à true, on différencie les images de proportions différentes (ex: 9*10 et 10*10) -tolérance de 1%
    'TailleEchantillon: définit la taille de la miniature qui sera utilisée pour la comparaison. La fonction est plus rapide sur un echantillon proche de 1 et plus précise (et moins tolérante) si l'échantillon est loin de 1. Par experience 25 donne des résultats satisfaisants pour moi.
    'toleranceDeCouleur: nombre entre 0 et 255 qui définit la différence de couleur autorisée sur chaque canal

    Public Function ComparerDeuxImages(ByVal image1 As Image, ByVal image2 As Image, Optional ByVal verifierProportions As Boolean = True, Optional ByVal TailleEchantillon As Integer = 25, Optional ByVal toleranceDeCouleur As Byte = 5) As Boolean
        'Je fais un premier test rapide de couleur et de forme pour débusquer les images très différentes:
        If FonctionComparaisonImages(image1, image2, verifierProportions, 1, toleranceDeCouleur) = False Then
            Return False '-->elles sont tres différentes
        Else
            'si je les trouve proche, je confirme par un test plus précis, mais sans revérifier les proportions (déja fait si demandé)
            If FonctionComparaisonImages(image1, image2, False, TailleEchantillon, toleranceDeCouleur) = False Then
                Return False '--> elles ne sont pas suffisemment proches pour être considérées identiques
            Else
                Return True '--> elles sont semblables
            End If
        End If

    End Function

    Private Function FonctionComparaisonImages(ByVal image1 As Image, ByVal image2 As Image, Optional ByVal verifierProportions As Boolean = True, Optional ByVal TailleEchantillon As Integer = 25, Optional ByVal toleranceDeCouleur As Byte = 5) As Boolean

        'vérifier que les images ont les memes proportions
        If verifierProportions = True Then
            If Math.Abs(image1.Height / image2.Height - image1.Width / image2.Width) >= 0.01 Then Return False
        End If

        'vérifier la précision:
        If TailleEchantillon < 1 Then TailleEchantillon = 1
        If TailleEchantillon > image1.Width Then TailleEchantillon = image1.Width
        If TailleEchantillon > image2.Width Then TailleEchantillon = image2.Width
        If TailleEchantillon > image1.Height Then TailleEchantillon = image1.Height
        If TailleEchantillon > image2.Height Then TailleEchantillon = image2.Height

        'On fait une miniature carrée des deux images que l'on va comparer
        'IMAGE1
        Dim Thumb1 As New Bitmap(TailleEchantillon, TailleEchantillon)
        Dim Graph1 As Graphics = Graphics.FromImage(Thumb1)
        Graph1.InterpolationMode = Drawing2D.InterpolationMode.Low
        Graph1.DrawImage(image1, New Rectangle(0, 0, TailleEchantillon, TailleEchantillon))
        Graph1.Dispose()

        'IMAGE2
        Dim Thumb2 As New Bitmap(TailleEchantillon, TailleEchantillon)
        Dim Graph2 As Graphics = Graphics.FromImage(Thumb2)
        Graph2.InterpolationMode = Drawing2D.InterpolationMode.Low
        Graph2.DrawImage(image2, New Rectangle(0, 0, TailleEchantillon, TailleEchantillon))
        Graph2.Dispose()

        Dim temp1 As Integer
        Dim temp2 As Integer
        'pour chaque pixel des images miniatures on vérifie que les couleurs RGB sont identiques à la toleranceDeCouleur près
        For x As Integer = 0 To TailleEchantillon - 1
            For y As Integer = 0 To TailleEchantillon - 1
                temp1 = (Thumb1.GetPixel(x, y).B)
                temp2 = (Thumb2.GetPixel(x, y).B)
                If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False
                temp1 = (Thumb1.GetPixel(x, y).G)
                temp2 = (Thumb2.GetPixel(x, y).G)
                If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False
                temp1 = (Thumb1.GetPixel(x, y).R)
                temp2 = (Thumb2.GetPixel(x, y).R)
                If Math.Abs(temp1 - temp2) > toleranceDeCouleur Then Return False
            Next
        Next

        'si on est pas encore sorti de la fonction les images sont similaires:
        Return True

    End Function

#End Region

Conclusion :


La première passe rapide pour éliminer les images de couleur différente trop éloignée, et le passage par un échantillon pour la comparaison de pixel rend cette fonction assez rapide et précise.
Je débute, toute remarque constructive est la bienvenue. La prochaine étape sera surement une visualisation des différences entre images et un % de ressemblance.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Bonsoir,

Merci pour ta réponse.

L'image du dossier n'était qu'à titre d'exemple.

Par exemple dans plusieurs images, je cherche une meme image mais à position différente.

En gros sa balayerai des coin xy haut gauche de ton ecran jusque bas droit, comme le code cherche pixel qui à été déposé.
Mais à la place d'un pixel, et bien un groupe de pixel.
Messages postés
24
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 janvier 2010

Effectivement ça risque d’être long et très peu fiable d'autant qu'avec windows 7 la taille des icônes se change d'un simple coup de molette de souris.
Utilise plutôt l'object filesystemwatcher() inclus en natif en vb.net pour surveiller les activités de ton dossier. Les positions des icones et le format d'affichage doivent être dans un fichier caché dans ton dossiers desktop, à ta place je chercherais plus dans ce sens, tu auras un code rapide grace aux objects de windows.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Bonjour,

Dis moi, j'espère que je pollue pas trop ton poste, mais j'aurai une petite question.
Dans cette source, tu explique comment comparer deux images en connaissant ces coordonnée X, Y.
Serai t-il possible, de chercher une image sans connaitre ces coordonnées ?
Par exemple je cherche l'image d'un dossier sur le bureau, il detecte la position et me l'affiche dans un textbox.. et à chaque fois que je bouge le dossier, le textbox se met à jours.
Je suppose que ce sera avec une boucle et que le traitement sera beaucoup plus lourd.
Merci d'avance et désolé de squatter ta source x)
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Je viens de découvrir comment mettre une note.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Salut,

Je vois un peu tard (^^) que je n'avais pas donné suite à ton message.
Ok merci pour le complément d'information.
Je me sert de ton code et il est 100% opérationnel, merci encore.

A plus tard.
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.