¿OpenCV admite la comparación de dos imágenes, devolviendo algún valor (tal vez un porcentaje) que indica qué tan similares son estas imágenes? Por ejemplo, el 100% se devolvería si se pasara la misma imagen dos veces, el 0% se devolvería si las imágenes fueran totalmente diferentes.
Ya leí muchos temas similares aquí en StackOverflow. También hice un poco de Google. Lamentablemente, no pude encontrar una respuesta satisfactoria.
image
opencv
comparison
similarity
Boris
fuente
fuente
Respuestas:
Este es un tema enorme, con respuestas de 3 líneas de código a revistas de investigación completas.
Voy a describir las técnicas más comunes y sus resultados.
Comparación de histogramas
Uno de los métodos más simples y rápidos. Propuesto hace décadas como un medio para encontrar similitudes de imágenes. La idea es que un bosque tendrá mucho verde y una cara humana mucho rosa, o lo que sea. Entonces, si compara dos imágenes con bosques, obtendrá una similitud entre los histogramas, porque tiene mucho verde en ambos.
Comparación de plantillas
Un buen ejemplo aquí matchTemplate encuentra una buena coincidencia . Convoluciona la imagen de búsqueda con la que se está buscando. Por lo general, se usa para encontrar partes de imágenes más pequeñas en una más grande.
Coincidencia de funciones
Considerada una de las formas más eficientes de hacer búsquedas de imágenes. Se extraen varias características de una imagen, de manera que garantiza que las mismas características se reconocerán nuevamente incluso cuando se rotan, escalan o se sesgan. Las características extraídas de esta manera pueden compararse con otros conjuntos de características de imagen. Se considera que otra imagen que tiene una alta proporción de las características que coinciden con la primera representa la misma escena.
Encontrar la homografía entre los dos conjuntos de puntos le permitirá también encontrar la diferencia relativa en el ángulo de disparo entre las imágenes originales o la cantidad de superposición.
En el sitio de preguntas y respuestas de OpenCV , estoy hablando de la diferencia entre los descriptores de características, que son geniales al comparar imágenes completas y descriptores de textura, que se utilizan para identificar objetos como rostros humanos o automóviles en una imagen.
fuente
absdiff
codota.com/code/java/methods/org.opencv.core.Core/absdiff Umbralizar el resultado produce una máscara que le permite resaltar las regiones que cambiaron de escena a escena.Si para hacer coincidir imágenes idénticas (mismo tamaño / orientación)
Fuente
fuente
La solución de Sam debería ser suficiente. Utilicé la combinación de la diferencia de histograma y la coincidencia de plantillas porque ningún método me funcionaba el 100% de las veces. Sin embargo, le di menos importancia al método de histograma. Así es como lo he implementado en un script simple de Python.
fuente
Un poco fuera de tema pero útil es el
numpy
enfoque pitónico . Es robusto y rápido, pero solo compara píxeles y no los objetos o datos que contiene la imagen (y requiere imágenes del mismo tamaño y forma):Un enfoque muy simple y rápido para hacer esto sin openCV y cualquier biblioteca para visión por computadora es normalizar las matrices de imágenes mediante
Después de definir ambas imágenes normadas (o matrices), puede sumar la multiplicación de las imágenes que desea comparar:
1) Si compara imágenes similares, la suma devolverá 1:
2) Si no son similares, obtendrá un valor entre 0 y 1 (un porcentaje si multiplica por 100):
Tenga en cuenta que si tiene imágenes en color, debe hacerlo en las 3 dimensiones o simplemente comparar una versión en escala de grises. A menudo tengo que comparar grandes cantidades de imágenes con contenido arbitrario y esa es una forma muy rápida de hacerlo.
fuente