web-dev-qa-db-fra.com

Java bibliothèque pour comparer la similitude des images

J'ai passé pas mal de temps à chercher une bibliothèque qui me permette de comparer des images entre elles en Java.

Je n'ai pas vraiment trouvé quelque chose d'utile, peut-être que mes compétences GoogleSearch ne sont pas assez élevées, alors j'ai pensé que je vous demanderais si vous pouviez m'orienter vers où je pourrais trouver quelque chose comme ça.

Fondamentalement, ce que je veux faire, c'est comparer deux images entre elles et obtenir une valeur de leur similitude. Comme un pourcentage ou deux.

J'espère que vous avez quelque chose que je peux utiliser, je ne saurais pas écrire moi-même quelque chose comme ça ...

PS: Cela ne doit pas nécessairement être en Java, c'est juste l'environnement que mon application exécutera.

52
F.P

Vous pouvez jeter un oeil à deux réponses sur SO lui-même: celui-ci concerne la comparaison d'images elle-même, offrant des liens vers des trucs en C++ (si j'ai lu correctement) tandis que - celui-ci propose des liens vers des approches plus larges, l'une étant en C .

Je suggère de commencer par le deuxième lien car il y a des liens sur cette discussion qui mèneront au code d'implémentation de certaines techniques pertinentes que vous pourrez peut-être "traduire" en Java vous-même.

C'est le mieux que mes compétences Google puissent faire, non Java cependant - désolé. J'espère que c'est un bon point de départ!

EDIT: Voici quelqu'un avec votre problème qui a écrit sa propre classe de comparaison en Java . Je n'ai cependant pas lu le code source. Il déclare expressément qu'il n'a pas pu trouver les bibliothèques Java à cet effet non plus, c'est pourquoi il l'a écrit lui-même.

Oh, et cela question sur SO a probablement les meilleurs liens à ce sujet, tout ce qui concerne Java bibliothèques de traitement d'image. Espérons qu'il y ait l'un d'entre eux qui peut comparer les images pour la similitude.

Ok, dernière modification: Le Java Cookbook de traitement d'images montre une Java implémentation d'un algorithme de base pour déterminer la différence entre deux images) Il a également un e-mail pour contacter le gars qui l'a écrit ainsi qu'un hôte de références. Pas de bibliothèque cependant.

MODIFIER après avoir lu votre commentaire à votre question: à moins que vous n'ayez déjà vérifié tous les liens ci-dessus, puisque ce que vous voulez semble vérifier si deux images sont égales, je suggère de commencer par Java = Livre de recettes de traitement d'images (car il a une implémentation d'un algorithme en Java pour vérifier des images égales) et le dernier lien vers une question SO. Aussi, vérifiez PerceptualImageDiff et le code source de ce projet (C++); cela semble vraiment astucieux - il est apparemment censé vérifier si deux images semblent égales au système visuel humain.

30
G. Bach

Juste en haut de ma tête, OpenCV est une excellente bibliothèque de traitement d'images, mais il pourrait être exagéré si vous voulez simplement comparer des images. Si c'est le cas, j'irais avec ImageJ .

Quelqu'un a déjà demandé comment faire cela en utilisant OpenCV ici .

J'utiliserais C++ pour cela, mais si vous devez utiliser Java, il y a un projet qui a fait un wrapper Java pour OpenCV, ici .

8
dario_ramos

J'ai utilisé la classe dans ce lien pour comparer deux images de produits, et les résultats étaient cool. Il n'est pas très difficile de l'implémenter juste pour être utilisé pour comparer deux images, il vous suffit de supprimer les lignes de JAI et Swing et autres. Il redimensionne les images à 300x300 et renvoie une valeur de différence telle que "1234". La valeur de différence maximale est proche de "11041", elle est indiquée dans le lien. En faisant une division, vous pouvez simplement obtenir le pourcentage. Si cela m'intéresse, je peux poster le code modifié ici plus tard.

Les résultats étaient sympas, mais j'ai quand même obtenu des "photos d'appareils photo numériques", détectées comme étant des "photos TV". J'ai donc utilisé ImageJ pour détecter les bords dans l'image. En utilisant l'opération de détection des bords, ImageJ convertit l'image en une image grise détectée par Edge. Ensuite, j'ai mis les deux images détectées par Edge dans le même comparateur et multiplié les deux valeurs. Les résultats sont devenus encore plus précis.

Obtention de la forme des images détectée par Edge

7
İsmet Alkan