J'ai besoin de créer des empreintes digitales de nombreuses images (environ 100 000 existantes, 1000 nouvelles par jour, RVB, JPEG, taille max 800x800) pour comparer très rapidement chaque image à une autre image. Je ne peux pas utiliser de méthodes de comparaison binaires car les images qui sont presque similaires doivent également être reconnues.
Le mieux serait une bibliothèque existante, mais aussi quelques conseils sur les algorithmes existants m'aideraient beaucoup.
Les algorithmes de hachage ou de calcul CRC normaux ne fonctionnent pas bien avec les données d'image. La nature dimensionnelle des informations doit être prise en compte.
Si vous avez besoin d'empreintes digitales extrêmement robustes, telles que les transformations affines (mise à l'échelle, rotation, traduction, retournement) soient prises en compte, vous pouvez utiliser un transformation du radon sur la source d'image pour produire un mappage normatif des données d'image - stockez-le avec chaque image, puis comparez uniquement les empreintes digitales. Il s'agit d'un algorithme complexe et pas pour les faibles de cœur.
quelques solutions simples sont possibles:
Un histogramme de luminosité (en particulier celui qui est séparé en composants RVB) est une empreinte digitale raisonnable pour une image - et peut être mis en œuvre assez efficacement. La soustraction d'un histogramme d'un autre produira un nouvel historgramme que vous pourrez traiter pour décider de la similitude de deux images. Les histogrammes, car les seuls évaluent la distribution et l'occurrence des informations de luminosité/couleur gèrent assez bien les transformations affines. Si vous quantifiez les informations de luminosité de chaque composant de couleur jusqu'à une valeur de 8 bits, 768 octets de stockage sont suffisants pour l'empreinte digitale d'une image de presque n'importe quelle taille raisonnable. Les histogrammes de luminosité produisent des faux négatifs lorsque les informations de couleur d'une image sont manipulées. Si vous appliquez des transformations telles que le contraste/la luminosité, la postérisation, le changement de couleur, les informations de luminosité changent. Les faux positifs sont également possibles avec certains types d'images ... comme les paysages et les images où une seule couleur domine les autres.
L'utilisation d'images mises à l'échelle est un autre moyen de réduire la densité d'informations de l'image à un niveau plus facile à comparer. Les réductions inférieures à 10% de la taille de l'image d'origine perdent généralement trop d'informations pour être utilisées - une image de 800x800 pixels peut donc être réduite à 80x80 et fournir suffisamment d'informations pour effectuer des empreintes digitales décentes. Contrairement aux données d'histogramme, vous devez effectuer une mise à l'échelle anisotrope des données d'image lorsque les résolutions source ont des proportions variables. En d'autres termes, la réduction d'une image 300x800 en miniature 80x80 provoque une déformation de l'image, de sorte que par rapport à une image 300x500 (c'est très similaire), cela provoquera de faux négatifs. Les empreintes digitales miniatures produisent également souvent de faux négatifs lorsque des transformations affines sont impliquées. Si vous retournez ou faites pivoter une image, sa miniature sera très différente de l'original et peut entraîner un faux positif.
La combinaison des deux techniques est un moyen raisonnable de couvrir vos paris et de réduire la présence de faux positifs et de faux négatifs.
Il existe une approche beaucoup moins ad-hoc que les variantes d'images réduites qui ont été proposées ici qui conserve leur saveur générale, mais qui donne une base mathématique beaucoup plus rigoureuse pour ce qui se passe.
Prenez une ondelette Haar de l'image. Fondamentalement, l'ondelette Haar est la succession de différences entre les images de résolution inférieure et chaque image de résolution supérieure, mais pondérée par la profondeur de votre "arbre" de mipmaps. Le calcul est simple. Ensuite, une fois que l'ondelette Haar est pondérée de manière appropriée, jetez tous les coefficients sauf les k les plus grands (en termes de valeur absolue), normalisez le vecteur et enregistrez-le.
Si vous prenez le produit scalaire de deux de ces vecteurs normalisés, cela vous donne une mesure de similitude, 1 étant presque identique. J'ai posté plus d'informations sur ici .
Vous devriez certainement jeter un œil à phash .
Pour la comparaison d'images, il y a ce projet php : https://github.com/kennethrapp/phasher
Et mon petit clone javascript : https://redaktorcms.com/dev/phasher/demo_js/index.html
Malheureusement, c'est basé sur le "bitcount" mais reconnaîtra les images tournées. Une autre approche en javascript était de construire un histogramme de luminosité à partir de l'image à l'aide d'une toile. Vous pouvez visualiser un histogramme de polygone sur le canevas et comparer ce polygone dans votre base de données (par exemple mySQL spatial ...)
Ceci est une démo pour les histogrammes vidéo: https://redaktorcms.com/dev/globetrottr/testHashVideo.php
Il y a longtemps, j'ai travaillé sur un système qui avait des caractéristiques similaires, et ceci est une approximation de l'algorithme que nous avons suivi:
Donc, pour chaque image, vous stockez n + 1
valeurs entières, où n
est le nombre de zones que vous suivez.
Pour les comparaisons, vous devez également regarder chaque canal de couleur individuellement.
Cela vous permet de supprimer rapidement les images qui ne correspondent pas; vous pouvez également utiliser plus de zones et/ou appliquer l'algorithme de manière récursive pour obtenir une plus grande confiance dans les correspondances.
Semblable à la réponse d'Ic - vous pouvez essayer de comparer les images à plusieurs résolutions. Ainsi, chaque image est enregistrée au format 1x1, 2x2, 4x4 .. 800x800. Si la résolution la plus basse ne correspond pas (sous réserve d'un seuil), vous pouvez la rejeter immédiatement. Si cela correspond, vous pouvez les comparer à la prochaine résolution supérieure, etc.
De plus, si les images partagent une structure similaire, comme des images médicales, vous pourrez peut-être extraire cette structure dans une description plus facile/plus rapide à comparer.
Donc, vous voulez faire une "correspondance d'empreintes digitales" qui est assez différente de la "correspondance d'images". L'analyse des empreintes digitales a été étudiée en profondeur au cours des 20 dernières années, et plusieurs algorithmes intéressants ont été développés pour assurer le bon taux de détection (par rapport à [~ # ~] loin [~ # ~] et [~ # ~] frr [~ # ~] mesures - Taux de fausse acceptation et Taux de faux rejet ).
Je vous suggère de mieux regarder LFA (Local Feature Analysis) classe de techniques de détection, principalement basée sur l'inspection minutieuse. Les minutiae sont des caractéristiques spécifiques de toute empreinte digitale et ont été classées en plusieurs classes. Cartographier une image raster sur une carte minutieuse est ce que la plupart des autorités publiques font pour déposer des criminels ou des terroristes.
Voir ici pour d'autres références
Pour la comparaison d'images iPhone et le développement de similitudes d'images, consultez: http://sites.google.com/site/imagecomparison/
Pour le voir en action, consultez eyeBuy Visual Search sur l'AppStore iTunes.
À partir de 2015 (retour vers le futur ... sur cette question de 2009 qui est désormais bien classée dans Google), la similitude des images peut être calculée à l'aide de techniques d'apprentissage en profondeur. La famille d'algorithmes connus sous le nom d'encodeurs automatiques peut créer une représentation vectorielle qui peut être recherchée pour la similitude. Il y a une démo ici .
Une façon de le faire est de redimensionner l'image et de réduire la résolution de manière significative (à 200x200 peut-être?), En stockant une version plus petite (moyenne en pixels) pour faire la comparaison. Définissez ensuite un seuil de tolérance et comparez chaque pixel. Si le RVB de tous les pixels est dans la tolérance, vous avez une correspondance.
Votre parcours initial est O (n ^ 2) mais si vous cataloguez toutes les correspondances, chaque nouvelle image n'est qu'un algorithme O(n) à comparer (il vous suffit de le comparer à chacun précédemment) image insérée) .Elle finira par tomber en panne à mesure que la liste des images à comparer s'allonge, mais je pense que vous êtes en sécurité pendant un certain temps.
Après 400 jours de fonctionnement, vous aurez 500 000 images, ce qui signifie (réduction du temps pour redimensionner l'image) 200(H)*200(W)*500,000(images)*3(RGB)
= 60 000 000 000 comparaisons. Si chaque image correspond exactement, vous allez prendre du retard, mais ce ne sera probablement pas le cas, non? N'oubliez pas que vous pouvez actualiser une image en tant que correspondance dès qu'une seule comparaison dépasse votre seuil.
Voulez-vous littéralement comparer chaque image avec les autres? Quelle est l'application? Peut-être avez-vous juste besoin d'une sorte d'indexation et de récupération d'images basées sur certains descripteurs? Ensuite, par exemple, vous pouvez consulter la norme MPEG-7 pour l'interface de description de contenu multimédia. Ensuite, vous pouvez comparer les différents descripteurs d'images, qui ne seront pas aussi précis mais beaucoup plus rapides.
Il semble que les algorithmes de hachage d'image spécialisés soient un domaine de recherche active, mais peut-être qu'un calcul de hachage normal des octets d'image ferait l'affaire.
Cherchez-vous des images identiques en octets plutôt que des images dérivées de la même source mais qui peuvent être d'un format ou d'une résolution différents (ce qui me semble être un problème plutôt difficile).