2010-03-21 15 views
6

Tengo un montón de imágenes PNG, y estoy buscando una manera de identificar duplicados. Por duplicados quiero decir, específicamente, dos archivos PNG cuyos datos de imagen no comprimidos son idénticos, no necesariamente cuyos archivos son idénticos. Esto significa que no puedo hacer algo simple como comparar valores de hash CRC.¿Hay alguna manera simple de probar dos PNG por igualdad?

Me imagino que esto realmente se puede hacer de manera confiable ya que los PNG usan compresión sin pérdida, pero me preocupa la velocidad. Sé que puedo aventar un poco las cosas probando primero las dimensiones iguales, pero cuando llega el momento de comparar las imágenes entre sí, ¿hay alguna forma de hacerlo razonablemente eficiente? (Es decir. Más rápido que los "valores de comprobación de píxeles doble para-loop uno contra el otro" método de fuerza bruta?)

+0

¿Por qué necesita 2 bucles? 1 lazo es suficiente. – kennytm

+0

Uno para X, uno para Y –

+0

Seguramente si pone una imagen a través de compresión PNG, saldrá igual si lo hace dos veces, lo que significa que debería poder comparar los dos PNG directamente. – Chris

Respuesta

3

A menos que espere una gran cantidad de duplicados, en promedio no va a comparar muchos píxeles antes de determinar que 2 archivos son diferentes. Especialmente si cada píxel que prueba está ubicado lejos de los píxeles ya probados. Esto ayudará con, por ejemplo, archivos de líneas de arte que tienen el mismo color de fondo.

Además, ¿qué tan preciso debe ser? Por ejemplo, si 10 píxeles probados de esta manera son iguales, ¿puede concluir con seguridad que las imágenes son idénticas? 10 píxeles RGB = 240 bits, por lo que la tasa de coincidencia falsa con imágenes aleatorias debe ser 1 en 2^240 = 1 en 10^72!

+0

No son imágenes aleatorias, y estoy esperando una gran cantidad de duplicados. Pero la idea de probar valores aleatorios como una técnica de filtrado es buena. –

13
  1. filtro por tamaño de la imagen idéntica (anchura & altura)
  2. archivo abierto
  3. de hash contenido descomprimido (MD5 haría probablemente)
  4. tienda de hash

  5. comparar valores hash para encontrar los idénticos

+1

¿Por qué clasificar por tamaño idéntico? – zneak

+3

Creo que esta es una respuesta sólida. Después del filtro, algunas muestras/comparaciones rápidas de píxeles en algunos puntos aleatorios también pueden eliminar algunas imágenes. –

+0

Oh, está bien. Pensé que era "tamaño" como en "tamaño de archivo". – zneak

0

Supongo que es posible que pueda ajustar el tamaño de los datos que se leen, aunque el formato de almacenamiento sea completamente diferente. Entonces, si su imagen es de 24 bits, posiblemente pueda usar un tipo de datos de 32 bits o de 64 bits (si está compilado en 64 bits) y seguir compactando los datos en dos variables de estos tipos de ambas imágenes y comparar los dos para la igualdad . Esto podría acelerar un poco las cosas :)

6

En lugar de recorrer todos los píxeles para comprobar la igualdad, puede valer la pena comenzar desde el centro y abrirse camino hacia el exterior. La mayoría de las imágenes tienen el sujeto en el medio, lo que significa que hay más datos de funciones aquí. En esencia, será mucho más rápido descubrir si dos imágenes son diferentes de esta manera.

Cuestiones relacionadas