¿Cómo puedo medir la similitud entre dos imágenes? [cerrado]


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 previamente 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 lo similares que son las capturas de pantalla.

¿ Hay una biblioteca / herramienta que ya ¿eso hace? ¿Cómo implementarlo?

Author: Luke Quinane, 2008-08-25

17 answers

Esto depende completamente de lo inteligente que quieras que sea el algoritmo.

Por ejemplo, aquí hay algunos problemas:

  • imágenes recortadas vs. una imagen no recortada
  • imágenes con un texto añadido frente al otro, sin
  • imágenes reflejadas

El algoritmo más fácil y simple que he visto para esto es solo hacer los siguientes pasos para cada imagen:

  1. escala a algo pequeño, como 64x64 o 32x32, ignora la relación de aspecto, usa una combinación algoritmo de escalado en lugar del píxel más cercano
  2. escala los rangos de color para que el más oscuro sea negro y el más claro sea blanco
  3. gire y voltee la imagen para que el color más claro sea la parte superior izquierda, y luego la parte superior derecha es la siguiente más oscura, la parte inferior izquierda es la siguiente más oscura (en la medida de lo posible, por supuesto)

Edit A combining scaling algorithm es uno que al escalar 10 píxeles a uno lo hará usando una función que toma el color de todos esos 10 píxeles y los combina en uno. Se puede hacer con algoritmos como promediación,valor medio o más complejos como splines bicúbicos.

Luego 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 píxeles como columnas individuales en la base de datos, indexe un montón de ellos (pero no todos, a menos que use una imagen muy pequeña) y realice una consulta que use un rango para cada valor de píxel, es decir. cada imagen donde el píxel en el pequeño la imagen está 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 se necesitan algoritmos mucho más avanzados.

 61
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-15 14:58:00

La forma 'clásica' de medir esto es dividir la imagen en un número canónico de secciones (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 tanto por su simplicidad como por su invariancia al escalado y (¡pequeño!) traducción.

 28
Author: Louis Brandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 19:18:41

Utilice un histograma de color normalizado. (Lea la sección sobre aplicaciones aquí), 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 de color de la imagen. Esto se puede comparar con otra imagen para ver si las distribuciones de color coinciden.

Este tipo de coincidencia es bastante resistente a escalado (una vez normalizado el histograma), rotación / desplazamiento / movimiento, etc.

Evite las comparaciones píxel por píxel, ya que si la imagen se gira/cambia ligeramente, puede provocar una gran diferencia.

Los histogramas serían fáciles de generar usted mismo (suponiendo que pueda obtener acceso a los valores de píxeles), pero si no tiene ganas, la biblioteca OpenCV es un gran recurso para hacer este tipo de cosas. Aquí es una presentación de powerpoint que muestra cómo crear un histograma usando OpenCV.

 22
Author: Lehane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 16:53:00

Podría usar 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 coloración homogénea, todavía 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 (wierd). Cuanto mayor sea la similitud (digamos Pij=Qij), C será 1, y si son completamente diferentes, digamos para cada i,j Qij = 1 (evitando la división cero), Pij = 255, entonces para el tamaño nxn, cuanto mayor será n, más cerca de cero llegaremos. (Por cálculo aproximado: C=1/n^2).

 13
Author: Shachar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 11:02:16

¿Los algoritmos de codificación de video como MPEG no calculan la diferencia entre cada fotograma de un video para que puedan codificar el delta? Puede ver cómo los algoritmos de codificación de video calculan esas diferencias de fotogramas.

Mira esta aplicación de búsqueda de imágenes de código abierto http://www.semanticmetadata.net/lire / . Describe varios algoritmos de similitud de imágenes, tres de los cuales son del estándar MPEG-7: ScalableColor, ColorLayout, EdgeHistogram y Auto Color Correlograma.

 12
Author: Mark B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 20:29:32

Necesitarás reconocimiento de patrones 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.

 8
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 13:00:13

Una solución ruby se puede encontrar aquí

Del readme:

Phashion es un envoltorio Ruby alrededor de la biblioteca pHash, "perceptual hash", que detecta archivos multimedia duplicados y casi duplicados

 5
Author: edk750,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-10 13:06:17

Cómo medir la similitud entre dos imágenes depende completamente de lo que le gustaría medir, por ejemplo: contraste, brillo, modalidad, ruido... y luego elija la mejor medida de similitud adecuada que hay para usted. Puede elegir entre MAD (diferencia absoluta media), MSD (diferencia cuadrada media) que son buenas para medir el brillo...hay también disponible CR (coeficiente de corelación) que es bueno para representar la corelación 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 multimodales como MI (información mutua) o NMI (información mutua normalizada).

Debido a que estas medidas de similitud cuestan mucho en el tiempo, se aconseja reducir la escala de las imágenes antes de aplicar estas medidas en ellas.

 4
Author: Gregor Simončič,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 10:41:24

Me pregunto (y realmente solo estoy lanzando la idea para ser derribado) si algo podría derivarse 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 tuvieras dos imágenes idénticas, obtendrías una caja blanca, que se comprimiría muy bien. Cuanto más diferían las imágenes, más compleja sería la representación y, por lo tanto, menos compresible.

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

 3
Author: Matt Sheppard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 13:10:28

Puede ver el código de la herramienta de código abierto findimagedupes, aunque parece haber sido escrito en perl, por lo que no puedo decir lo fácil que será analizar...

Leyendo la página findimagedupes que me gustó, veo que hay una implementación en C++ del mismo algoritmo. Presumiblemente esto será más fácil de entender.

Y parece que también puedes usar gqview.

 3
Author: dmckee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 00:52:55

Bueno, no es para responder a su pregunta directamente, pero he visto que esto sucede. Microsoft lanzó recientemente una herramienta llamada PhotoSynth que hace algo muy similar para determinar áreas superpuestas en un gran número de imágenes (que podrían ser de diferentes relaciones de aspecto).

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

 2
Author: Vaibhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 12:57:21

Para ampliar la nota de Vaibhav, hugin es un 'autostitcher' de código abierto que debería tener alguna idea del problema.

 2
Author: hometoast,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 13:16:33

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

 2
Author: Mathias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 14:51:44

Bueno, un método realmente de nivel básico a usar podría ir a través de cada color de píxel y compararlo con el color de píxel correspondiente en la segunda imagen, pero eso es probablemente una solución muy muy lenta.

 0
Author: Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 13:19:39

Si esto es algo que va a hacer de forma ocasional 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 coloque una como una capa encima de la otra. Cambie el modo de fusión de capas a Diferencia, y todo lo que sea igual entre los dos se convertirá en negro. Puede mover la capa superior para minimizar cualquier alineación diferencia.

 0
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-15 15:15:47

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

 0
Author: cpwah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-27 08:53:25

Beyond Compare tiene comparación píxel por píxel para imágenes, por ejemplo,

introduzca la descripción de la imagen aquí

 0
Author: emallove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-26 19:57:11