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?
fuente
Respuestas:
Los hash perceptuales pueden ser la respuesta:
http://www.phash.org/
fuente
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.
fuente
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.
fuente
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.
fuente