Frage

Ursprüngliche Frage

Wenn Sie bei N maximal entfernten Farben (und einigen damit verbundenen Entfernung Metrisch), können Sie kommen mit einem Weg, um zu Sortieren die Farben in einer bestimmten Reihenfolge, so dass die erste M sind auch Recht nah an einer maximal individuellen Satz?

In anderen Worten, eine Reihe von verschiedenen Farben, kommen mit einer Bestellung, so dass ich verwenden können als viele Farben, wie ich muss am Anfang beginnen und davon ausgehen, dass Sie sind alle Verschieden und in der Nähe, die Farben sind auch sehr ausgeprägt (z.B., bläulich-rot ist nicht neben rötlich-blau).

Randomisierung ist OK, aber sicherlich nicht optimal.

Klarstellung:Einige große und visuell unterschiedliche Farben (sagen, 256 oder 1024), ich wollen, um Sie zu Sortieren, so dass, wenn ich den ersten, sagen wir, 16 von Ihnen, dass ich eine relativ deutlich sichtbar Teilmenge der Farben.Das entspricht, grob gesagt, zu sagen: ich wollen zu Sortieren, diese Liste von 1024 so, dass je näher die einzelnen Farben sind optisch weiter auseinander, Sie stehen auf der Liste.

Keine korrekte Lösung

Andere Tipps

Auch dies klingt für mich wie eine Art - Widerstand-Diagramm wo Sie versuchen eine Karte der Weg des geringsten Widerstandes.Wenn Sie invertieren Sie die Anforderungen, Pfad der maximale Widerstand, es könnte verwendet werden zu produzieren eine Reihe, die von Anfang an produziert maximale Differenz, wie Sie gehen, und gegen Ende beginnt zu gehen zurück auf Werte näher zu den anderen.

