Comparaison d'image

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

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.