Frage

Ich versuche, ein Dienstprogramm wie dieser http://labs.ideeinc.com/multicolr, aber ich weiß nicht, welchen Algorithmus die sie verwenden, Weiß jemand,?

War es hilfreich?

Lösung

Alles, was sie tun, ist passend Histogramme.

bauen So ein Histogramm für Ihre Bilder. Normalisieren der Histogramme durch die Größe des Bildes. Ein Histogramm ist ein Vektor mit so vielen Elementen wie Farben. Sie brauchen nicht 32,24, und vielleicht nicht einmal 16 Bit Genauigkeit und dies wird sich verlangsamen Sie gerade nach unten. Aus Performance-Gründen, würde ich die Histogramme auf 4, 8 und 10 bis 12 Bits abzubilden.

  • Starten Sie einen Fuzzy-least distance compare zwischen den allen 4-Bit-Histogrammen und Ihrer Probe Farben.
  • Dann nehmen Sie diesen Satz und tun das 8-Bit-Histogramm vergleichen.
  • Dann vielleicht geht bis zu einem 10 oder 12-Bit-Histogramm mit dem verbleibenden Satz vergleichen. Dies wird die höchste Leistung suchen, weil Sie die Gesamtmenge mit einer sehr geringen Anzahl von Berechnungen zu vergleichen, einen kleinen Teil zu finden.
  • Dann arbeiten Sie auf dem kleinen Teilmenge mit einer höheren Anzahl von Berechnungen, usw.

Der eigentliche große Trick ist, den besten Algorithmus für den Abgleich ähnliche Histogramme zu finden.

  • mit der Entfernungsberechnung starten. In 3 Dimensionen ich denke, es war:

    SQRT ((x1-x2) ^ 2 + (y1-y2) ^ 2 + (z1-z2) ^ 2)

Ich tue dies aus dem Gedächtnis, so schauen Sie sicher zu machen.

  • Für Ihre Zwecke, werden Sie mehr als 3 Dimensionen haben, so werden Sie mehr Begriffe haben. Ein 4-Bit-Histogramm würde 16 Begriffe hat, ein 8-Bit ein 256 Begriffe haben würde, usw. Denken Sie daran, dass diese Art von Mathematik langsam ist, also nicht tut eigentlich den SQRT Teil. Wenn Sie die Größe Ihrer Bilder klein genug, um zu normalisieren, sagen bis zu 10.000 Pixel, dann wissen Sie, nur Sie jemals x^2 für Werte zu tun haben 0..10,0000. eine Nachschlagtabelle von x^2 Pre-berechnen, wobei x von 0..10,000 geht. Dann wird Ihre Berechnungen schnell gehen.

  • Wenn Sie eine Farbe aus der Palette auswählen, stellt nur ein Histogramm mit dieser Farbe = 10,0000. Bei Auswahl von 2, machen ein Histogramm mit color1 = 5000, color2 = 5000 usw.

  • Am Ende müssen Sie in Fudge Faktoren hinzufügen, um die Anwendung der realen Welt zu machen passen, aber Sie werden diese mit dem Testen finden.

Andere Tipps

Ich würde vorschlagen, dass Sie in den Bildern in der Datenbank eine Art von Clustering der vorliegenden Farben tun. Ich meine, für jedes Bild in der Datenbank:

  • sammeln die Farben jedes Pixel im Bild
  • ausführen Clustering (wir k-Mittelwert-Clustering mit 5 Cluster sagen) auf den gesammelten Farben
  • Speichern der gruppierten Farben als repräsentative Beschreiber des Bildes

Wenn der Benutzer einen Satz von einer oder mehreren Abfrage Farben liefert Ihnen tun irgendeine Art von greedy Matching die beste Übereinstimmung zwischen den angegebenen Farben wählen und die Farbe Descriptor (die 5 reprsentative Farben) jedes Bild in Ihrer Datenbank.

Was ist die Größe der Bildersammlung, da je nach Größe einig Suchindizierung ein größeres Problem als die alogorith selbst sein kann?

Wahrscheinlich nur ein Histogramm der Farben zu schaffen, in den Bildern verwenden, dann zu den vom Benutzer gewählten Farben der beste Anpassung zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top