2008-08-25 21 views
77

Me gustaría comparar una captura de pantalla de una aplicación (podría ser una página web) con una captura de pantalla tomada anteriormente para determinar si la aplicación se muestra correctamente. No quiero una comparación de coincidencia exacta, porque el aspecto podría ser ligeramente diferente (en el caso de una aplicación web, dependiendo del navegador, algún elemento podría estar en una ubicación ligeramente diferente). Debería dar una medida de cuán similares son las capturas de pantalla.¿Cómo puedo medir la similitud entre dos imágenes?

¿Existe una biblioteca/herramienta que ya lo haga? ¿Cómo lo implementarías?

+1

Hay algunas buenas respuestas en esta otra pregunta similar: http://stackoverflow.com/questions/75891/ algorithm-for-finding-similar-images – blak

+1

Y más aquí: http://stackoverflow.com/questions/189943/how-can-i-quantify-difference-between-two-images – Anoyz

+0

Es hora de actualizar las respuestas a la luz de los recientes avances en Machine Learning y más específicamente "Deep Learning". – jldupont

Respuesta

61

Esto depende completamente de cuán inteligente quiera que sea el algoritmo.

Por ejemplo, aquí hay algunas cuestiones:

  • imágenes recortadas frente a una imagen sin recortar
  • imágenes con un texto añadido vs.otro sin
  • imágenes reflejadas

El algoritmo más fácil y sencilla que he visto para esto es sólo para que realice los siguientes pasos para cada imagen:

  1. escala para algo pequeño, como 64x64 o 32x32, desatender la relación de aspecto, usar un algoritmo de escala combinada en lugar del píxel más cercano
  2. escalar los rangos de color para que el más oscuro sea negro y el más claro sea blanco
  3. rotar y voltear la imagen de modo que el color lighest es superior izquierda, y luego la parte superior derecha se siguiente más oscuro, inferior izquierda está al lado más oscuro (la medida de lo posible, por supuesto)

Editar A combinando El algoritmo de escalado es aquel que al escalar 10 píxeles a uno lo hará usando una función que toma el color de esos 10 píxeles y los combina en uno. Se puede hacer con algoritmos como promediado, valor medio o más complejos, como splines bicúbicos.

A continuación, calcule la distancia media píxel por píxel entre las dos imágenes.

Para buscar una posible coincidencia en una base de datos, almacene los colores de los píxeles como columnas individuales en la base de datos, indexe un grupo de ellos (pero no todos, a menos que use una imagen muy pequeña) y haga una consulta que use un rango para cada valor de píxel, es decir. cada imagen donde el píxel de la imagen pequeña se encuentra entre -5 y +5 de la imagen que desea buscar.

Esto es fácil de implementar, y bastante rápido de ejecutar, pero por supuesto no manejará las diferencias más avanzadas. Para eso necesitas algoritmos mucho más avanzados.

+13

¿Qué es un "algoritmo de escala combinada"? –

2

Bueno, no para responder su pregunta directamente, pero he visto esto suceder. Microsoft lanzó recientemente una herramienta llamada PhotoSynth que hace algo muy similar para determinar áreas superpuestas en una gran cantidad de imágenes (que podrían tener diferentes relaciones de aspecto).

Me pregunto si tienen bibliotecas o fragmentos de código disponibles en su blog.

+0

Esta tecnología. Ha sido descontinuado. –

8

Necesitarás pattern recognition para eso. Para determinar pequeñas diferencias entre dos imágenes, Hopfield nets funcionan bastante bien y son bastante fáciles de implementar. Sin embargo, no conozco ninguna implementación disponible.

4

Me pregunto (y realmente estoy tirando la idea por ahí para derribarla) si algo se puede deducir restando una imagen de la otra, y luego comprimiendo la imagen resultante como un jpeg de gif, y tomando el tamaño del archivo como una medida de similitud.

Si tuviera dos imágenes idénticas, obtendría una caja blanca, que se comprimiría muy bien. Cuanto más difieran las imágenes, más complejo sería representarlas y, por lo tanto, menos compresibles.

Probablemente no sea una prueba ideal, y probablemente sea mucho más lenta de lo necesario, pero podría funcionar como una implementación rápida y sucia.

3

lo podría hacer en el código de la herramienta de código abierto findimagedupes, a pesar de que parece haber sido escrito en Perl, por lo que no se puede decir lo fácil que será para analizar ...

La lectura de los findimagedupes página que me gustó, veo que hay un C++ implementation of the same algorithm. Presumiblemente, esto será más fácil de entender.

Y parece que también puede usar gqview.

+0

El enlace de PixiePlus me llevó a un sitio informándome: "Superdrol es un esteroide altamente eficaz": D –

+0

Gracias. Lo mató. – dmckee

2

para ampliar la nota de Vaibhav, hugin es un "autostitcher" de código abierto que debería tener alguna idea sobre el problema.

0

Bueno, un método de nivel base para usar podría pasar por cada color de píxel y compararlo con el color de píxel correspondiente en la segunda imagen, pero probablemente sea una muy muy lenta.

27

