Consiglierei di considerare di allontanarsi dall'usare solo un istogramma RGB.
È possibile ottenere un riassunto migliore della tua immagine se prendi un wavelet 2d Haar dell'immagine (è molto più facile di quanto sembri, è solo un sacco di media e alcune radici quadrate usate per pesare i tuoi coefficienti) e mantieni solo il k più grande coefficienti ponderati nel wavelet come un vettore sparse, normalizzarlo e salvarlo per ridurne le dimensioni. Dovresti riscalare RG e B usando almeno i pesi percettivi in anticipo o ti consiglio di passare a YIQ (o YCoCg, per evitare il rumore di quantizzazione) in modo da poter campionare le informazioni sulla crominanza con importanza ridotta.
È ora possibile utilizzare il prodotto scalare di due di questi vettori normalizzati sparsi come misura della somiglianza. Le coppie di immagini con i prodotti di punti più grandi saranno molto simili nella struttura. Questo ha il vantaggio di essere leggermente resistente al ridimensionamento, allo spostamento della tonalità e alla filigrana, ed è davvero facile da implementare e compattare.
È possibile compromettere l'archiviazione e la precisione aumentando o diminuendo k.
L'ordinamento in base a un singolo punteggio numerico sarà intrattabile per questo tipo di problema di classificazione. Se ci pensi, le immagini dovrebbero essere in grado di "cambiare" solo lungo un asse, ma non lo fanno. Questo è il motivo per cui hai bisogno di un vettore di caratteristiche. Nel caso wavelet di Haar è approssimativamente dove si verificano le discontinuità più nette nell'immagine. Puoi calcolare una distanza tra le immagini a coppie, ma poiché tutto ciò che hai è una metrica della distanza, un ordinamento lineare non ha modo di esprimere un "triangolo" di 3 immagini che sono tutte ugualmente distanti. (es. pensa a un'immagine che è tutta verde, un'immagine che è tutta rossa e un'immagine che è tutta blu.)
Ciò significa che qualsiasi soluzione reale al tuo problema richiederà O (n ^ 2) operazioni nel numero di immagini che hai. Considerando che se fosse stato possibile linearizzare la misura, si potrebbe richiedere solo O (n log n), o O (n) se la misura fosse adatta, diciamo, a un ordinamento digitale. Detto questo, non è necessario spendere O (n ^ 2) poiché in pratica non è necessario setacciare l'intero set, devi solo trovare le cose che sono più vicine di una certa soglia. Quindi, applicando una delle diverse tecniche per partizionare il tuo spazio vettoriale sparso puoi ottenere asintotici molto più veloci per il problema del 'trovarmi k delle immagini che sono più simili a una data soglia' piuttosto che confrontare ingenuamente ogni immagine con ogni immagine, dandoti cosa probabilmente hai bisogno di ... se non esattamente quello che hai chiesto.
In ogni caso, l'ho usato alcuni anni fa con buoni risultati personalmente quando cercavo di ridurre al minimo il numero di diverse trame che stavo memorizzando, ma c'è stato anche un sacco di rumore di ricerca in questo spazio che mostra la sua efficacia (e in questo caso il confronto a una forma più sofisticata di classificazione dell'istogramma):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Se hai bisogno di una migliore precisione nel rilevamento, gli algoritmi minHash e tf-idf possono essere utilizzati con il wavelet di Haar (o l'istogramma) per gestire le modifiche in modo più robusto:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Infine, Stanford ha una ricerca di immagini basata su una variante più esotica di questo tipo di approccio, basata sull'estrazione di più funzionalità dalle wavelet per trovare sezioni di immagini ruotate o ridimensionate, ecc., Ma questo probabilmente va ben oltre la quantità di lavoro vorrei fare.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi