Rilevare se due immagini sono visivamente identiche

A volte due file di immagine possono essere diversi a livello di file, ma un essere umano li considererebbe percettivamente identici. Detto questo, ora supponiamo di avere un enorme database di immagini e desideri sapere se un essere umano potrebbe pensare che qualche immagine X sia presente nel database o meno. Se tutte le immagini avessero un hash / un’impronta percettiva percettibile, allora si potrebbe scartare l’immagine X e sarebbe semplice vedere se si trova nel database o no.

So che c’è una ricerca su questo problema e alcuni algoritmi esistono, ma c’è qualche strumento, come uno strumento da riga di comando UNIX o una libreria che potrei usare per calcolare un tale hash senza implementare alcun algoritmo da zero?

modifica: codice rilevante da findimagedupes, utilizzando ImageMagick

try $image->Sample("160x160!"); try $image->Modulate(saturation=>-100); try $image->Blur(radius=>3,sigma=>99); try $image->Normalize(); try $image->Equalize(); try $image->Sample("16x16"); try $image->Threshold(); try $image->Set(magick=>'mono'); ($blob) = $image->ImageToBlob(); 

modifica: attenzione! L’object immagine ImageMagick $ sembra contenere informazioni sul tempo di creazione di un file immagine che è stato letto. Ciò significa che il blob ottenuto sarà diverso anche per la stessa immagine, se è stato recuperato in un altro momento. Per assicurarti che l’impronta digitale rimanga invariata, usa $ image-> getImageSignature () come ultimo passaggio.

findimagedupes è abbastanza buono. È ansible eseguire “findimagedupes -v immagini di impronte digitali” per consentire di stampare “hash percettivo”, ad esempio.

La correlazione incrociata o la correlazione di fase ti dirà se le immagini sono le stesse, anche con rumore, degradazione e offset orizzontali o verticali. L’uso dei metodi basati su FFT renderà molto più veloce dell’algoritmo descritto nella domanda.

Il solito algoritmo non funziona per le immagini che non hanno la stessa scala o rotazione. È ansible pre-ruotare o pre-ridimensionarli, ma è molto intenso sul processore. Apparentemente puoi anche fare la correlazione in uno spazio log-polare e sarà invariante rispetto a rotazione, traduzione e scala, ma non conosco abbastanza bene i dettagli per spiegarlo.

Esempio MATLAB: registrazione di un’immagine utilizzando la correlazione incrociata normalizzata

Wikipedia chiama questa ” correlazione di fase ” e descrive anche la sua invarianza di scala e di rotazione :

Il metodo può essere esteso per determinare le differenze di rotazione e ridimensionamento tra due immagini convertendo prima le immagini in coordinate log-polare. A causa delle proprietà della trasformata di Fourier, i parametri di rotazione e ridimensionamento possono essere determinati in modo invariato rispetto alla traduzione.

L’istogramma di colore è buono per la stessa immagine che è stata ridimensionata, ricampionata, ecc.
Se vuoi abbinare le foto di persone diverse dello stesso punto di riferimento è più difficile – guarda i classificatori di haar. Opencv è una grande libreria gratuita per l’elaborazione delle immagini.

Non conosco l’algoritmo alla base, ma Microsoft Live Image Search ha appena aggiunto questa funzionalità. Picasa ha anche la capacità di identificare i volti nelle immagini e raggruppa facce che sembrano simili. La maggior parte delle volte è la stessa persona.

Alcune tecnologie di apprendimento automatico come una macchina vettoriale di supporto, una rete neurale, un classificatore di Bayes naive o una rete bayesiana sarebbero le migliori per questo tipo di problema. Ho scritto uno ciascuno dei primi tre per classificare cifre scritte a mano, che è essenzialmente il riconoscimento del pattern di immagine.

ridimensiona l’immagine a un pixell 1×1 … se sono esatti, c’è una piccola probabilità che siano la stessa immagine … ora ridimensiona l’immagine a un pixel 2×2, se tutti e 4 i pixel sono esatti, c’è una probabilità maggiore che essi sono esatti … quindi 3×3, se tutti e 9 i pixel sono esatti … buone possibilità ecc. Quindi 4×4, se tutti e 16 i pixel sono esatti, … migliore possibilità.

eccetera…

Facendolo in questo modo, puoi migliorare l’efficienza … se la griglia di 1×1 pixel è molto spenta, perché preoccuparsi di controllare la griglia 2×2? eccetera.

Se si dispone di molte immagini, è ansible utilizzare un istogramma di colore per ottenere una ruvida prossimità delle immagini prima di eseguire un confronto completo dell’immagine di ciascuna immagine l’una contro l’altra (ovvero O (n ^ 2)).

Potresti usare diff per vedere se sono VERAMENTE diversi .. Immagino che rimuoverà molti paragoni inutili. Quindi, per l’algoritmo, utilizzerei un approccio probabilistico .. quali sono le probabilità che abbiano lo stesso aspetto .. Avevo basato quello sulla quantità di rgb in ogni pixel. Potresti anche trovare altre metriche come la luminosità e cose del genere.

C’è DPEG , “The” Duplicate Media Manager , ma il suo codice non è aperto. È uno strumento molto vecchio – ricordo di averlo usato nel 2003.