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.
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.