2009-06-23 12 views
84

¿Qué es una forma rápida de resolver un determinado conjunto de imágenes por su similitud entre sí.casi duplicados Detección de imagen

Por el momento tengo un sistema que hace un análisis de histograma entre dos imágenes, pero esta es una operación muy costosa y parece demasiado exagerada.

Optimalmente estoy buscando un algoritmo que dé a cada imagen una puntuación (por ejemplo, una puntuación entera, como el promedio RGB) y puedo ordenar por esa puntuación. Los puntajes idénticos o puntajes uno al lado del otro son posibles duplicados.

0299393 
0599483 
0499994 <- possible dupe 
0499999 <- possible dupe 
1002039 
4995994 
6004994 

RGB Media por imagen, ¿hay algo similar?

+5

Una pregunta clave, pensando en lo que ha escrito y en algunas de las respuestas a la pregunta relacionada que Naaff señaló, es posible que desee definir más claramente lo que significa "similitud". ¿Sería "similar" una imagen que es idéntica, pero con cinco píxeles de desplazamiento? Visualmente sí ... pero a un algoritmo ... probablemente no, a menos que lo hayas pensado, y lo hayas explicado. ¿Puedes proporcionar más detalles? ¿Los duplicados serían exactos, o simplemente "cercanos"? ¿Está buscando escaneos donde podrían diferir en una ligera medida de ángulo? ¿Qué tal la intensidad? Hay un * lote * de variables aquí ... – Beska

+0

¿En qué se diferencian los "duplicados"? p.ej. ¿Serían imágenes de la misma ubicación con diferentes pose/shift? Parece que quieres algo que sea O (nlog (n)) con el número de imágenes. ¿Alguien sabe si esto es posible? Parece que puede ser ... –

+0

@Lo Desconocido: Si no está satisfecho con alguna de las respuestas actuales, ¿podría darnos más orientación? Hemos hecho nuestro mejor esfuerzo para responder a su pregunta, pero sin ningún comentario, es poco probable que encontremos algo mejor. – Naaff

Respuesta

59

Ha habido mucha investigación sobre búsqueda de imágenes y medidas de similitud. No es un problema fácil. En general, un solo int no será suficiente para determinar si las imágenes son muy similares. Tendrás una alta tasa de falsos positivos.

Sin embargo, dado que se ha realizado una gran cantidad de investigaciones, puede echar un vistazo a algunas de ellas. Por ejemplo, this paper (PDF) proporciona un algoritmo de huella dactilar de imagen compacta que es adecuado para encontrar imágenes duplicadas rápidamente y sin almacenar mucha información. Parece que este es el enfoque a la derecha si desea algo sólido.

Si está buscando algo más simple, pero definitivamente más ad-hoc, this SO question tiene algunas ideas correctas.

+0

ese papel es de 2004, no estoy seguro si esta sigue siendo la mejor respuesta? –

1

Supuse que otro software de búsqueda de imágenes duplicado realiza una FFT en las imágenes, y almacena los valores de las diferentes frecuencias como vectores:

Image1 = (u1, u2, u3, ..., un) 
Image2 = (v1, v2, v3, ..., vn) 

y luego se puede comparar dos imágenes para equalness por el cálculo de la distancia entre los vectores de pesos de dos imágenes:

distance = Sqrt(
    (u1-v1)^2 + 
    (u2-v2)^2 + 
    (u2-v3)^2 + 
    ... 
    (un-vn)^2); 
+2

La mayoría de las imágenes naturales tienen un contenido de frecuencia muy similar, por lo que dudo que esta sea una muy buena métrica. –

5

Usted tiene que decidir lo que es "similar". ¿Contraste? ¿Matiz?

¿Hay una imagen "similar" a la misma imagen al revés?

Apuesto a que puede encontrar muchas "llamadas cercanas" al dividir las imágenes en piezas de 4x4 y obtener un color promedio para cada celda de la grilla. Tendría dieciséis puntajes por imagen. Para juzgar la similitud, simplemente haría una suma de cuadrados de diferencias entre imágenes.

