2011-12-27 22 views
49

Pasé bastante tiempo investigando para una biblioteca que me permite comparar imágenes entre sí en Java.Biblioteca de Java para comparar la similitud de la imagen

Realmente no encontré nada útil, tal vez mi GoogleSearch-skill no es lo suficientemente alta, así que pensé en preguntarles si podrían indicarme dónde encontrar algo como esto.

Básicamente lo que quiero hacer es comparar dos imágenes entre sí y obtener un valor de cuánto son similares. Como un porcentaje más o menos.

espero que ustedes tienen algo que pueda usar, no sabría cómo escribir algo así a mí mismo ...

PS: No necesariamente tiene que ser en Java, que es sólo el medio ambiente mi aplicación se ejecutará

+0

¿Qué tipo de similitud desea comparar? Las imágenes son del mismo tamaño, o podrían ser escaladas/giradas/recortadas? – dbf

+1

Solo quiero saber si las dos imágenes son las mismas (de un POV humano) –

+0

Recientemente descubrí una increíble lib llamada Rainbow4j, desarrollada y utilizada por los chicos de Galen framework. Puede comparar imágenes basadas en diferencias de píxeles, diferencias de color, etc. con mucha capacidad de configuración. – kaqqao

Respuesta

28

Puede echar un vistazo a dos respuestas en el propio SO: this one is about image comparison itself, offering links to stuff in C++ (si leo correctamente) mientras this one offers links to broader approaches, one being in C.

Sugiero comenzar con el segundo enlace ya que hay enlaces en esa discusión que llevarán al código de implementación de algunas técnicas relevantes que usted podría ser capaz de "traducir" a Java usted mismo.

Eso es lo mejor que pueden hacer mis habilidades en Google, aunque Java, lo siento. ¡Espero que sea un buen punto de partida!

EDITAR: Here's someone with your problem who wrote his own comparison class in Java. Aunque no leí el código fuente. Expresamente declara que tampoco pudo encontrar bibliotecas de Java para ese propósito, por eso lo escribió él mismo.

Ah, y esto question on SO has probably the best links en esto, todo con respecto a las bibliotecas de Java de procesamiento de imágenes. Con suerte, hay uno entre ellos que puede comparar imágenes por similitud.

Ok, última edición: The Java Image Processing Cookbook muestra una implementación de Java de un algoritmo básico para determinar la diferencia entre dos imágenes. También tiene un correo electrónico para contactar al tipo que lo escribió, así como a una serie de referencias. Sin embargo, no hay biblioteca

EDITAR después de leer su comentario a su pregunta: A menos que ya haya comprobado todos los enlaces anteriores, ya que lo que desea parece estar comprobando si dos imágenes son iguales, sugiero comenzar con el Java Image Processing Cookbook (ya que tiene una implementación de un algoritmo en Java para verificar imágenes iguales) y el último enlace a una pregunta SO. Además, check PerceptualImageDiff y el código fuente de ese proyecto (C++); suena realmente ingenioso: aparentemente se supone que debe verificar si dos imágenes se ven iguales al sistema visual humano.

+0

Exploré sus recursos, especialmente el artículo con la implementación simple fue realmente útil. –

+0

dang .. 404 no encontrado para ese libro de cocina enlace – tObi

+0

@tobi El [archivo] (http://archive.org) todavía tiene una versión; actualizando mi publicación –

8

Justo fuera de mi cabeza, OpenCV es una gran biblioteca de procesamiento de imágenes, pero podría ser exagerado si solo quiere comparar imágenes. Si ese es el caso, iría con ImageJ.

Alguien ya ha preguntado cómo hacer esto usando OpenCV here.

Usaría C++ para esto, pero si debe usar Java, hay un proyecto que creó Java wrapper para OpenCV, here.

7

Utilicé la clase en this link para comparar dos imágenes de productos, y los resultados fueron geniales.No es muy difícil implementarlo solo para ser usado para comparar dos imágenes, solo necesitas borrar las líneas de JAI y Swing y demás. Cambia el tamaño de las imágenes a 300x300 y devuelve un valor de diferencia como "1234". El valor de la diferencia máxima está cerca de "11041", se indica en el enlace. Haciendo una división, simplemente puede obtener el porcentaje. Si está interesado, puedo publicar el código modificado aquí más tarde.

Los resultados fueron geniales, pero aún obtuve "fotos de cámara digital", detectadas como similares a "fotos de TV". Por lo tanto, utilicé ImageJ para detectar bordes en la imagen. Usando la operación de detección de bordes, ImageJ convierte la imagen en una imagen de formato gris detectada en el borde. Luego puse las dos imágenes detectadas en el borde en el mismo comparador y multipliqué los dos valores. Los resultados se volvieron aún más precisos.

Getting the edge-detected form of the images

Cuestiones relacionadas