Pregunta

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 qué tan similares son las capturas de pantalla.

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

¿Fue útil?

Solución

Esto depende completamente de qué tan inteligente quieras que sea el algoritmo.

Por ejemplo, aquí hay algunos problemas:

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

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

  1. escale a algo pequeño, como 64x64 o 32x32, ignore la relación de aspecto, use un algoritmo de escala combinado en lugar del píxel más cercano
  2. escale las gamas de colores para que el más oscuro sea el negro y el más claro el blanco
  3. gire y voltee la imagen para que el color más claro sea el de arriba a la izquierda, y luego el de arriba a la derecha sea el siguiente más oscuro y el de abajo a la izquierda el siguiente más oscuro (en la medida de lo posible, por supuesto)

Editar A combinando algoritmo de escala es uno que al reducir 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 el promedio, el valor medio o otros más complejos como splines bicúbicas.

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

Otros consejos

La forma "clásica" de medir esto es dividir la imagen en un número canónico de secciones (por ejemplo, una cuadrícula de 10x10) y luego calcular un histograma de valores RGB dentro de cada celda y comparar los histogramas correspondientes.Se prefiere este tipo de algoritmo debido a su simplicidad y su invariancia al escalado y (¡pequeña!) traducción.

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

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

Este tipo de coincidencia es bastante resistente al escalado (una vez que se normaliza el histograma) y a la rotación/desplazamiento/movimiento, etc.

Evite las comparaciones píxel por píxel, ya que si la imagen se gira o se desplaza ligeramente, puede generarse una gran diferencia.

Los histogramas serían sencillos de generar usted mismo (suponiendo que pueda acceder a los valores de los píxeles), pero si no le apetece, el OpenCV La biblioteca es un gran recurso para hacer este tipo de cosas. Aquí es una presentación de PowerPoint que le muestra cómo crear un histograma usando OpenCV.

¿Los algoritmos de codificación de video como MPEG no calculan la diferencia entre cada fotograma de un video para poder codificar simplemente el delta?Podrías investigar cómo los algoritmos de codificación de vídeo calculan esas diferencias de fotogramas.

Mire 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 provienen del estándar MPEG-7:ScalableColor, ColorLayout, EdgeHistogram y Auto Color Correlogram.

Se podría utilizar un enfoque matemático puro de O(n^2), pero sólo será útil si está seguro de que no hay compensación o algo así.(Aunque si tienes algunos objetos con colores homogéneos, funcionará bastante bien).

De todos modos, la idea es calcular el producto escalar 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ño).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, el más grande n será, más nos acercaremos a cero.(Por cálculo aproximado: C=1/n^2).

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

Una solución de rubí puede ser encontrado aquí

Del archivo Léame:

Phashion es un contenedor de Ruby para la biblioteca pHash, "hash perceptual", que detecta archivos multimedia duplicados y casi duplicados.

La forma de 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 medida de similitud más adecuada que exista para usted.Puedes elegir entre ENOJADO (diferencia absoluta media), TME (diferencia media al cuadrado) que son buenos para medir el brillo... también está disponible CR (coeficiente de correlación) que es bueno para representar la correlació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 multimodal como MI (información mutua) o NMI (información mutua normalizada).

Debido a que estas medidas de similitud cuestan mucho tiempo, se recomienda reducir la escala de las imágenes antes de aplicarles estas medidas.

Me pregunto (y en realidad solo estoy lanzando la idea para que la derriben) si se podría derivar algo restando una imagen de la otra y luego comprimiendo la imagen resultante como un jpeg o gif y tomando el tamaño del archivo como una medida de similitud.

Si tuvieras dos imágenes idénticas, obtendrías un cuadro blanco, que se comprimiría muy bien.Cuanto más diferían las imágenes, más complejo sería representarlas y, por 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.

Podrías mirar el código de la herramienta de código abierto. encontrar imágenes duplicadas, aunque parece haber sido escrito en Perl, por lo que no puedo decir qué tan fácil será analizarlo...

Al leer la página de 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.

Bueno, no quiero responder a tu pregunta directamente, pero he visto que esto suceda.Microsoft lanzó recientemente una herramienta llamada FotoSynth 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.

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

Existe un software para la recuperación de imágenes basado en 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 breve libro de texto (Kindle): lira

Bueno, un método realmente básico podría analizar cada color de píxel y compararlo con el color de píxel correspondiente en la segunda imagen, pero probablemente sea una opción muy muy solución lenta.

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

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

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

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top