Pregunta

¿Hay una manera eficiente para obtener una huella digital de una imagen para la detección de duplicados?

Es decir, dado un archivo de imagen, dicen que 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. Los metadatos de imagen ) cambiando. Si se trata de cambiar el tamaño que es incluso mejor.

[Actualización] Con respecto a los meta-datos en archivos jpg, ¿alguien sabe si se almacena en una parte específica del archivo? Estoy buscando una manera fácil de hacer caso omiso de ella - por ejemplo. puedo omitir la primera x bytes del archivo o tomar x bytes desde el final del archivo para asegurarse de que no recibo meta-datos?

¿Fue útil?

Solución

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 comparación independiente de la escala
  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 (Buen artículo Clasificación de las huellas dactilares utilizando 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. Use 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. A continuación, desea un método de comparación de hash distribuido rápida basada en la coincidencia de umbral en el hash de encapsulado o la codificación del patrón. Erlang sería bueno para esto:)

Las ventajas son:

  1. Will, si se utiliza cualquier AI / Formación, duplicados, independientemente del punto de codificación, tamaño, aspecto, color y modificación lum, las diferencias de rango / submuestreo dinámicos y en algunos casos perspectiva

Desventajas:

  1. Puede ser difícil de código .. algo así como OpenCV podría ayudar
  2. probabilísticos ... falsos positivos es probable, pero pueden reducirse con redes neuronales y otros EA
  3. lenta a menos que pueda encapsular cualidades patrón y distribuir la búsqueda (estilo MapReduce)

imagen Pedido libros de análisis como:

  1. Clasificación de patrones 2ed
  2. Fundamentos de procesamiento de imágenes
  3. Procesamiento de Imágenes - Principios y Aplicaciones

Y otros

Si va a escalar la imagen, entonces las cosas son más simples. Si no es así, entonces usted tiene que lidiar con el hecho de que la escala es con pérdidas en más de reducción de la muestra.

Otros consejos

Utilizando el tamaño en bytes de la imagen para la comparación sería adecuado para muchas aplicaciones. Otra manera sería:

  1. Franja de formularios de los metadatos.
  2. Calcular el MD5 (u otro algoritmo de hash adecuado) para la imagen.
  3. Compare eso con el MD5 (o lo que sea) de la víctima potencial imagen (siempre has despojado a cabo los metadatos para que uno también)

Mira este documento sobre robusta imagen Hashing .

Se podría utilizar un algoritmo como SIFT (Escala de funciones invariantes Transform) para determinar los puntos clave de las imágenes y el partido ellos.

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

Se utiliza, por ejemplo, al coser las imágenes en un panorama de detectar puntos coincidentes en diferentes imágenes.

Se desea realizar un hash imagen. Puesto que no se ha especificado un lenguaje particular que supongo que no tiene 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 parte de los resultados de Google en esto son los resultados de investigación en lugar de las bibliotecas reales o herramientas.

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

pregunta bastante interesante. Más rápida y fácil sería calcular crc32 de matriz de bytes contenidos, sino que trabajaría sólo en 100% imágenes idénticas. Para comparar más inteligente que probablemente necesitará algún tipo de lógica Fuzy analyzis ...

He implementado al menos una versión trivial de esto. Transformo y cambiar el tamaño de todas las imágenes en un muy pequeño (tamaño fijo) miniatura blanco y negro. a continuación, los comparo. Detecta exacta, cambiar de tamaño, y los duplicados transforma en blanco y negro. Se recibe una gran cantidad de copias sin mucho coste.

Lo más fácil es hacer un hash (como MD5) de los datos de la imagen, haciendo caso omiso de todos los demás metadatos. Usted puede encontrar muchas bibliotecas de código abierto que puede decodificar los formatos de imagen comunes por lo que es bastante fácil de pelar metadatos.

Pero eso no funciona cuando la imagen en sí es manipulado de cualquier manera, incluyendo escalado, rotación.

Para hacer exactamente lo que quiere, usted tiene que utilizar imagen de marca de agua pero está patentado y puede ser costoso.

Esto es sólo una idea: componentes Posiblemente baja frecuencia presentes en la DCT de la jpeg podrían utilizarse como un identificador invariante tamaño

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top