Zum Beispiel, hier ist ein Weg, um vielleicht das tun, was Sie wollen.

  1. Berechnen Sie die Entfernung (ref Ihre anderen post jede Farbe, um alle anderen Farben
  2. Die Summe der Abstände für jede Farbe, so erhält man eine Indikation für die wie weit diese Farbe wird von allen anderen Farben, die im gesamten
  3. Um die Liste nach Entfernung, going down

Diese würde, so scheint es, eine Liste, die beginnt mit die Farbe, die am weitesten Weg von allen anderen Farben, und dann nach unten gehen, werden die Farben in Richtung Ende der Liste wäre näher zu anderen Farben im Allgemeinen.

Edit:Lesen Sie Ihre Antworten auf meinen ersten post über die räumliche Gliederung, würde nicht genau die obige Beschreibung, da die Farben in der Nähe von anderen Farben fallen auf den unteren Rand der Liste, aber lassen Sie uns sagen, Sie haben einen cluster aus Farben irgendwo, zumindest eine der Farben aus, die cluster in der Nähe des Anfang der Liste, und es würde derjenige sein, der in der Regel war am weitesten Weg von allen anderen Farben, die im gesamten.Wenn das Sinn macht.

Dieses problem nennt sich color quantization, und hat viele bekannte algorithmen: http://en.wikipedia.org/wiki/Color_quantization Ich kenne Leute, die implementiert die octree-Ansatz für eine gute Wirkung.

Es scheint Wahrnehmung ist wichtig für Sie, in diesem Fall möchten Sie vielleicht zu prüfen, arbeiten mit einem Wahrnehmungs-Farbraum wie YUV, YCbCr oder Lab.Jedes mal, wenn ich verwendet habe, diejenigen, die Sie mir gegeben haben, viel bessere Ergebnisse als sRGB allein.

Die Konvertierung zu und von sRGB kann ein Schmerz sein, aber in Ihrem Fall könnte es tatsächlich der Algorithmus einfacher und als bonus wird es meist für Farbenblinde auch!

N maximal entfernten Farben kann als eine Reihe von gut-verteilter Punkte in einem 3-dimensional (Farbe) - Raum.Wenn Sie Sie erstellen können aus einer Halton-Sequenz, dann ist jede Präfix (die ersten M Farben) besteht ebenfalls aus gut verteilt Punkte.

Wenn ich das Verständnis der Frage richtig, Sie wollen zu erhalten die Teilmenge der M Farben mit der höchste mittlere Entfernung zwischen Farben, angesichts einiger Entfernung Funktion d.

Anders gesagt, angesichts der anfänglichen N Farben, die als einen großen, ungerichteter graph, in dem alle Farben sind miteinander verbunden, wollen Sie die längste Pfad Besuche alle M Knoten.

Lösung des NP-complete graph Probleme ist weit über mich, so fürchte ich, aber Sie könnten versuchen, eine einfache physikalische simulation:

  1. Generieren M zufällige Punkte im Farbraum
  2. Berechnen Sie den Abstand zwischen jedem Punkt
  3. Berechnen Abstoßung Vektoren für jeden Punkt, bewegen Sie es Weg von der alle anderen Punkte (mit 1 / (Entfernung ^ 2) wie die Größe der Vektor -)
  4. Summe der Abstoßung Vektoren für jeden Punkt
  5. Aktualisieren Sie die position des Punktes nach dem summiert Abstoßung Vektoren
  6. Beschränken out of bound Koordinaten (wie Leuchtkraft gehen negative oder höher ein)
  7. Wiederholen Sie ab Schritt 2, bis die Punkte stabilisieren
  8. Für jeden Punkt, wählen Sie die nächste Farbe aus dem ursprünglichen Satz von N

Es ist wenig effizient, aber für kleine M kann es effizient genug ist, und es gibt nahezu optimale Ergebnisse.

Wenn Ihr farbabstand Funktion ist einfach, es kann ein deterministischer Weise der Erzeugung der optimalen Teilmenge.

  1. Beginnen Sie mit zwei Listen.CandidateColors, die zunächst mit Ihren verschiedenen Farben und SortedColors, die zunächst noch leer ist.
  2. Wählen Sie irgendeine Farbe, und entfernen Sie es aus CandidateColors und legen Sie es in SortedColors.Dies ist die erste Farbe und die häufigste, so ist es ein guter Ort, um eine Farbe auswählen, die jives auch mit Ihrer Anwendung.
  3. Für jede Farbe in CandidateColors die Berechnung der Gesamt-Distanz.Die gesamte Strecke ist die Summe der Entfernung von der CandidateColor an jede der Farben in SortedColors.
  4. Entfernen Sie die Farbe mit der größten Gesamt-Distanz von CandidateColors und fügen Sie es am Ende SortedColors.
  5. Wenn CandidateColors nicht leer ist, gehen Sie zurück zu Schritt 3.

Dieser greedy-Algorithmus sollte Ihnen gute Ergebnisse.

Sie konnte nur Sortieren der Kandidat Farben basierend auf die maximale Distanz von der Mindest-Abstand zu jedem der index-Farben.

Mit euklidischer farbabstand:

public double colordistance(Color color0, Color color1) {
    int c0 = color0.getRGB();
    int c1 = color1.getRGB();
    return distance(((c0>>16)&0xFF), ((c0>>8)&0xFF), (c0&0xFF), ((c1>>16)&0xFF), ((c1>>8)&0xFF), (c1&0xFF));
}

public double distance(int r1, int g1, int b1, int r2, int g2, int b2) {
    int dr = (r1 - r2);
    int dg = (g1 - g2);
    int db = (b1 - b2);
    return Math.sqrt(dr * dr + dg * dg + db * db);
}

Aber können Sie ersetzen Sie es mit alles, was Sie wollen.Es muss nur eine Farbe Distanz routine.

public void colordistancesort(Color[] candidateColors, Color[] indexColors) {
    double current;

    double distance[] = new double[candidateColors.length];
    for (int j = 0; j < candidateColors.length; j++) {
        distance[j] = -1;
        for (int k = 0; k < indexColors.length; k++) {
            current = colordistance(indexColors[k], candidateColors[j]);
            if ((distance[j] == -1) || (current < distance[j])) {
                distance[j] = current;
            }
        }
    }

    //just sorts.
    for (int j = 0; j < candidateColors.length; j++) {
        for (int k = j + 1; k < candidateColors.length; k++) {
            if (distance[j] > distance[k]) {
                double d = distance[k];
                distance[k] = distance[j];
                distance[j] = d;

                Color m = candidateColors[k];
                candidateColors[k] = candidateColors[j];
                candidateColors[j] = m;
            }
        }
    }
}

Meinst du, dass aus einer Menge von N Farben, die Sie benötigen, um pick M Farben, in denen die M < N, so dass gilt: M ist die beste Darstellung der N Farben in der M Raum?

Als besseres Beispiel, reduzieren Sie eine true-color (24-bit-Farbraum) einer 8-bit-mapped-Farbraum GIF (?).

Es gibt Quantisierung algorithmen für diese, wie die Adaptive Räumliche Unterteilung Algorithmus von ImageMagic.

Diese algorithmen in der Regel nicht nur Holen bestehenden Farben aus der Quelle Raum, sondern schafft neue Farben im Ziel-Raum, die am ehesten ähneln die Quelle Farben.Als ein Vereinfachtes Beispiel, wenn Sie 3 Farben in die original Bild, wo zwei sind rot (mit unterschiedlicher Intensität oder bläuliche Farbtöne etc.) und der Dritte ist blau, und reduzieren müssen, um zwei Farben, die Ziel-Bild könnte haben eine rote Farbe, die ist eine Art Durchschnitt der original-zwei rote + die Blaue Farbe von der ursprünglichen Bild.

Wenn Sie etwas anderes brauchen, dann habe ich nicht verstehe deine Frage :)

Sie können split Sie in RGB-HEX-format, so dass Sie vergleichen können, die R mit R R ist von einer anderen Farbe, das gleiche mit der G und B.

Gleiche format wie HTML

XX XX XX
RR GG BB

00 00 00 = black
ff ff ff = white
ff 00 00 = red
00 ff 00 = green
00 00 ff = blue

Also das einzige, was Sie brauchen, um zu entscheiden, wie nahe Sie möchten, dass die Farben und was ist eine akzeptable Unterschied für die Segmente werden als unterschiedlich betrachtet.

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