Newsgroup: it.comp.www.php
Titolo: Identificare immagini doppie

Ho un archivio con circa 2000 immagini e dovrei cercarne i doppioni.
L'archivio č cosě strutturato:
Ogni foto corrisonde ad un record in database mysql nel quale ci sono, fra 
gli altri, i campi ID e titolo dell'immagine.
I file delle immagini si trovano fisicamente in una cartella del server.
In questa castella il nome di ogni immagine corrisponde all'ID del record 
della propria descrizione.
Una parte dei doppioni ha anche lo stesso nome per cui risulta semplice 
individuarli.
Il problema sorge dal fatto che esistono immagini identiche con nomi 
diversi, pensavo di leggerle tutte facendo i confronti con getimagesize.
Purtroppo, non riesco a trovare la descrizione di tutti e 7 parametri che la 
funzione restituisce e comunque moltissime immagini hanno la stassa altezza 
e larghezza.
Mi potete suggerire non un sitema diverso e/o migliore?
Grazie
Leonardo 

 Mi potete suggerire non un sitema diverso e/o migliore?
Calcolare il checksum MD5 del file?
	Y.

 stassa altezza e larghezza.
Sara` difficile che trovi una singola funzione, visto che si tratta di 
una procedura abbastanza complessa e che ci sono interi software dedicati 
solo a quello.
Il tuo metodo puo` essere utile per una prima scrematura molto veloce:
se una delle due dimensioni (parametri 0 e 1 restituiti da getimagesize)
e` diversa tra le due, o il tipo (parametro 2) e` diverso, e` inutile 
fare altre verifiche: sono diverse.
Se il primo test (sulle dimensioni e il tipo) dice che sono simili 
(stesse dimensioni e stesso tipo), allora puoi procedere con un controllo 
piu` accurato, per esempio calcolando l'md5 di entrambi i file e 
confrontandolo.
Puoi usare md5_file() per farlo.
Se i due hash sono diversi, hai sicuramente due file diversi.
Se sono uguali hai una minima possibilita` (1 su qualche miliardo) che le 
due immagini siano diverse e diano lo stesso md5. A te vedere se vale la 
pena aprire e confrontarle pixel per pixel per controllare se sono 
identiche, o accettare il rischio. :)
Ora a te trovare un algoritmo con complessita` n o nlogn al posto di uno 
n^2 per fare i controlli. ;)
Bye.



Controlli gerarchici.
function is_same_image($file1, $file2)
{
	if ($file1 == $file2)
		return true;
	if (filesize($file1) != filesize($file2))
		return false;
	$dati1 = getimagesize($file1);
	$dati2 = getimagesize($file2);
	if (serialize($dati1) != serialize($dati2))
		return false;
	// Stessa dimensione di file, stesse dimensioni
	// di immagine. Tocca leggersela tutta.
	if (md5_file($file1) != md5_file($file2))
		return false;
	return true;
}
Altrimenti, potresti usare compare() di ImageMagick, per esempio se vuoi
considerare "uguali" una TIFF 4000x3000 e la sua thumbnail JPEG 400x300:
se hanno lo stesso aspect ratio entro .99-1.01, ricampioni il grosso sul
piccolo, magari sfuochi tutti e due, e fai un compare.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

piccolo, magari sfuochi tutti e due, e fai un compare.
...ma la cosa migliore è sapere COME sono stati generati i file e COME e'
che ci sono i duplicati.
Per esempio, in quasi tutti i workflow "seri" o comunque fatti usando uno
strumento adeguato tipo PhotoShop, i formati TIFF e JPEG dovrebbero avere
dei dati Exif utilizzabili per determinare la duplicazione.
In particolare due file potresti considerarli "uguali" se e solo se hanno
il medesimo OriginalDocumentID (xmp->did)... anche se magari l'iid non e'
lo stesso.
Quindi scandisci tutti i documenti, estrai tutti i DID con exiftool o con
altro strumento adatto, magari ci aggiungi anche Width e Height (cosi' da
distinguere un originale o "quasi originale" (crop) da una thumbnail), ed
inserisci tutto in una tabella ausiliaria:
	Nomefile	DID	Width	Height
...a quel punto i duplicati li trovi con una semplice query SQL usando il
campo DID.



I file sono generati tutti da foto digitali e non ci sono thumbnail.
Poi sono stati eleborati con software di grafica, non so quale, penso Gimp 
ma potrebbe anche essere stato Corel o Photoshop. Per elaborati, intendo che 
fu ridotta la foto originale a 640x480 pixel e nulla più.
La duplicazione è dovuta al fatto che sono divisi in gruppi per soggetto, ma 
alcuni gruppi sono fatti da immagini prese in parte da altri gruppi 
duplicandole e volte combiando anche nome all'immagine.
Mi potresti linkare qualcosa di OriginalDocumentID (xmp->did)? non lo 
conosco.
Grazie
Saluti
Leonardo

conosco.
E' uno degli ennemila tag Exif. La teoria (poi ovviamente un sacco di
serpi là fuori fanno quel che gli pare) e' che quando l'oggetto viene
GENERATO gli viene assegnato un UUID unico che è l'OriginalDocumentID
- poi tu lo editi, e allora assegni ANCHE un InstanceID, ma gli lasci
stare il DID. Cosi' tutti gli oggetti digitali che "discendono" dalla
tua prima acquisizione sono rintracciabili.
Procurati ExifTool (per me, numero uno) e dagli una di quelle foto in
pasto. Ti elencherà i tag che trova. Se hai un minimo di fortuna, fra
questi leggerai
	OriginalDocumentID:	...
	InstanceID:		...
e, con un altro pochino di fortuna, due duplicati avranno il medesimo
DID. Se chi ha duplicato la foto l'ha fatto copiandola e cambiando il
nome da fuori, DI SICURO avranno lo stesso DID. Ma anche mantrugiando
con gimp o PhotoShop il DID dovrebbe restare uguale.
E ci dovrebbe essere un'estensione ExifTool per PHP. Se non ce l'hai,
e non la puoi installare, un pianto e un lamento e lanci exiftool dal
PHP leggendone l'output con shell_exec(). Sistema barbaro e fetuso, e
naturalmente lento come un giorno senza pane, pero'... funziona! :-D
Con qualche riga di Perl o sed (Linux), non serve neanche il PHP, fai
direttamente lo script SQL da buttare dentro MySQL. Poi la JOIN e sei
lesto.


 ha scritto nel messaggio 
news:7amt66dji0spu6k9u...@L.Serni...

Grazie 100000000000
Leonardo

 solo a quello.
http://effbot.org/zone/pil-comparing-images.htm
Di queste cosa ne pensi?
Purtroppo nella mia ignoranza io non riesco neppure a provarle perche` non 
ho capito come indicare quali sone effettivamente le due immagini da 
comparare. :-/

 comparare. :-/
Innanzitutto e` python e non php. :)
Poi e` comunque una libreria di elaborazione immagini (ImageChops) che 
contiene diverse funzioni che possono servire ad analizzarle e 
confrontare i risultati.
Puo` essere utile, per esempio, per capire se hai due immagini simili ma 
con luminosita` diversa.
Per finire, e` un articolo di 13 anni fa. Forse si trova qualcosa di piu` 
recente... :)
Bye.