¿Cómo saber si dos imágenes son iguales? [cerrado]

20

Tengo más de 10000 imágenes que alrededor de 2000 son duplicados en otros formatos (como en JPEG, PNG, GIF). Ambos números están aumentando cada día. Necesito eliminar esos duplicados y para eso debo saber cómo encontrarlos primero.

Mi primer pensamiento fue verificar los píxeles de una imagen y encontrar otras imágenes que tengan los mismos píxeles de colores en las mismas coordenadas. Pero esta opción no siempre funciona. Digamos que busco un duplicado. En cuanto al objeto de búsqueda, elijo un archivo PNG de 8 bits. Encontrará todos los duplicados de esa imagen, pero solo el PNG de 8 bits, a veces GIF de 8 bits y rara vez JPEG (debido a las imágenes algorítmicas, supongo).

Mi segundo pensamiento fue duplicar todas esas imágenes y volver a colorearlas en una estricta paleta de dos colores (digamos blanco y negro) y hacer el mismo escaneo como se indicó anteriormente. Una vez más, la imagen JPEG no es 100% similar al formato PNG o GIF (¿la misma razón que la anterior?).

El tercer pensamiento fue disminuir el porcentaje de cuánto necesita la imagen para estar familiarizado y aumentar cuánto pueden variar los colores, lo que resulta en la eliminación de imágenes no deseadas ...

¿Alguna idea?

Aistis
fuente
Los formatos con compresión con pérdida conducirán a imágenes que no son 100% idénticas a las versiones sin pérdida. ¿Debe tener una utilidad de línea de comandos o podría ejecutar un programa de interfaz gráfica de usuario que haga sugerencias y luego muestre las imágenes que tienen, digamos,> 90% de píxeles similares (calcule una desviación promedio)? (y, por supuesto, el tamaño del píxel debe ser idéntico en cualquier formato)
thorsten müller
1
¿Cuántos tendrían el mismo nombre de archivo pero diferente extensión?
JeffO
44
Respuesta útil que no requiere semanas de codificación: stackoverflow.com/questions/596262/…
mac

Respuestas:

17

Los hash perceptuales pueden ser la respuesta:

http://www.phash.org/

Un hash perceptual es una huella digital de un archivo multimedia derivado de varias características de su contenido. A diferencia de las funciones criptográficas de hash que se basan en el efecto de avalancha de pequeños cambios en la entrada que conducen a cambios drásticos en la salida, los hash perceptuales están "cerca" entre sí si las características son similares.

Joe
fuente
9
  1. Consultar dimensiones. Si es diferente => las imágenes no son lo mismo.
  2. Consultar formatos. Si es lo mismo => Realizar una comparación precisa, píxel por píxel.
  3. Si diferentes formatos hacen esto:

No compare RGB (rojo, verde, azul). Compare el brillo como la mitad del peso y compare el color / tono como la otra mitad (o 2/3 rds vs 1/3). Calcule la diferencia de valores y, dependiendo del valor de 'tolerancia', son iguales o no lo son.

JPEG comprime fuertemente la información de color pero intenta no arruinar los valores de limitación.

Boris Yankov
fuente
6

Hace unos años, cuando estaba seleccionando un montón de imágenes para duplicados, descubrí que reducir todo a miniaturas de 8x8 y luego calcular una puntuación de similitud basada en el cuadrado de la distancia (tratando los tres colores por separado) entre las miniaturas funcionó bastante bien. Tenga en cuenta que puede mantener un montón de miniaturas de 8x8 en la memoria.

Prácticamente todos los duplicados obtuvieron puntajes por debajo de los no duplicados, y el único problema fue que algunas imágenes tenían muy poco contraste y eran similares en general, aunque el contenido real variaba (el fondo en cada caso era arena de playa).

Esto también fue efectivo para capturar imágenes que eran engañosas, excepto que alguien había reducido la resolución o calidad en una para cortar el tamaño del archivo.

Loren Pechtel
fuente
1
Por lo general, YUV es mejor que RGB, menos sensible a cambios menores en el balance de color.
Martin Beckett
Esta técnica de miniaturas para preseleccionar posibles coincidencias es válida, YUV es un buen toque y he visto que se convirtió en un mapa de luminancia pura por las mismas razones.
Patrick Hughes
@ Martin Beckett: La suma de cuadrados de la diferencia RGB fue lo primero que probé y funcionó lo suficientemente bien como para no intentar mejorarlo, y en ese momento estaba atrapando a los engaños con la edición. Con una definición estricta de engaño, fue lo suficientemente bueno como para haberlo dejado eliminar automáticamente.
Loren Pechtel
@Loren, si fueran ediciones menores de píxeles de la misma imagen que deberían funcionar. Es solo que cosas como jpeg estropean RGB más que un espacio de color YUV. Solo un consejo ;-)
Martin Beckett
Por naturaleza, las imágenes muy oscuras tienden a tener una menor suma de cuadrados de diferencias, incluso si no son similares en absoluto. El umbral puede ajustarse con la luminosidad promedio de la imagen. Utilizo esta luminosidad promedio como un prefiltro para evitar comparaciones de imágenes O (n ^ 2), por lo que ya está allí.
Gabriel
1

Tal vez deberías escribir un código que escanee las imágenes en busca de semejanza. Puede convertir todas las fotos al formato ARGB y compararlas. (en memoria)

Un posible enfoque podría ser de esta manera: dividir las imágenes en zonas. Escanee el color y / o brillo promedio de las zonas para comparar dos imágenes en busca de semejanza.

Si más que decir, el 90% de las zonas coinciden, usted eligió una para pasar a la lista de candidatos de eliminación. De esta manera tienes una lista de candidatos. Puede usar la relación de aspecto de las imágenes para clasificar las imágenes en imágenes horizontales y verticales para acelerar las comparaciones. de esta manera puede compensar los algoritmos con pérdida que no reproducen los colores correctos píxel por píxel. Ejecutas el programa durante la noche, y por la mañana lo tienes hecho :) en .Net, esto se puede hacer con bastante facilidad con el GDI + lib.

En ningún
fuente