OpenCV / SURF Come generare un hash di immagine / impronta digitale / firma fuori dai descrittori?

Ci sono alcuni argomenti qui che sono molto utili su come trovare immagini simili.

Quello che voglio fare è ottenere un’impronta digitale di una foto e trovare la stessa immagine su diverse foto scattate da una fotocamera digitale. L’algoritmo SURF sembra essere il modo migliore per essere indipendente su ridimensionamento, angolo e altre distorsioni.

Sto usando OpenCV con l’algoritmo SURF per estrarre funzionalità sull’immagine di esempio. Ora mi chiedo come convertire tutti i dati di questa feature (posizione, laplacian, dimensione, orientamento, hessian) in un’impronta digitale o hash.

Questa impronta digitale verrà memorizzata in un database e una query di ricerca deve essere in grado di confrontare quell’impronta digitale con un’impronta digitale di una foto con quasi le stesse caratteristiche.

Aggiornare:

    Sembra che non ci sia modo di convertire tutti i vettori di descrittori in un semplice hash. Quindi quale sarebbe il modo migliore per archiviare i descrittori di immagini nel database per l’interrogazione veloce?

    Gli alberi del vocabolario sarebbero un’opzione?

    Sarei molto grato per qualsiasi aiuto.

    Un modo semplice per calcolare un hash sarebbe il seguente. Ottieni tutti i descrittori dall’immagine (diciamo, N di loro). Ogni descrittore è un vettore di 128 numeri (è ansible convertirli in numeri interi tra 0 e 255). Quindi hai un set di interi N * 128. Basta scriverli uno dopo l’altro in una stringa e usarli come valore hash. Se si desidera che i valori hash siano piccoli, credo che esistano modi per calcolare le funzioni hash delle stringhe, quindi convertire i descrittori in stringa e quindi utilizzare il valore hash di tale stringa.

    Potrebbe funzionare se vuoi trovare duplicati esatti. Ma sembra (dal momento che parli di scala, rotazione, ecc.), Vuoi solo trovare immagini “simili”. In tal caso, usare un hash non è probabilmente un buon modo per andare. Probabilmente utilizzi un rilevatore di punti di interesse per trovare punti in cui calcolare i descrittori SURF. Immagina di restituire lo stesso insieme di punti, ma in ordine diverso. All’improvviso il tuo valore di hash sarà molto diverso, anche se le immagini e i descrittori sono gli stessi.

    Quindi, se dovessi trovare immagini simili in modo affidabile, userei un approccio diverso. Ad esempio, potrei quantizzare vettoriale i descrittori SURF, creare istogrammi di valori quantizzati da vettori e utilizzare l’intersezione dell’istogramma per la corrispondenza. Devi assolutamente usare le funzioni hash (forse per l’efficienza) o vuoi semplicemente usare qualsiasi cosa per trovare immagini simili?

    Sembra che il GIST potrebbe essere una cosa più appropriata da usare.

    http://people.csail.mit.edu/torralba/code/spatialenvelope/ ha il codice MATLAB.

    Min-Hash o min-Hashing è una tecnica che potrebbe aiutarti. Codifica l’intera immagine in una rappresentazione con dimensione regolabile che viene quindi memorizzata in tabelle hash. Esistono diverse varianti come Minimalismo geometrico, Minima hash della partizione e Minaccia hash Bundle . L’impronta di memoria risultante non è una delle più piccole, ma queste tecniche funzionano per una varietà di scenari come il recupero quasi duplicato e anche il recupero di oggetti di piccole dimensioni – uno scenario in cui le altre firme brevi spesso non si comportano molto bene.

    Ci sono diversi articoli su questo argomento. La letteratura di entrata sarebbe: Near Duplicate Image Detection: min-Hash e tf-idf Ponderazione Ondrej Chum, James Philbin, Andrew Zisserman, BMVC 2008 PDF