png jpeg fingerprint

¿Una forma eficiente de crear huellas digitales en una imagen(jpg, png, etc.)?



jpeg fingerprint (9)

Apuñala en la oscuridad, si buscas evitar los metadatos y las cosas relacionadas con el tamaño:

  1. Detección de bordes y comparación independiente de la escala
  2. Muestreo y análisis estadístico de escala de grises / valores RGB (lum promedio, mapa de color promediado)
  3. FFT y otras transformaciones (artículo bueno Clasificación de huellas dactilares usando FFT )

Y muchos otros.

Básicamente:

  1. Convierta cualquier archivo JPG / PNG / GIF en una matriz de bytes RGB que sea 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 un hash de la matriz RGB como algunos sugieren
  3. Luego desea un método distribuido de comparación rápida de hash basado en el umbral coincidente en el hash encapsulado o la codificación del patrón. Erlang sería bueno para esto :)

Las ventajas son:

  1. Si utiliza cualquier AI / entrenamiento, detectará duplicados independientemente de la codificación, el tamaño, el aspecto, el tono y la modificación lumínica, las diferencias de rango dinámico / submuestreo y, en algunos casos, la perspectiva.

Desventajas:

  1. Puede ser difícil de codificar ... algo como OpenCV podría ayudar
  2. Probabilística ... es probable que se obtengan falsos positivos, pero se pueden reducir con redes neuronales y otras IA
  3. Lento, a menos que pueda encapsular cualidades de patrón y distribuir la búsqueda (estilo MapReduce)

Libros de análisis de imagen de pago, tales como:

  1. Clasificación de patrones 2ed
  2. Fundamentos del Procesamiento de Imágenes
  3. Procesamiento de imágenes - 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 el escalado tiene pérdidas en más formas que la reducción de muestras.

¿Existe una forma eficiente de obtener una huella digital de una imagen para la detección de duplicados?

Es decir, dado un archivo de imagen, digamos un jpg o png, me gustaría poder calcular rápidamente un valor que identifique el contenido de la imagen y sea bastante resistente a otros aspectos de la imagen (por ejemplo, los metadatos de la imagen) 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 ejemplo. ¿Puedo omitir los primeros x bytes del archivo o tomar x bytes del final del archivo para asegurarme de que no estoy obteniendo metadatos?


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

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



El uso del tamaño de byte de la imagen para comparación sería adecuado para muchas aplicaciones. Otra forma sería:

  1. Elimina los metadatos.
  2. Calcule el MD5 (u otro algoritmo de hashing adecuado) para la imagen.
  3. Compare eso con el MD5 (o lo que sea) de la imagen de duplicidad potencial (siempre que haya eliminado los metadatos para esa también)

Esto es solo una idea: posiblemente los componentes de baja frecuencia presentes en la DCT del jpeg podrían usarse como un identificador invariante de tamaño.


He implementado al menos una versión trivial de esto. Transformo y redimensiono todas las imágenes a una miniatura en blanco y negro muy pequeña (tamaño fijo). Entonces comparo esos. Detecta el tamaño exacto, el tamaño y los duplicados transformados a blanco y negro. Obtiene muchos duplicados sin mucho costo.


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

Pero eso no funciona cuando la imagen en sí se manipula de cualquier manera, incluida la escala y la rotación.

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


Podría usar un algoritmo como SIFT (Transformación de la característica invariante de escala) para determinar los puntos clave de las imágenes y hacer coincidir estos.

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

Se utiliza, por ejemplo, cuando se unen imágenes en un panorama para detectar puntos coincidentes en diferentes imágenes.


Pregunta bastante interesante. Lo más rápido y sencillo sería calcular crc32 de la matriz de bytes de contenido, pero eso solo funcionaría en imágenes 100% idénticas. Para una comparación más inteligente, probablemente necesite algún tipo de análisis de lógica difusa ...