2009-05-05 12 views
6

Esta es una pregunta bastante amplia; ¿Qué herramientas/bibliotecas existen para tomar dos fotografías que no son idénticas, pero extremadamente similares, e identificar las diferencias específicas entre ellas?Determine las diferencias entre dos fotografías casi idénticas

Un ejemplo sería tomar una foto de mi sofá el viernes después de que mi novia haya terminado de limpiar y antes de un fin de semana largo de tener amigos, beber y tocar la banda de rock. Dos días después tomo una segunda foto del sofá; la iluminación es idéntica, el sofá no se ha movido un milímetro, y uso un trípode en una ubicación fija.

¿Qué herramientas podría usar para generar una diferencia de las imágenes, o una tercera imagen de mapa de calor de las diferencias? ¿Hay alguna herramienta para .NET?

Respuesta

1

Echa un vistazo a Andrew Kirillov's article en CodeProject. Escribió una aplicación de C# utilizando la biblioteca de visión por computadora AForge.NET para detectar movimiento. En el sitio web de AForge.NET, hay un discussion de dos diferencias de fotogramas para la detección de movimiento.

5

Esto depende en gran medida del formato de imagen y la compresión. Pero, al final del día, probablemente tome dos rásteres y los compare pixel a pixel.

Eche un vistazo a Perceptual Image Difference Utility.

+0

Gracias por el enlace, sin duda voy a jugar con eso para ver si es un buen punto de partida para lo que estoy haciendo. – STW

1

Es una pregunta interesante. No puedo derivarlo a ninguna biblioteca específica, pero el proceso que está solicitando es básicamente un caso mínimo de compensación de movimiento. Esta es la forma en que el video MPEG (MP4, DIVX, lo que sea) logra comprimir video tan extremadamente bien; puede consultar MPEG para obtener información sobre la forma en que se implementan los algoritmos de compensación de movimiento.

Otra cosa a tener en cuenta; La compresión JPEG es una compresión basada en bloques; Gran parte del beneficio que aporta MPEG es hacer una comparación de bloques. Si la mayor parte de su imagen (por ejemplo, el fondo) es la misma de una imagen a la siguiente, esos bloques no se modificarán. Es una forma rápida de reducir la cantidad de datos necesarios para comparar.

+0

Eso es algo que nunca he considerado, pero es un gran punto – STW

+0

Incluso podría montar un clip corto a partir de una copia de la imagen anterior y una copia de la imagen posterior. Comprimir eso con MPEG, y analizar el resultado .... ;-) – RBerteig

2

La forma más obvia de ver cada pequeña diferencia, normalmente casi imperceptible, sería XOR a los datos de píxeles. Sin embargo, si la iluminación es ligeramente diferente, puede ser demasiado. Diferenciar (restar) los datos de píxeles puede ser más de lo que está buscando, dependiendo de qué tan sutiles sean las diferencias.

+0

Definitivamente tendré que jugar con eso; es probable que sea uno de los pocos enfoques que pude desarrollar desde cero dentro de mi nivel de habilidad – STW

+1

Si quiere ver algunos de estos enfoques en acción antes de codificarlos usted mismo, eche un vistazo a los modos de composición de capas de cualquier editor de gráficos por puntos. Los de Paint.NET son en los que estoy pensando, pero es una operación básica de píxeles binarios, por lo que todas las implementaciones deberían ser las mismas. – bsneeze

2

Un lugar para comenzar es con una rica biblioteca de procesamiento de imágenes como IM. Puede interactuar con sus operadores interactivamente con la herramienta IMlab, llamarlo directamente desde C o C++, o usar su enlace Lua realmente decente para conducirlo desde Lua. Admite una amplia gama de operaciones en mapas de bits, así como una biblioteca extensible de formatos de archivo.

Incluso si no ha movido nada deliberadamente, puede usar un algoritmo como SIFT para obtener una buena alineación de calidad sub-pixel entre los fotogramas. A menos que desee para tratar la cámara como fija y detectar el movimiento del sofá también.

+0

Esa es exactamente la respuesta que tanto temía y esperaba; No soy desarrollador de C o C++ o Lua, pero parece un proyecto divertido para hacer que mis pies/torso/cabeza/esnórquel se mojen. Probablemente esté por encima de mi cabeza, pero supongo que es por eso que mencioné el snorkel – STW

+1

. Si te sumerges, querrás mirar el CD e IUP de sus bibliotecas compañeras. CD proporciona un lienzo genérico para dibujar en mapas de bits (o pantalla) e IUP proporciona un marco de interfaz de usuario portátil. Los enlaces están en la página IMLab. Hay mucha ayuda de Lua en www.lua.org a través de la lista de correo oficial, y una wiki de usuario a usuario, o aquí etiquetada "lua" para que sirva como ese snorkel tan vital cuando lo necesite. ;-) – RBerteig

0

sólo tiene que utilizar el.clases de imágenes de red, crear un nuevo mapa de bits() x 2 y mirar el R & G & B valores de cada píxel, también puede mirar los valores A (Alpha/transparencia) si lo desea al determinar la diferencia.

También una nota, usando el método getPixel (y, x) puede ser muy lenta, hay otra manera de obtener la imagen completa (menos elegante) y cada uno si lo recuerdo se llama getBitmap o algo similar, busque en las clases de creación de imágenes/mapa de bits & lea algunos idiomas que realmente son todo lo que necesita & no son tan difíciles de usar, no vaya de terceros a menos que sea necesario.

+0

ps: envíame un correo electrónico si necesitas más recursos/ayuda en esto, pasé 2 años de mi vida con esta clase hace un tiempo :) –

Cuestiones relacionadas