No creo que un solo hash tenga sentido, a menos que vaya contra un concepto único como el tono, el brillo o el contraste.

Aquí es tu idea:

0299393 
0599483 
0499994 <- possible dupe 
0499999 <- possible dupe 
1002039 
4995994 
6004994 

En primer lugar, voy a asumir estos son números decimales que son R * (2^16) + G * (2^8) + B, o algo como eso. Obviamente, eso no es bueno porque el rojo tiene una ponderación desmesurada.

Moving into HSV space sería mejor. Puede spread the bits of HSV out en el hash, o puede ajustar H, S o V individualmente, o puede tener tres hash por imagen.


Una cosa más. Si pesas R, G y B. Peso verde más alto, luego rojo, luego azul para que coincida con la sensibilidad visual humana.

8

Hay una biblioteca C ("libphash" - http://phash.org/) que calculará un "hash perceptual" de una imagen y le permitirá detectar imágenes similares al comparar hashes (para que no tenga que comparar cada imagen directamente contra cada otra imagen) pero lamentablemente no parecía ser muy preciso cuando lo probé.

1

Una solución es realizar una comparación de RMS/RSS en cada par de imágenes necesarias para realizar una clasificación de burbujas. En segundo lugar, podría realizar un FFT en cada imagen y hacer un promedio de ejes para recuperar un único entero para cada imagen que usaría como índice para ordenar. Puede considerar hacer cualquier comparación en una versión redimensionada (25%, 10%) del original, dependiendo de cuán pequeña sea la diferencia que elija ignorar y cuánta aceleración requiera. Avíseme si estas soluciones son interesantes, y podemos analizar o puedo proporcionar un código de muestra.

+0

FFT solo le proporciona información de color y no información sobre la posición. El cambio de tamaño ignora todas las características por debajo de un tamaño dado, independientemente del impacto en la imagen resultante. Una imagen gris y un tablero de damas pueden ser idénticos en esa medida. Un enfoque wavelet (Daubechies, Haar, etc.) tiene los beneficios de proporcionar información de posición y color al intercambiar la proporción de información posicional y de color en cada punto de datos. –

+2

No, la FFT de una imagen contiene toda la información espacial del original. Puedes reconstruir el original desde la FFT. http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Sin embargo, un histograma, que puede ser en lo que estabas pensando, no lo hace. – Paul

10

Una imagen tiene muchas características, por lo que a menos que se limite a una, como el brillo promedio, se trata de un espacio problemático n-dimensional.

Si te pedí que asignaras un solo entero a las ciudades del mundo, para poder decir cuáles están cerca, los resultados no serían buenos. Por ejemplo, puede elegir la zona horaria como su entero individual y obtener buenos resultados en ciertas ciudades. Sin embargo, una ciudad cerca del polo norte y otra ciudad cerca del polo sur también pueden estar en el mismo huso horario, aunque se encuentren en los extremos opuestos del planeta. Si te dejo usar dos enteros, podrías obtener muy buenos resultados con la latitud y la longitud. El problema es el mismo para la similitud de la imagen.

Todo lo dicho, hay algoritmos que intentan agrupar imágenes similares, que es efectivamente lo que estás pidiendo. Esto es lo que sucede cuando te enfrentas a la detección con Picasa. Incluso antes de identificar las caras, agrupa las similares para que sea fácil pasar por un conjunto de caras similares y otorgarle a la mayoría el mismo nombre.

También existe una técnica llamada Análisis de componentes principales, que le permite reducir los datos n-dimensionales a cualquier cantidad menor de dimensiones. Por lo tanto, una imagen con n características podría reducirse a una función. Sin embargo, este no es el mejor enfoque para comparar imágenes.

+1

Es un punto discutible, pero PUEDE usar un número entero para representar la combinación de cualquier cantidad de características, si, por ejemplo, característica x = 2 y función y = 3 y característica z = 5 y función aa = 7, etcétera , entonces la potencia a la que se elevó esa base principal en la forma factorizada de un único entero sería el valor de la característica para esa imagen específica. De nuevo, un punto discutible porque el tamaño del número sería absurdo. Aunque ese tamaño podría reducirse aún más ... solo estamos hablando de datos estructurados. – jeromeyers

+0

Es cierto. Pero el verdadero punto es organizar los números para que las imágenes similares estén juntas numéricamente. A pesar de lo que dije antes, esto es posible. En resumen, podría resolver el problema del Viajero Vendedor para encontrar una ruta mínima (o casi mínima) a través de las imágenes en el espacio de n dimensiones (donde n es la cantidad de características que desea usar para comparar las imágenes). Pero eso es caro –

4

En la era de los servicios web que podría intentar http://tineye.com

+3

Parece que el código detrás de tineye es exactamente lo que persigue la persona que pregunta, pero no creo que sea un servicio web muy útil, ya que no hay una forma (obvia) de darle dos imágenes y preguntar "¿son las mismas? ? " - la segunda imagen tendría que estar en una página web e indexada por tineye – dbr

+1

¿Tal vez están proporcionando API para usuarios de negocios? Deberían ser contactados sobre eso. – zproxy

15

he implementado un algoritmo muy fiable para este llamado Fast Multiresolution Image Querying. Mi (antiguo, no mantenido) código para eso es here.

Lo que Fast Multiresolution Image Querying hace es dividir la imagen en 3 piezas basadas en el espacio de color YIQ (mejor para las diferencias de coincidencia que RGB). Luego, la imagen se comprime esencialmente utilizando un algoritmo de wavelet hasta que solo estén disponibles las características más destacadas de cada espacio de color. Estos puntos se almacenan en una estructura de datos. Las imágenes de consulta pasan por el mismo proceso y las características destacadas de la imagen de consulta se comparan con las de la base de datos almacenada. Cuantas más coincidencias, más posibilidades hay de que las imágenes sean similares.

El algoritmo se utiliza a menudo para la funcionalidad "consultar por boceto". Mi software solo permitía ingresar imágenes de consulta a través de URL, por lo que no había interfaz de usuario. Sin embargo, encontré que funcionó excepcionalmente bien para unir miniaturas a la versión grande de esa imagen.

Mucho más impresionante que mi software es retrievr que le permite probar el algoritmo FMIQ utilizando como fuente las imágenes de Flickr. ¡Muy genial! Pruébelo mediante un boceto o usando una imagen de origen, y podrá ver qué tan bien funciona.

+0

¿Todavía puede reconocer las imágenes giradas? – endolith

+0

Dudo que funcione muy bien para eso. Probablemente desee codificar las imágenes para cada rotación para maximizar las coincidencias pertinentes. –

+0

Parece que el enlace para retrievr no está activo, ¿está archivado en alguna parte? – mmigdol

47

Recomendaría considerar alejarse de simplemente usar un histograma RGB.

Se puede obtener un mejor resumen de su imagen si toma una 2d Haar wavelet de la imagen (es mucho más fácil de lo que parece, es solo un promedio y algunas raíces cuadradas para ponderar sus coeficientes) y solo retenga los k coeficientes ponderados más grandes en la ondícula como un vector disperso, normalícelo y guárdelo para reducir su tamaño. Debería reescalar R G y B usando pesos perceptivos de antemano al menos o recomendaría cambiar a YIQ (o YCoCg, para evitar el ruido de cuantificación) para que pueda muestrear la información de crominancia con importancia reducida.

Ahora puede utilizar el producto escalar de dos de estos vectores normalizados dispersos como medida de similitud. Los pares de imágenes con los productos de puntos más grandes serán muy similares en estructura. Esto tiene el beneficio de ser ligeramente resistente al cambio de tamaño, cambio de matiz y marca de agua, y ser realmente fácil de implementar y compacto.

Puede sacrificar el almacenamiento y la precisión aumentando o disminuyendo k.

Ordenar por un solo puntaje numérico va a ser intratable para este tipo de problema de clasificación. Si lo piensas, requeriría que las imágenes solo puedan 'cambiar' a lo largo de un eje, pero no es así. Es por eso que necesita un vector de características. En el caso de Haar wavelet es aproximadamente donde ocurren las discontinuidades más agudas en la imagen. Puede calcular una distancia entre imágenes por parejas, pero como todo lo que tiene es una medida de distancia, un ordenamiento lineal no tiene forma de expresar un "triángulo" de 3 imágenes que están todas igualmente distantes. (es decir, piense en una imagen que sea totalmente verde, una imagen que sea roja y una imagen en azul).

Eso significa que cualquier solución real a su problema necesitará O (n^2) operaciones en el cantidad de imágenes que tienes Mientras que si hubiera sido posible linealizar la medida, podría requerir solo O (n log n), u O (n) si la medida era adecuada para, por ejemplo, una ordenación de radix. Dicho esto, no es necesario gastar O (n^2) ya que en la práctica no es necesario examinar todo el conjunto, solo necesita encontrar las cosas que están más cerca que un umbral. Por lo tanto, al aplicar una de varias técnicas para particionar su espacio vectorial disperso, puede obtener asíntotas mucho más rápidas para el problema 'encontrándome k de las imágenes que son más similares que un umbral determinado' que ingenuamente comparando cada imagen con cada imagen, dándole es probable que necesites ... si no precisamente lo que pediste.

En cualquier caso, utilicé esto hace unos años para tener un buen efecto personal al intentar minimizar el número de texturas diferentes que estaba almacenando, pero también ha habido mucho ruido de investigación en este espacio que muestra su eficacia (y en este caso, comparándolo con una forma más sofisticada de la clasificación histograma):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Si necesita una mayor precisión en la detección, el minhash y algoritmos TF-IDF se pueden utilizar con la wavelet Haar (o el histograma) para tratar las ediciones más robustas:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Finalmente, Stanford tiene una búsqueda de imágenes basada en una variante más exótica de este tipo de enfoque, basada en extraer más características de las ondículas para encontrar secciones de imágenes giradas o escaladas, etc., pero eso probablemente va mucho más allá la cantidad de trabajo que te gustaría hacer

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi

+0

Parece que estás describiendo indirectamente kd-trees y similares para buscar candidatos potenciales en el espacio. Vale la pena notar esto. – Boojum

+1

Bueno, la razón por la que no especifiqué técnicas más allá de una especie de alusión vaga es que los árboles kd funcionan bien cuando tienes un número relativamente pequeño de dimensiones en tu espacio. Aquí es probable que tenga ~ 128 o más dimensiones que están escasamente pobladas. Dado que son escasos, la mayoría de los valores serán cero, por lo que ir de un lado para otro a través de las dimensiones para dividir en k-style es en realidad casi inútil. Por la misma razón, los árboles R se rompen, lo que probablemente sea la mejor opción: árboles X. Desafortunadamente, también están cerca del límite de su desempeño cuando se enfrentan con tantas dimensiones. –

+0

"y simplemente conserva los k coeficientes ponderados más grandes en la ondícula como un vector disperso," - retener por fila o por wavelet completa? –

1

mayoría de los enfoques modernos para detectar Cerca de duplicar la imagen uso de detección de detección y descriptores que describen el área alrededor de tales puntos puntos interesantes. A menudo se usa SIFT. Luego puede poner en cuarteto descriptores y usar agrupamientos como vocabulario de palabras visuales.

De modo que si vemos la proporción de palabras visuales comunes de dos imágenes a todas las palabras visuales de estas imágenes, se estima la similitud entre las imágenes. Hay muchos artículos interesantes. Uno de ellos es Near Duplicate Image Detection: minHash and tf-idf Weighting