Je vois vraiment pas de raison d'utiliser toutes les bibliothèques externes pour cela, j'ai fait ce genre de chose de nombreuses fois et l'algorithme suivant fonctionne très bien. Je suppose que si vous comparez les deux images qu'ils ont les mêmes dimensions, mais vous pouvez tout simplement redimensionner si ils ne le font pas.
badness := 0.0
For x, y over the entire image:
r, g, b := color at x,y in image 1
R, G, B := color at x,y in image 2
badness += (r-R)*(r-R) + (g-G)*(g-G) + (b-B)*(b-B)
badness /= (image width) * (image height)
Maintenant vous avez un normalisée de la méchanceté de valeur entre les deux images, le bas de la méchanceté, plus il est probable que les images du match. C'est simple et efficace, il existe une variété de choses qui rendent le travail mieux ou plus vite, dans certains cas, mais vous n'avez probablement pas besoin de quoi que ce soit. Vous n'avez même pas vraiment besoin de normaliser la méchanceté, mais de cette façon, vous pouvez juste venir avec un seuil unique pour cela, si vous voulez regarder plusieurs correspondances possibles manuellement.
Depuis que cette question a reçu un peu plus d'attention j'ai décidé d'ajouter un moyen pour accélérer le processus dans le cas où vous êtes le traitement de nombreuses images à plusieurs reprises. J'ai utilisé cette approche lorsque j'ai eu plusieurs dizaines de milliers d'images que j'avais besoin de comparer, et j'étais sûr qu'un type paire d'images serait très différent. Je savais aussi que toutes mes images seraient exactement les mêmes dimensions. Dans une situation dans laquelle vous êtes en comparant les boîtes de dialogue typique d'images peut être principalement gris-ish, et certaines de vos images peut exiger de redimensionnement (bien que peut-être, qui indique juste une mis-match), dans ce cas, cette approche peut ne pas gagner autant.
L'idée est de former un quad-arbre où chaque nœud représente la moyenne des valeurs RVB de la région qui nœud représente. Ainsi, un 4x4 de l'image aurait un nœud racine RVB avec des valeurs égales à la moyenne de la valeur RVB de l'image, ses enfants auraient valeurs RVB, représentant la moyenne de la valeur RVB de leur 2x2 régions, et leurs enfants représentent les pixels individuels. (Dans la pratique c'est une bonne idée de ne pas aller plus loin qu'une région d'environ 16x16, à ce point, vous devez simplement commencer à comparer les pixels).
Avant de commencer à comparer des images, vous aurez également besoin de décider sur un méchanceté seuil. Vous n'aurez pas à calculer badnesses au-dessus de ce seuil avec toute la fiabilité de la précision, c'est donc essentiellement le seuil à partir duquel vous êtes prêt pour une image de "ne pas être un match".
Maintenant, quand vous comparez l'image A image B, d'abord comparer les nœuds racine de leur quad-arbre de représentations. Calculer la méchanceté comme vous le feriez pour un seul pixel de l'image, et si la méchanceté dépasse le seuil de retourner immédiatement et le rapport de la méchanceté à ce niveau. Parce que vous êtes à l'aide normalisé badnesses, et depuis badnesses sont calculés à l'aide de différences au carré, la méchanceté, à quelque niveau égal ou inférieur à la méchanceté à des niveaux inférieurs, de sorte que si elle dépasse le seuil de points vous savez il permettra également de dépasser le seuil au niveau de chacun des pixels.
Si le test de seuil passe sur un nxn image, il suffit de le déposer au niveau suivant vers le bas et de la comparer comme si c'était un 2nx2n image. Une fois que vous obtenez assez bas il suffit de comparer les pixels individuels. En fonction de votre corpus d'images, cela peut vous permettre de sauter beaucoup de comparaisons.