2013-03-05 7 views
10

Qualche tempo fa, ho trascorso un po 'di tempo a cercare modi per determinare se due immagini sono identiche per rispondere a this question. Ora mi trovo di fronte a un problema leggermente diverso: ho circa duemila immagini a portata di mano, alcune delle quali hanno lo stesso contenuto, ma sono versioni ridimensionate/ruotate l'una dall'altra (le rotazioni sono sempre da multipli di 90 °), insieme al problema di compressioni e formati di immagine diversi (principalmente jpg, alcuni png, nient'altro). Il ridimensionamento non va oltre 2: 1. Quello che mi piacerebbe fare è eliminare i duplicati pur mantenendo l'istanza di massima qualità. Poiché Java è l'unico linguaggio in cui sono abbastanza esperto, ho bisogno di usare Java.Identifica immagini con lo stesso contenuto in Java

The answers a una domanda diversa offrono molti collegamenti utili, ma non sembra che nessuno di essi possa identificare i duplicati quando ridimensionato/ruotato.

This question along with the answers suggerire prima ridimensionare tutte le immagini a una dimensione molto piccola (diciamo 32 * 32 o 16 * 16), quindi fondamentalmente facendo un po 'di hashing e confronti basati sull'hash. Questo suona abbastanza intelligente per me, le immagini potrebbero essere pre-ordinate prima del confronto, che dopo l'ordinamento sarebbe un problema O (n). Tuttavia, dato che le immagini possono essere ruotate, non sono sicuro di come gestirlo; un'opzione sarebbe quella di passare manualmente a tutte le immagini e decidere una rotazione, dato che ciò che ritraggono ha un chiaro orientamento (l'occhio umano può facilmente decidere in quale direzione dovrebbe essere "su"). Se possibile, vorrei comunque evitarlo.

Esistono metodi/algoritmi stabiliti (i collegamenti menzionano SSIM) per gestire questo tipo di problemi o qualcuno di voi può trovare modi migliori di quelli descritti sopra? Forse qualcuno conosce le librerie per Java che si adattano bene al compito (nelle domande collegate si parla di un wrapper Java per OpenCV, quindi ImageJ, imgsclr)? Qualsiasi aiuto è apprezzato.

risposta

5

Penso che la risposta generale a questa domanda richieda un approccio di apprendimento automatico non supervisionato che genera funzionalità invarianti locali, in pratica un modo ingegnoso per trovare gli hash che non cambiano con il ridimensionamento o la rotazione e quindi eseguire un algoritmo di clustering . Qui ci sono alcuni documenti che potrebbero essere rilevanti:

+0

Cheers, darò un'occhiata a quelli - sembra solido! –

+0

Dopo aver dato un'occhiata a questo materiale, ti darei un paio di voti in più; più che sufficiente per fare quello che voglio fare! –

0

Beh penso che Dhash è qualcosa hai bisogno di questo. Devi solo migliorare dHash per prendere in considerazione la rotazione, il che significa che 2000 immagini saranno considerate come 8000 immagini.

Ho scritto una libreria java pura solo per pochi giorni indietro. È possibile alimentarlo con il percorso della directory (include la sottodirectory) ed elencherà le immagini duplicate nell'elenco con il percorso assoluto che si desidera eliminare. In alternativa, puoi usarlo per trovare tutte le immagini uniche in una directory.

Ha utilizzato awt api internamente, quindi non può essere utilizzato per Android. Dal momento che, imageIO ha problemi a leggere un sacco di nuovi tipi di immagini, sto usando un vaso di dodici scimmie che viene usato internamente.

https://github.com/srch07/Duplicate-Image-Finder-API

Vaso con le dipendenze bundle internamente può essere scaricato da, https://github.com/srch07/Duplicate-Image-Finder-API/blob/master/archives/duplicate_image_finder_1.0.jar

l'API può trovare i duplicati tra le immagini di diverse dimensioni troppo.

Problemi correlati