Picor, un outil pour trouver, à partir d'une image de référence, l'image la plus proche dans une collection
Cet outil permet d'expérimenter différentes méthodes pour identifier, à partir d'une image donnée, l'image la plus proche dans une collection. Il est adapté pour travailler avec des collections d'images où il y a beaucoup d'images similaires.
Le cas d'usage spécifiquement étudié dans ce projet est, à partir d'une image tirée d'une vidéo, de pouvoir retrouver exactement l'image correspondante dans la vidéo, sachant que l'image recherchée peut avoir des différences:
- d'encodage,
- de résolution,
- de qualité,
- de colorimétrie.
Le code source ainsi que les instructions d'installation et d'utilisation sont disponibles sur la page GitHub du projet.
Méthodes utilisées
Actuellement deux méthodes sont présentes dans l'outil:
- la corrélation croisée (ou intercorrélation)
- le hachage moyen (ou average hash)
Dans tous les cas, l'image est préparée en amont:
- redimensionnement en 32x32 pixels,
- passage en niveau de gris.
La corrélation croisée
Elle s'exprime de cette façon:
où:
r
est le résultat de la corrélation,x
ety
sont deux images à comparer (niveau de gris),i
est l'itérateur des pixels des images.
Plus r
est proche de 1, plus les images sont similaires.
Le code C est dans le fichier lib/xcorr.c.
Hachage moyen
Cette méthode consiste à prendre le vecteur de pixels de l'image (niveau de gris), et à calculer la moyenne. Ensuite, pour chaque pixel supérieur ou égal à la moyenne, on ajoute un 1
(binaire) au haché, et pour chaque pixel inférieur on ajoute un 0
.
Pour comparer deux images, il faut calculer une distance entre leurs hachés. Plus la distance est faible, plus les images sont similaires.
Le code C est dans le fichier lib/avghash.c.
Résultats
Les deux méthodes permettent d'obtenir des résultats très proches. Cependant, l'utilisation du hachage moyen permet d'indexer la collection d'images en amont, pour effectuer des recherches plus tard.
Ci-dessous, voici un exemple de résultat. Le film d'animation Elephants Dream des studios Blender a été utilisé. La collection des images est en JPG, de résolution 1920x1080. L'image recherchée est également en JPG de résolution 434x244, et de mauvaise qualité.
Le temps de traitement des images d'entrée (en JPG) n'est pas pris en compte dans les durées affichées.
Ceci est un exemple de sortie de picor-basic-pic-retriever-stats
. Il a été exécuté avec 551 images sur un PC portable Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz de 2017.
Hachage moyen
Calcul des hashs effectué en 0.001447s, comparaison en 0.000042s.
Résultat complet - Vous pouvez utiliser les flèches directionnelles gauche ⬅️ et droite ➡️ pour naviguer dans la collection, et backspace ⌫ pour revenir à la meilleure image trouvée.
Correlation croisée
Corrélation croisée effectuée en 0.001465s.
Résultat complet - Vous pouvez utiliser les flèches directionnelles gauche ⬅️ et droite ➡️ pour naviguer dans la collection, et backspace ⌫ pour revenir à la meilleure image trouvée.
Après plusieurs essais sur différentes vidéos et avec différentes qualités d'image, il en ressort que le hachage moyen et la corrélation croisée sont des méthodes très efficaces pour ce genre d'exercice, aussi bien sur le plan de la précision de l'image retrouvée que sur la consommation en ressources machine.