una significa que para imagenes imagen emplea como atributos atributo agregar algorithm language-agnostic image image-processing

algorithm - significa - ¿Cómo puedo medir la similitud entre dos imágenes?



en html, el atributo alt se emplea para (17)

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.

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


¿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 cuadro.

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


Bueno, no para responder tu 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.


Bueno, un método de nivel realmente básico 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 esa es probablemente una solución muy lenta.


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 que hay para usted. Puede elegir entre MAD (diferencia de absolutos medios), MSD (diferencia cuadrática media) que son buenos para medir el brillo ... también hay CR disponible (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 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 las imágenes antes de aplicar estas medidas sobre ellas.


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

Por ejemplo, aquí hay algunos problemas:

  • imágenes recortadas frente a una imagen no recortada
  • imágenes con un texto agregado vs. otro sin
  • imágenes duplicadas

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

  1. escalar a algo pequeño, como 64x64 o 32x32, sin tener en cuenta la relación de aspecto, utilice un algoritmo de escala combinado 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 quede arriba a la izquierda, y luego, arriba a la derecha, sea el siguiente, más oscuro, abajo a izquierda, y luego, más oscuro (en la medida de lo posible, por supuesto)

Editar Un algoritmo de escala combinada 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.

Luego calcule la distancia promedio 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.


Hay un 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


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 debido a su simplicidad y su invariancia a escala y (¡pequeña!) Traducción.


Me pregunto (y realmente estoy tirando la idea por ahí para ser derribado) si algo podría derivarse al restar una imagen de la otra, y luego comprimir 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.


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


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 la distancia L2 para medir la similitud de dos imágenes.


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

Al leer 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 .


Si esto es algo que hará 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 yo '' 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.


Una solución de rubí se puede encontrar aquí

Del archivo léame:

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


Use 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 coincidencia es bastante flexible para escalar (una vez que el histograma está normalizado), y 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 provocar una gran diferencia.

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


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



Podría usar un enfoque matemático puro de O(n^2) , pero será útil solo si está seguro de que no hay compensación o algo así. (Aunque si tiene algunos objetos con 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ño). 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 , luego para el tamaño nxn , cuanto mayor sea n , más cerca de cero lo obtendremos. (Por cálculo aproximado: C=1/n^2 ).