Come sapere se due immagini sono uguali? [chiuso]


20

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

Il mio primo pensiero è stato quello di controllare i pixel delle immagini e trovare altre immagini che abbiano gli stessi pixel colorati nelle stesse coordinate. Ma questa opzione non funziona sempre. Diciamo che cerco un duplicato. Per quanto riguarda l'oggetto ricercabile, scelgo un file PNG a 8 bit. Troverà 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 rigorosa tavolozza di due colori (diciamo bianco e nero) 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 di quanto l'immagine deve avere familiarità e aumentare la quantità di colori che possono variare, con conseguente rimozione indesiderata dell'immagine ...

qualche idea?



I formati con compressione con perdita generano immagini non identiche al 100% alle versioni senza perdita. Devi avere un'utilità a riga di comando o potresti eseguire un programma gui, che fornisce suggerimenti, quindi mostra le immagini che hanno, diciamo> pixel simili> 90% (calcola una deviazione media)? (e ovviamente la dimensione dei pixel dovrebbe essere identica in qualsiasi formato)
thorsten müller


1
Quanti avrebbero lo stesso nome file ma estensione diversa?
JeffO,

4
Risposta utile che non richiede settimane di codifica: stackoverflow.com/questions/596262/…
mac

Risposte:


17

Gli hash percettivi possono essere la risposta:

http://www.phash.org/

Un hash percettivo è un'impronta digitale di un file multimediale derivato da varie funzionalità dal suo contenuto. A differenza delle funzioni hash crittografiche che si basano sull'effetto valanghe di piccoli cambiamenti nell'input che portano a drastici cambiamenti nell'output, gli hash percettivi sono "vicini" tra loro se le caratteristiche sono simili.


9
  1. Verifica le dimensioni Se le immagini differenti => non sono uguali.
  2. Controlla i formati. Se lo stesso => ​​Esegui un confronto preciso, pixel per pixel.
  3. Se diversi formati lo fanno:

Non confrontare RGB (rosso, verde, blu). Confronta la luminosità con la metà del peso e confronta il colore / tonalità con l'altra metà (o 2 / 3rds contro 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 limitazione.


6

Alcuni anni fa, quando stavo proiettando un sacco di immagini per i duplicati, ho scoperto che ridurre tutto a miniature 8x8 e quindi calcolare un punteggio di somiglianza basato sul quadrato della distanza (trattando i tre colori separatamente) tra le miniature ha funzionato abbastanza bene. Nota che puoi tenere MOLTE miniature 8x8 in memoria.

Praticamente tutti i duplicati hanno segnato al di sotto dei non duplicati, l'unico problema era rappresentato da alcune immagini che avevano un contrasto molto basso e simili nel complesso, anche se il contenuto effettivo variava (lo sfondo in ogni caso era la sabbia della spiaggia).

Ciò è stato efficace anche nel catturare immagini che erano duplicate, tranne per il fatto che qualcuno aveva ridotto la risoluzione o la qualità su una per ridurre le dimensioni del file.


1
In genere YUV è migliore di RGB, meno sensibile ai cambiamenti minori nel bilanciamento del colore.
Martin Beckett,

Questa tecnica di miniature per preselezionare potenziali corrispondenze è valida, YUV è un bel tocco e l'ho visto trasformato in una pura mappa di luminanza per gli stessi motivi.
Patrick Hughes,

@Martin Beckett: La somma dei quadrati della differenza RGB è stata la prima cosa che ho provato e ha funzionato abbastanza bene da non aver provato a migliorarlo - e in quel momento ha catturato i duplicati con l'editing. Con una definizione rigorosa di dupe è stato abbastanza buono che avrei lasciato che si eliminasse automaticamente.
Loren Pechtel,

@ Loren, se fossero piccole modifiche ai pixel della stessa immagine che dovrebbero funzionare. È solo che cose come jpeg rovinano RGB più di uno spazio colore YUV. Solo un consiglio ;-)
Martin Beckett,

Per natura, le immagini molto scure tendono ad avere una somma inferiore dei quadrati delle differenze, anche se non sono affatto simili. La soglia potrebbe essere regolata con la luminosità media dell'immagine. Uso questa luminosità media come pre-filtro per evitare confronti di immagini O (n ^ 2), quindi è già lì.
Gabriel,

1

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

Un possibile approccio potrebbe essere in questo modo: dividere le immagini in zone. Scansiona il colore e / o la luminosità medi delle zone per confrontare due immagini per somiglianza.

Se più che dire, il 90% delle zone corrisponde, ne hai scelto uno per passare all'elenco dei candidati alla cancellazione. In questo modo hai un elenco 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 gli algoritmi con perdita che non riproducono i colori giusti pixel per pixel. Esegui il programma dall'oggi al domani, e la mattina lo hai fatto :) in .Net questo può essere fatto abbastanza facilmente con lui GDI + lib.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.