La forma "clásica" de medir esto es dividir la imagen en algunas secciones canónicas (digamos una cuadrícula de 10x10) y luego calcular un histograma de valores RGB dentro de cada celda y comparar los histogramas correspondientes. Este tipo de algoritmo es preferido debido a su simplicidad y su invariancia a escala y (¡pequeña!) Traducción.

+3

¿No es esto similar a hacer un solo histograma para toda la imagen, pero con los inconvenientes adicionales de no ser resistente para reflejar y rotar? –

+0

2 histogramas de 2 mitades de imagen tendrán una precisión de coincidencia mejor que 1 histograma de un todo. Aunque tiene inconvenientes que mencionó, depende del problema que está resolviendo. –

20

Utilice un histograma de color normalizado. (Lea la sección sobre aplicaciones here), se usan comúnmente en sistemas de recuperación/coincidencia de imágenes y son una forma estándar de emparejar imágenes que es muy confiable, relativamente rápida y muy fácil de implementar.

Esencialmente, un histograma de color capturará la distribución del color de la imagen. Esto se puede comparar con otra imagen para ver si las distribuciones de color coinciden.

Este tipo de juego es bastante resiliant a escala (una vez que el histograma es normalizada), y la rotación/desplazamiento/movimiento etc.

comparaciones Evitar píxel por píxel como si la imagen se hace girar/desplaza ligeramente se puede llevar a una gran diferencia reportada.

Los histogramas serían simples para generar usted mismo (suponiendo que pueda tener acceso a valores de píxel), pero si no lo desea, la biblioteca OpenCV es un gran recurso para hacer este tipo de cosas. Here es una presentación de PowerPoint que le muestra cómo crear un histograma usando OpenCV.

11

No algoritmos de codificación de vídeo como MPEG calcular la diferencia entre cada fotograma de un video por lo que sólo pueden codificar el delta? Puede ver cómo los algoritmos de codificación de video calculan esas diferencias de cuadro.

mirada a esta aplicación de búsqueda de imágenes de código abierto http://www.semanticmetadata.net/lire/. En él se describen varios algorighms imagen de similitud, tres de los cuales son del estándar MPEG-7: ScalableColor, ColorLayout, EdgeHistogram y Color automático Correlograma.

+0

Esto no respondería la pregunta aquí. La pregunta no es sobre la comparación de píxeles por píxel. – Kousha

0

Si esto es algo que va a hacer ocasionalmente y no necesita automatización, puede hacerlo en un editor de imágenes que admita capas, como Photoshop o Paint Shop Pro (probablemente GIMP o Paint.Net también) , pero no estoy seguro de eso). Abra ambas capturas de pantalla y ponga una como una capa encima de la otra. Cambia el modo de fusión de capas a Diferencia, y todo lo que sea igual entre los dos se volverá negro. Puede mover la capa superior para minimizar las diferencias de alineación.

12

Puede utilizar un enfoque matemático puro de O(n^2), pero será útil solo si está seguro de que no hay desplazamiento o algo así. (Aunque si tiene algunos objetos con una coloración homogénea, funcionará bastante bien).

De todos modos, la idea es calcular el producto-punto normalizado de las dos matrices. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

esta fórmula es en realidad el "coseno" del ángulo entre las matrices (extrañas). Cuanto mayor sea la similitud (digamos Pij=Qij), C será 1, y si son completamente diferentes, digamos por cada i,j Qij = 1 (evitando la división cero), Pij = 255, entonces para el tamaño nxn, el más grande n será, el más cerca de cero lo tendremos. (Por cálculo aproximado: C=1/n^2).

5

Una solución de rubí puede ser found here

Desde el readme:

la última moda es un envoltorio de Ruby alrededor de la biblioteca pHash, "hash de percepción", que detecta duplicados y cerca archivos multimedia duplicados

2

Hay software para la recuperación de imágenes basada en el contenido, que hace (parcialmente) lo que necesita. Todas las referencias y explicaciones están vinculadas desde el sitio del proyecto y también hay un libro de texto corto (Kindle): LIRE

3

Cómo medir la similitud entre dos imágenes depende completamente de lo que desea medir, por ejemplo: contraste, brillo, modalidad, ruido ... y luego elija la mejor medida de similitud adecuada para usted. Puede elegir entre MAD (diferencia media absollute), MSD (diferencia media al cuadrado) que son buenos para medir el brillo ... hay šī también disponible CR (coeficiente corelation) cual es bueno en lo que representa corelation entre dos imágenes . También puede elegir entre medidas de similitud basadas en histogramas como SDH (desviación estándar del histograma de imagen de diferencia) o medidas de similitud multimodal como MI (información mutua) o NMI (información mutua normalizada).

Debido a esta similitud medidas cuestan mucho en el tiempo, les recomendamos que para reducir las imágenes abajo antes de aplicar estas medidas en ellos.

0

Puede utilizar Siamese Network para ver si las dos imágenes son similares o diferentes después de este tutorial. Este tutorial agrupa las imágenes similares, mientras que puede usar la distancia L2 para medir la similitud de dos imágenes.

Cuestiones relacionadas