38 votes

Détecter si deux images sont visuellement identiques

Parfois, deux fichiers d'images peuvent être différents au niveau du fichier, mais un être humain les considérerait comme perceptivement identiques. Supposons maintenant que vous ayez une énorme base de données d'images et que vous souhaitiez savoir si un humain penserait qu'une image X est présente dans la base de données ou non. Si toutes les images avaient un hachage perceptif / une empreinte digitale, alors on pourrait hacher l'image X et il serait facile de voir si elle est dans la base de données ou non.

Je sais que des recherches ont été menées sur le sujet et que certains algorithmes existent, mais existe-t-il un outil, tel qu'un outil de ligne de commande UNIX ou une bibliothèque que je pourrais utiliser pour calculer un tel hachage sans avoir à implémenter un algorithme à partir de zéro ?

edit : code pertinent de findimagedupes, utilisant ImageMagick

try $image->Sample("160x160!");
try $image->Modulate(saturation=>-100);
try $image->Blur(radius=>3,sigma=>99);
try $image->Normalize();
try $image->Equalize();
try $image->Sample("16x16");
try $image->Threshold();
try $image->Set(magick=>'mono');
($blob) = $image->ImageToBlob();

éditer : Attention ! L'objet ImageMagick $image semble contenir des informations sur l'heure de création d'un fichier image qui a été lu. Cela signifie que le blob que vous obtenez sera différent même pour la même image, si elle a été récupérée à un moment différent. Pour s'assurer que l'empreinte digitale reste la même, utilisez $image->getImageSignature() comme dernière étape.

14voto

sanxiyn Points 2704

findimagedupes est assez bon. Vous pouvez lancer "findimagedupes -v fingerprint images" pour le laisser imprimer "perceptive hash", par exemple.

5voto

endolith Points 4183

La corrélation croisée ou la corrélation de phase vous indiqueront si les images sont les mêmes, même en présence de bruit, de dégradation et de décalage horizontal ou vertical. L'utilisation des méthodes basées sur la FFT sera beaucoup plus rapide que l'algorithme décrit dans la question.

L'algorithme habituel ne fonctionne pas pour les images qui n'ont pas la même échelle ou rotation, cependant. Vous pourriez les faire pivoter ou les mettre à l'échelle au préalable, mais cela demande beaucoup de temps au processeur. Apparemment, vous pouvez également effectuer la corrélation dans un espace log-polaire et elle sera invariante par rapport à la rotation, la translation et l'échelle, mais je ne connais pas suffisamment les détails pour l'expliquer.

Exemple MATLAB : Enregistrement d'une image en utilisant la corrélation croisée normalisée

Wikipedia appelle cela " corrélation de phase " et décrit également ce qui la rend invariante en termes d'échelle et de rotation. :

La méthode peut être étendue pour déterminer les différences de rotation et d'échelle entre deux images en convertissant d'abord les images en coordonnées log-polaires. Grâce aux propriétés de la transformée de Fourier, les paramètres de rotation et d'échelle peuvent être déterminés d'une manière invariante par rapport à la translation.

4voto

Martin Beckett Points 60406

L'histogramme de couleur est bon pour la même image qui a été redimensionnée, rééchantillonnée, etc.
Si vous voulez faire correspondre les photos d'un même point de repère prises par différentes personnes, c'est plus délicat - regardez les classificateurs haar. Opencv est une excellente bibliothèque gratuite pour le traitement des images.

1voto

Scottie T Points 4655

Je ne connais pas l'algorithme derrière ça, mais Microsoft Live Image Search juste ajouté cette capacité. Picasa a également la capacité d'identifier les visages dans les images, et de regrouper les visages qui se ressemblent. La plupart du temps, il s'agit de la même personne.

Une technologie d'apprentissage automatique telle qu'une machine à vecteur de support, un réseau neuronal, un classificateur de Bayes naïf ou un réseau bayésien serait la meilleure pour ce type de problème. J'ai écrit un de chacun des trois premiers pour classer des chiffres manuscrits, ce qui est essentiellement de la reconnaissance de formes d'images.

0voto

Ape-inago Points 1407

Redimensionnez l'image à 1x1 pixel... si elles sont exactes, il y a une petite probabilité qu'elles soient la même image... maintenant redimensionnez-la à une image de 2x2 pixels, si les 4 pixels sont exacts, il y a une plus grande probabilité qu'ils soient exacts... puis 3x3, si les 9 pixels sont exacts... bonne chance etc... puis 4x4, si les 16 pixels sont exacts, ... plus de chance.

etc...

En procédant de cette manière, vous pouvez améliorer l'efficacité... si la grille de 1x1 pixel est très éloignée, pourquoi s'embêter à vérifier la grille de 2x2 ? etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X