Sie könnten n
random projections verwenden, um den pHash-Raum in 2^n
Buckets aufzuteilen, dann werden ähnliche Bilder höchstwahrscheinlich aus demselben Bucket gefunden. Sie könnten sogar den Hash mit allen 64 möglichen Ganzzahlen mit Hamming-Gewicht 1 XOR, um benachbarte Eimer bequem zu überprüfen und sicher sein, dass Sie alle ungefähren Übereinstimmungen finden würden.
Dies ist nur effizient, wenn Sie Bilder mit fast identischen Hashes (kleine Hamming-Distanz) interessieren. Wenn Sie größere Hamming-Distanzen tolerieren möchten (z. B. 8), wird es schwierig, alle Treffer effizient und genau zu finden. Ich habe eine sehr gute Leistung von scanning through die ganze Tabelle von GPU, sogar meine 3 Jahre alten Laptop GT 650M konnte 700 Millionen Hashes/Sekunde überprüfen!
Edit 1: Sie können denken, 64-Bit-Hash als eine einzige Ecke auf einem 64-dimensionalen Würfel, Mathematik ist einfacher, wenn Ihre normalisieren Ecke -1
und 1
(auf diese Weise ihr Zentrum im Ursprung ist) koordiniert. Sie können m
Bilder als Matrix M
der Größe m x 64
(eine Zeile/Bild, ein Bit Hash/Spalte) ausdrücken.
einfachste Weg, dies zu 2^n
verschiedenen Gruppen aufgeteilt ist n
64-dimensionale Vektoren v_0, v_1, ..., v_n
(pick jedes Vektorelement aus Normalverteilung N (0,1)) zu erzeugen, kann diese als eine Matrix ausgedrückt wird V
der Größe 64 x n
(eine Spalte/Vektor). Es könnte Orthogonalitätserzwingung geben, wie bei Random projection erwähnt, aber ich werde es hier überspringen.
Jetzt durch Berechnung A = (M * V) > 0
erhalten Sie m x n
Matrix (ein Bild/Zeile, eine Projektion/Spalte). Als nächstes wandeln Sie die Binärdarstellung jeder Zeile in eine Zahl um. Sie erhalten 2^n
verschiedene Möglichkeiten und ähnliche Hashes werden höchstwahrscheinlich am selben Bucket enden.
Dieser Algorithmus funktioniert für jede orthogonale Darstellung von Daten (z. B. SURF Features), nicht nur binäre Zeichenfolgen. Ich bin mir sicher, dass es einfachere (und effizientere) Algorithmen für binäre Hashes gibt, aber dies ist eine Möglichkeit, Zufallsprojektionen zu implementieren.
Ich schlug vor, XORring, denn wenn Bilder nicht identische Hashes haben, dann sind sie nicht garantiert in der gleichen Eimer landen.Indem Sie alle möglichen kleinen Abweichungen vom ursprünglichen Hash überprüfen, können Sie sehen, welche anderen Bins für mögliche Übereinstimmungen möglich sind.
In gewisser Weise ist dies ähnlich wie eine Computerspiel-Engine der 2D-Karte in ein Raster von Zellen der Größe x
, teilen könnte dann x
brauchen Sie nur von einem Punkt alle Einheiten innerhalb eines Radius zu finden 9-Zellen zu überprüfen (die eine enthält den Punkt + 8 umgebende Zellen), um eine 100% genaue Antwort zu erhalten.
Was meinen Sie mit "Split pHash Raum in 2^n Eimer"? Könnten Sie bitte ein Beispiel geben? – justHelloWorld
Darüber hinaus bedeutet ein Hamming-Gewicht von 1, dass von allen 64 Bits nur 1 von 0 verschieden ist. Warum sollte ich den Hash-Wert XOR überprüfen, um benachbarte Buckets zu überprüfen und sichergehen, dass ich alle ungefähren Übereinstimmungen finde? Könnten Sie bitte auch ein Beispiel für diesen Fall geben? – justHelloWorld
Könnten Sie bitte [diese] (http://stackoverflow.com/q/37802137/4480180) Frage betrachten? – justHelloWorld