Ich würde empfehlen, nicht nur ein RGB-Histogramm zu verwenden.
Eine bessere Übersicht über Ihr Bild erhalten Sie, wenn Sie ein 2D-Haar-Wavelet des Bildes aufnehmen (es ist viel einfacher als es sich anhört, es ist nur eine Menge Mittelwertbildung und einige Quadratwurzeln, die zum Gewichten Ihrer Koeffizienten verwendet werden) und nur das k größte beibehalten gewichtete Koeffizienten im Wavelet als spärlicher Vektor, normalisieren Sie ihn und speichern Sie ihn, um seine Größe zu verringern. Sie sollten RG und B mindestens vorher mit Wahrnehmungsgewichten neu skalieren, oder ich würde empfehlen, zu YIQ (oder YCoCg, um Quantisierungsrauschen zu vermeiden) zu wechseln, damit Sie Chrominanzinformationen mit reduzierter Wichtigkeit abtasten können.
Sie können jetzt das Punktprodukt von zwei dieser spärlich normalisierten Vektoren als Maß für die Ähnlichkeit verwenden. Die Bildpaare mit den größten Punktprodukten werden in ihrer Struktur sehr ähnlich sein. Dies hat den Vorteil, dass es leicht widerstandsfähig gegen Größenänderung, Farbtonverschiebung und Wasserzeichen ist und sehr einfach zu implementieren und zu kompaktieren ist.
Sie können Speicher und Genauigkeit gegeneinander abwägen, indem Sie k erhöhen oder verringern.
Das Sortieren nach einer einzelnen numerischen Bewertung ist für diese Art von Klassifizierungsproblem nicht möglich. Wenn Sie darüber nachdenken, müssten Bilder nur entlang einer Achse "geändert" werden, aber nicht. Aus diesem Grund benötigen Sie einen Merkmalsvektor. Im Haar-Wavelet-Fall treten ungefähr dort die schärfsten Diskontinuitäten im Bild auf. Sie können einen Abstand zwischen Bildern paarweise berechnen. Da Sie jedoch nur eine Abstandsmetrik haben, kann eine lineare Reihenfolge kein Dreieck aus 3 Bildern ausdrücken, die alle gleich weit entfernt sind. (Denken Sie also an ein Bild, das ganz grün ist, ein Bild, das ganz rot ist und ein Bild, das ganz blau ist.)
Das bedeutet, dass jede echte Lösung für Ihr Problem O (n ^ 2) -Operationen in der Anzahl der Bilder benötigt, die Sie haben. Wenn es möglich gewesen wäre, das Maß zu linearisieren, könnten Sie nur O (n log n) oder O (n) benötigen, wenn das Maß beispielsweise für eine Radix-Sortierung geeignet wäre. Das heißt, Sie müssen kein O (n ^ 2) ausgeben, da Sie in der Praxis nicht den gesamten Satz durchsehen müssen, sondern nur das Zeug finden müssen, das näher als eine Schwelle liegt. Wenn Sie also eine von mehreren Techniken anwenden, um Ihren spärlichen Vektorraum zu partitionieren, können Sie viel schnellere Asymptotiken für das Problem "Finden von Bildern, die einem bestimmten Schwellenwert ähnlicher sind" erhalten, als jedes Bild naiv mit jedem Bild zu vergleichen und Ihnen was zu geben Sie brauchen wahrscheinlich ... wenn nicht genau das, wonach Sie gefragt haben.
Auf jeden Fall habe ich dies vor einigen Jahren persönlich genutzt, um die Anzahl der verschiedenen Texturen, die ich gespeichert habe, zu minimieren, aber es gab auch viel Forschungsrauschen in diesem Bereich, das seine Wirksamkeit zeigt (und in diesem Fall vergleicht) es zu einer komplexeren Form der Histogrammklassifizierung):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Wenn Sie eine bessere Erkennungsgenauigkeit benötigen, können die Algorithmen minHash und tf-idf mit dem Haar-Wavelet (oder dem Histogramm) verwendet werden, um Änderungen robuster zu verarbeiten:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Schließlich hat Stanford eine Bildsuche, die auf einer exotischeren Variante dieses Ansatzes basiert und auf einer stärkeren Merkmalsextraktion aus den Wavelets basiert, um gedrehte oder skalierte Bildabschnitte usw. zu finden. Dies geht jedoch wahrscheinlich weit über den Arbeitsaufwand hinaus würde tun wollen.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi