2011-10-10 13 views
6

en mi proyecto, necesito comparar imágenes. Una imagen muestra un modelo de renderizado y la otra imagen es una foto en la que se muestra el objeto real que se representa en el modelo. Lo que quiero exactamente:¿Cómo comparo dos imágenes de borde (en OpenCV)?

  • El algoritmo tiene que comparar las dos imágenes y devolver un número, que describe la similitud. Digamos que cuanto menor es el número, mejor encajan las imágenes.
  • Ambas imágenes se representan como imágenes binarias que solo contienen los contornos/bordes de la imagen-render real/foto.
  • La foto tiene muchos más objetos en ella que la imagen de renderizado. Entonces solo quiero verificar si el punto de vista del objeto de renderización es casi el mismo que el punto de vista del objeto real en la foto. (Ejemplo: un automóvil se modela de modo que se aproxime a un automóvil real. Saco una foto del automóvil real desde una posición y orientación especial. Ahora quiero verificar si la posición y la orientación de mi cámara virtual miran el auto de renderizado es casi lo mismo, que la posición y orientación de mi cámara de la vida real). La solución es solo para comparar los píxeles blancos de la imagen de renderizado con los píxeles de la foto (como imagen de borde). Los otros píxeles no son interesantes.
  • El valor devuelto de la comparación de imágenes debe disminuir cuanto mejor se adapte mi orientación y posición de la cámara virtual a la posición y orientación de la cámara real.

He intentado calcular la distancia euclidiana de las dos imágenes, pero el resultado es bueno, cuando los píxeles se ajustan entre sí. Ahora estoy buscando alterantives.

Hasta ahora he considerado utilizar la correlación cruzada normalizada, pero realmente no sé si se ajusta a mi tarea.

La pregunta es si vale la pena intentar la correlación cruzada normalizada o si hay mejores métodos para resolver mi problema.

El algoritmo debe ser lo más rápido posible, porque comparo muchas imágenes.

Muchas gracias


Gracias por sus sugerencias. Estoy un poco confundido debido al hecho de que la distancia de Haussdorff y la cruzada cruzada normalizada parecen ser buenas para encontrar un patrón pequeño en una imagen general.

La pregunta es: ¿Los dos algoritmos también son buenos para comparar 2 imágenes del mismo tamaño?

Aquí hay un ejemplo de 2 imágenes que tienen que ser comparadas. Por el momento estoy comparando alrededor de 120 imágenes, paires por segundo.

Lástima que no puedo publicar imágenes como un nuevo usuario. Así que aquí está el enlace directo: http://s14.directupload.net/file/d/2674/t8qzbq9i_png.htm

+0

Se puede publicar las dos imágenes? – Maurits

+0

Se ha publicado el enlace a un ejemplo. – user987979

+0

+1 para una pregunta interesante. ¿Puedes publicar las imágenes antes de que puedas detectarlas también? Ayudaría a agregar algo de contexto a su pregunta. – misha

Respuesta

1

También puede salir cosine similarity. Lo utilicé con gran éxito para detectar escenas de corte en una transmisión de video. Básicamente, tratas toda la imagen como un vector 1D y procedes con la medida de similitud del coseno. Básicamente, los ángulos pequeños significan una coincidencia cercana, y los valores grandes significan que no coinciden. Los umbrales necesitarían algo de ajuste para su conjunto de datos, pero podría funcionar, y es muy rápido.

La correlación cruzada normalizada debería ser más robusta, pero tomará un poco más de tiempo.Como mencionaste que necesitas manejar diferentes poses, también deberías mirar una solución de detección y extracción de características. Eche un vistazo a las muestras matcher_simple.cpp y matching_to_many_images.cpp de opencv. Estas técnicas tienen cierta tolerancia para las diferencias de escala y rotación.

Espero que sea útil!

+1

Para datos de alta dimensión, como una imagen, no esperaría ninguna diferencia significativa entre la distancia euclidiana y la similitud del coseno. – Maurits

Cuestiones relacionadas