2009-08-11 12 views
18

¿Existe una manera eficiente de obtener una huella dactilar de una imagen para la detección de duplicados?¿Manera eficiente de tomar una huella digital de una imagen (jpg, png, etc.)?

Es decir, dado un archivo de imagen, digamos un jpg o png, me gustaría ser capaz de calcular rápidamente un valor que identifica el contenido de la imagen y es bastante resistente a otros aspectos de la imagen (por ejemplo, la imagen metadata) cambiando. Si se trata de redimensionar eso es aún mejor.

[Actualización] Con respecto a los metadatos en archivos jpg, ¿alguien sabe si está almacenado en una parte específica del archivo? Estoy buscando una manera fácil de ignorarlo, por ej. ¿Puedo omitir los primeros x bytes del archivo o tomar x bytes desde el final del archivo para asegurarme de que no obtengo los metadatos?

+0

¿Esto se usará para detener las inundaciones de imágenes de algún tipo? –

+0

Un par de usos: la detección de imágenes duplicadas en un gran corpus es el caso de uso básico, pero también varias búsquedas de spam relacionadas con el uso de imágenes. – Parand

+1

Sí ... Apuesto a que leer esos libros en mi publicación valdría la pena. No baje el hash de la ruta de datos ... ¡eso sería como hash de mensajes de texto para evitar el correo no deseado! Usamos AI en el correo no deseado por una razón :) –

Respuesta

20

puñalada en la oscuridad, si usted está buscando para eludir meta-datos y las cosas relacionadas con el tamaño:

  1. detección de bordes y la escala comparación -independiente
  2. Toma de muestras y el análisis estadístico de los valores de escala de grises/RGB (lum promedio, un promedio de mapa de color)
  3. FFT y otras transformadas (Good artículo Classification of Fingerprints using FFT)

Y muchos otros.

Básicamente:

  1. Convertir JPG/PNG/GIF cualquiera que sea en una matriz de bytes RGB que es independiente de la codificación
  2. uso de un método de clasificación de patrones difusos para generar un 'hash del patrón' en la imagen ... no es un hash de la matriz RGB como algunos sugieren
  3. Luego desea un método distribuido de comparación de hash rápido basado en el umbral de coincidencia en el hash encapsulado o la codificación del patrón. Erlang sería bueno para este :)

Las ventajas son:

  1. Will, si se utiliza cualquier AI/Formación, duplicados contado con independencia de modificación de codificación, tamaño, aspecto, color y lum, rango dinámico/submuestreo diferencias y en algunos casos perspectiva

Desventajas:

  1. puede ser difícil de codificar algo .. l ike OpenCV podría ayudar
  2. Probabilist ...falsos positivos es probable, pero pueden reducirse con redes neuronales y otros AI
  3. lenta a menos que pueda encapsular cualidades patrón y distribuir la búsqueda (estilo MapReduce)

libros de análisis de imágenes Pedido tales como:

  1. patrón Clasificación 2ed
  2. imagen Fundamentos de Procesamiento Procesamiento de imagen
  3. - Principios y Aplicaciones

Y otros

Si está escalando la imagen, entonces las cosas son más simples. Si no es así, entonces tiene que lidiar con el hecho de que la escala es con pérdida en más formas que la reducción de la muestra.

0

Pregunta bastante interesante. Lo más rápido y fácil sería calcular crc32 de la matriz de bytes de contenido, pero eso solo funcionaría en imágenes 100% idénticas. Para comparar más inteligente que probablemente necesitaría algún tipo de lógica analyzis Fuzy ...

3

Usar el tamaño de bytes de la imagen para comparar sería adecuado para muchas aplicaciones. Otra forma sería:

  1. Elimine los metadatos.
  2. Calcula el MD5 (u otro algoritmo hash adecuado) para la imagen .
  3. Compare esto con el MD5 (o lo que sea) de la imagen de víctima potencial (siempre y cuando haya despojado a cabo los metadatos para que uno también)
+0

codificaciones/recodificación/modificación de escala/modificación de matiz o incluso una modificación de píxel único invalidaría esto. –

+0

@Aiden Bell - Pensé que estábamos comparando esencialmente las mismas imágenes exactas menos los metadatos. – karim79

+0

Si escala, modifica el matiz o cambia un solo píxel, ya no es la misma imagen ... –

0

he implementado al menos una versión trivial de esta . Transformo y cambio el tamaño de todas las imágenes a una miniatura en blanco y negro muy pequeña (tamaño fijo). Luego los comparo. Detecta el tamaño exacto, el tamaño y los duplicados se transforman en blanco y negro. Obtiene muchos duplicados sin un gran costo.

+0

Una mejor implementación sería promediar bloques de color/rango dinámico. –

1

Desea realizar un hash de imagen. Como no especificaste un idioma en particular, supongo que no tienes una preferencia. Por lo menos, hay una caja de herramientas de Matlab (beta) que puede hacerlo: http://users.ece.utexas.edu/~bevans/projects/hashing/toolbox/index.html. La mayoría de los resultados de google en esto son resultados de investigación en lugar de bibliotecas o herramientas reales.

El problema con MD5ing es que MD5 es muy sensible a pequeños cambios en la entrada, y parece que quiere hacer algo un poco "más inteligente".

0

Lo más fácil es hacer un hash (como MD5) de los datos de imagen, ignorando todos los demás metadatos. Puede encontrar muchas bibliotecas de código abierto que pueden decodificar formatos de imágenes comunes, por lo que es bastante fácil quitar metadatos.

Pero eso no funciona cuando la imagen en sí misma se manipula de todos modos, incluidas las escalas, las rotaciones.

Para hacer exactamente lo que quiere, tiene que usar Image Watermarking pero está patentado y puede ser costoso.

0

Esto es sólo una idea: Posiblemente los componentes de baja frecuencia presentes en el DCT del jpeg podrían usarse como un identificador de tamaño invariante.

3

Puede usar un algoritmo como SIFT (Transformación de característica invariable de escala) para determinar los puntos clave en las imágenes y unirlas.

Ver http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

Se utiliza, por ejemplo, al coser imágenes en una panorámica para detectar puntos coincidentes en diferentes imágenes.

Cuestiones relacionadas