Come sapere se due immagini sono uguali? [chiuso]

19

Ho oltre 10000 immagini che circa 2000 sono duplicati in altri formati (come in JPEG, PNG, GIF). Entrambi questi numeri aumentano ogni giorno. Devo cancellare quei duplicati e per quello devo sapere come trovarli prima.

Il mio primo pensiero è stato controllare i pixel di immagini e trovare altre immagini con gli stessi pixel colorati nelle stesse coordinate. Ma questa opzione non sempre funziona. Diciamo che cerco un duplicato. Per quanto riguarda l'oggetto ricercabile, scelgo un file PNG a 8 bit. Troverai tutti i duplicati di quell'immagine, ma solo il PNG a 8 bit, a volte GIF a 8 bit e raramente JPEG (a causa delle immagini algoritmiche, suppongo?).

Il mio secondo pensiero è stato quello di duplicare tutte quelle immagini e ricolorarle in una rigida palette a due colori (diciamo nero e bianco) e fare la stessa scansione di cui sopra. Ancora una volta l'immagine JPEG non è simile al 100% al formato PNG o GIF (lo stesso motivo di cui sopra?).

Il terzo pensiero era di ridurre la percentuale su quanto l'immagine deve essere familiare e aumentare di quanto i colori possono variare, con conseguente rimozione indesiderata delle immagini. ..

Qualche idea?

    
posta Aistis 14.07.2011 - 14:01
fonte

4 risposte

13

Gli hash percettivi possono essere la risposta:

link

A perceptual hash is a fingerprint of a multimedia file derived from various features from its content. Unlike cryptographic hash functions which rely on the avalanche effect of small changes in input leading to drastic changes in the output, perceptual hashes are "close" to one another if the features are similar.

    
risposta data 14.07.2011 - 16:44
fonte
9
  1. Controlla le dimensioni. Se diverso = > le immagini non sono le stesse.
  2. Controlla i formati. Se lo stesso = > Esegui un confronto preciso, pixel per pixel.
  3. Se diversi formati fanno questo:

Non confrontare RGB (rosso, verde, blu). Confronta la luminosità come metà del peso e confronta il colore / tonalità dell'altra metà (o 2/3 vs 1/3). Calcola la differenza di valori e in base al valore di 'tolleranza' sono uguali o non lo sono.

JPEG comprime pesantemente le informazioni sul colore ma cerca di non rovinare i valori di liminanza.

    
risposta data 14.07.2011 - 16:58
fonte
5

Quando stavo proiettando un gruppo di immagini per i duplicati qualche anno fa, ho scoperto che ridurre tutto a miniature 8x8 e calcolare un punteggio di somiglianza basato sul quadrato della distanza (trattando separatamente i tre colori) tra le miniature funzionava abbastanza bene . Nota che puoi tenere un LOT di miniature 8x8 in memoria.

Praticamente tutti i duplicati hanno ottenuto punteggi inferiori ai non-duplicati, a parte gli unici problemi rappresentati da alcune immagini con contrasto molto basso e simili nel complesso anche se il contenuto effettivo variava (lo sfondo in entrambi i casi era sabbia della spiaggia.)

Questo è stato anche efficace per catturare immagini che erano ingannevoli, tranne che qualcuno aveva ridotto la risoluzione o la qualità su uno per ridurre le dimensioni del file.

    
risposta data 14.07.2011 - 18:24
fonte
1

Forse dovresti scrivere un codice che scansiona le immagini per somiglianza. Puoi convertire tutte le foto in formato ARGB e confrontarle. (in memoria)

Un possibile approccio potrebbe essere in questo modo: Dividere le immagini in zone. Scansione del colore e / o della luminosità medi delle zone per confrontare due immagini per la somiglianza.

Se più che dire, il 90% delle zone corrisponde, ne hai scelto uno per passare all'elenco delle eliminazioni candidate. In questo modo hai una lista di candidati. È possibile utilizzare le proporzioni delle immagini per classificare le immagini in immagini orizzontali e verticali per accelerare i confronti. in questo modo è possibile compensare algoritmi con perdita di dati non riproducendo i colori giusti pixel per pixel. Gestisci il programma durante la notte e al mattino lo hai fatto :) in .Net questo può essere fatto abbastanza facilmente con GDI + lib.

    
risposta data 14.07.2011 - 15:07
fonte

Leggi altre domande sui tag