11
votes

Comparaison d'image avec PHP + GD

Quelle est la meilleure approche pour comparer deux images avec PHP et le tirage graphique ( Gd) bibliothèque ?

Ceci est le scénario:

 text alt

J'ai une image, et je veux trouver quelle image d'un ensemble donné est le plus semblable à celle-ci. L'image la plus similaire est en fait la même image, pas de pixel parfait match mais la même image. J'ai dramatisé la différence entre les deux images avec le numéro un sur l'exemple simplement pour faciliter la compréhension de ce que je voulais dire.

Même si cela n'a apporté aucun résultat cohérent, mon approche consistait à réduire les images à 1px à l'aide du ImageCopyResamplé Fonction et voyez comment la fermeture des valeurs RVB où entre les images.

La somme des valeurs de déduction de chaque valeur équivalente décimale rouge, verte et bleue de la valeur équimale décimale rouge, verte et bleue du match éventuel m'a donné un indice de dissimilarité qui, même s'il n'a pas fonctionné comme prévu depuis pas toujours L'image la plus RVB similaire était l'image cible, je pourrais utiliser pour sélectionner une image à partir des objectifs disponibles.

Voici un échantillon de la sortie lors de la comparaison de 4 images contre une image cible, dans ce cas, le logo Apple, qui correspond à l'une d'entre elles mais n'est pas exactement la même:

Image originale:

 Rouge: 222 Vert: 226 Bleu: 232

comparé contre:

http://a1.Twimg.com/profile_images/571171388/Logo -Twitter_normal.png Rouge: 183 Vert: 212 Bleu: 212 Et un indice de similitude de 56

 Rouge: 117 vert: 028 bleu: 028 et un index de la dissimilarité 530

 Rouge: 218 Vert: 221 Bleu: 221 et un index de la dissimilarité 13 correspondant correctement.

Rouge: 061 Vert: 063 Bleu: 063 et un index de la dissimilarité 491

ne peut même pas être mieux faisable avec de meilleurs résultats que ce que je reçois déjà et je gaspille mon temps ici, mais comme il semble y avoir beaucoup de programmeurs de PHP expérimentés, je suppose que vous pouvez me signaler dans les bonnes directions sur Comment améliorer cela.

Je suis ouvert à d'autres bibliothèques d'images telles que Imagick , < Un href = "http://www.php.net/manual/fr/book.gmagick.php" rel = "nofollow noreferrer"> Gmagick ou Le Caire pour PHP mais je préférerais éviter d'utiliser d'autres langues que PHP.

Merci d'avance.


3 commentaires

Donc, vous voulez battre le CAPTCHA?


Pas un CAPTCHA, les images sont identiques que j'ai dit, non tournées, aucune ligne au milieu, pas de flou. Cela fait partie d'un projet plus grand que j'ai et que je ne peux pas sembler avoir dépassé cela efficacement.


Dupliqué possible de Comment détecter des images similaires dans PHP?


4 Réponses :


4
votes

J'aurais pensé que votre approche semble raisonnable, mais la réduction d'une image entière à 1x1 pixel de taille est probablement une étape trop loin.

Toutefois, si vous avez converti chaque image en même taille, puis a calculé la couleur moyenne de chaque 16x16 (ou 32x32, 64x64, etc. En fonction de la quantité de temps de traitement / de l'alimentation que vous souhaitez utiliser) Cell, vous devriez pouvoir être capable de former une sorte de comparaison raisonnable (------z).


3 commentaires

Fini par utiliser mon code et depuis que vous avez dit que c'était raisonnable, alors hé, vous obtenez la réponse acceptée


Désolé de remuer un vieux fil, mais je suis exactement dans la même situation. Les remerciements à la liaison Imagecopyresamplé, je peux redimensionner les images, mais comment puis-je calculer exactement la couleur moyenne dans chaque image 16x16?


@ Marci-Man à un niveau très basique, vous pouvez utiliser Imagecolorat pour obtenir les valeurs RVB pour les pixels dans cette "cellule" puis en moyenne pour obtenir une valeur pour la cellule dans son ensemble.



-1
votes

Utilisation des méthodes de Middpararka, vous pouvez transformer chaque image en une séquence de valeurs numériques, puis utiliser L'algorithme de Levenshtein pour trouver la correspondance la plus proche.


2 commentaires

Comment l'algorithme de Levenshtein peut-il aider ici? Citant "La distance de Levenshtein entre deux chaînes est donnée par le nombre minimum d'opérations nécessaires à la transformation d'une chaîne de l'autre" et, étant donné que toutes les séquences seront formées par trois numéros 2Digit, le nombre d'opérations va toujours être 3. Sauf si Ils ont des valeurs rouges, vertes ou bleues identiques, ce qui ne signifie pas nécessairement que c'est la couleur la plus proche et quel est l'image similaire-est.


Et en tant que bonus, PHP a déjà une fonction LEVENSHTEINN: PHP.net/manual/fr/ fonction.levenshtein.php



0
votes

Je suggérerais, comme Middaparka, que vous ne réprimonnez que sur une image de 1 pixel, car vous perdez toutes les informations spatiales. Downsampling à 16x16 (ou 32x32, etc.) fournirait certainement de meilleurs résultats.

Ensuite, cela dépend également de la question de savoir si des informations de couleur sont importantes ou non pour vous. D'après ce que je comprends, vous pouvez réellement faire sans elle et calculer une image de niveau gris à partir de votre image couleur (par exemple de votre luma) et calculez la corrélation croisée. Si, comme vous l'avez dit, il y a quelques images qui correspond exactement à (à l'exception des informations de couleur) Cela devrait vous donner une très bonne fiabilité.


0 commentaires

0
votes

J'ai utilisé les idées de Scaling , Downsampling et niveau de gris mentionné dans la question et les réponses, pour appliquer une moyenne Erreur carrée entre les canaux de pixels Valeurs pour 2 images, en utilisant bibliothèque GD .

the code est dans cette réponse , y compris un test avec ces idées.

aussi j'ai fait des benckmarking et je pense que le descending ne pourrait pas être nécessaire dans ces petites images, car la méthode est rapide (en cours de PHP), une fraction de une seconde.


0 commentaires