the-FoX: Farbumgebung generieren

Hallo Selfianer/-innen,

ich möchte um eine gegebene Farbe herum, zum Beispiel #e00000, einen Radius bilden und hellere, sowie dunklere und ähnliche Farben mit berücksichtigen.
Ich habe schon in diversen Suchmaschinen nach Ansätzen gesucht, aber nichts gefunden, was mir weiterhilft. Gibt es einen Algorythmus, um "benachbarte" Farbwerte zu generieren?
Oder habt ihr eine Idee, wie man da am besten vorgeht?

Im Endeffekt soll es möglich sein, eine Farbsuche in einer DB durchzuführen und dabei sich nicht nur auf exakt einen Farbwert zu beschränken, sondern mit einer gewissen Toleranz. Als Betrachter empfindet man ja benachbarte Farben ebenfalls als dazugehörig.

Gruß,
the-FoX

  1. Hi,

    ich möchte um eine gegebene Farbe herum, zum Beispiel #e00000, einen Radius bilden und hellere, sowie dunklere und ähnliche Farben mit berücksichtigen.

    RGB als Farbmodell eignet sich dazu nicht besonders.
    HSV/HSL sind für solche Zwecke besser.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hallo,

    ich möchte um eine gegebene Farbe herum, zum Beispiel #e00000, einen Radius bilden und hellere, sowie dunklere und ähnliche Farben mit berücksichtigen.

    das hört sich doch "auf den ersten Blick" einfach an. Letztendlich brauchst du also einen Algorithmus (mit 'i'!), der dir bei zwei gegebenen Farben einen Differenz- oder Ähnlichkeitswert liefert. Das hat im Prinzip nichts mit der Programmiersprache zu tun; ich habe deshalb mal den Themenbereich geändert.

    Ich habe schon in diversen Suchmaschinen nach Ansätzen gesucht, aber nichts gefunden, was mir weiterhilft. Gibt es einen Algorythmus, um "benachbarte" Farbwerte zu generieren?

    Willst du Farbwerte generieren, oder vorgegebene Farben beurteilen?

    Im Endeffekt soll es möglich sein, eine Farbsuche in einer DB durchzuführen und dabei sich nicht nur auf exakt einen Farbwert zu beschränken, sondern mit einer gewissen Toleranz. Als Betrachter empfindet man ja benachbarte Farben ebenfalls als dazugehörig.

    Ja. Und du hast keine Idee, wie man das angehen könnte?

    Man kann natürlich fürs erste mal im RGB-Farbraum bleiben und festlegen, dass zwei Farben als "ähnlich" gelten, wenn ihre RGB-Komponenten jeweils um nicht mehr als x voneinaner abweichen. Je nachdem wie groß x gewählt wird, machst du den Ergebnisbereich größer oder kleiner.
    Ich könnte mir aber vorstellen, dass man die visuelle Ähnlichkeit von Farben im HSL-Modell besser beurteilen kann.

    In beiden Fällen hast du aber drei Farbkomponenten, bei denen du paarweise die Differenz bilden und diese drei Differenzen dann betragsmäßig aufsummieren musst. Um dem menschlichen Sehen besser gerecht zu werden, könntest du noch Gewichtungsfaktoren einführen; so kann das Auge Grün-Nuancen besser unterscheiden als z.B. Rot (im RGB-Farbraum), und Farbtonunterschiede besser als etwa Sättigungsunterschiede (im HSL-Farbraum).

    So long,
     Martin

    --
    "Life! Don't talk to me about life!"
      (Marvin, the paranoid android in Douglas Adams' "The Hitchhiker's Guide To The Galaxy")
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo Martin,

      Danke für die Infos. Das Stichwort HSL hat mir schon mal weitergeholfen.

      Gruß,
      the-FoX

    2. Tach auch.

      In beiden Fällen hast du aber drei Farbkomponenten, bei denen du paarweise die Differenz bilden und diese drei Differenzen dann betragsmäßig aufsummieren musst.

      Fasst man den RGB Farbraum als Teilmenge des R^3 auf (jede Farbe ist also ein Vektor (r,g,b) mit r,g,b aus [0,255], ggf. noch geschnitten N), so kann man noch einige andere Metriken definieren als die Manhattan- bzw. Mannheim-Distanz, welche du beschreibst.

      Berühmte weitere Vertreter sind die durch die supremums-Norm induzierte Metrik
      d(x_1, x_2) = max { |r_1 - r_2|, |g_1 - g_2|, |b_1 - b_2| }

      die euklidische Distanz
      d(x_1, x_2) = sqrt(|r_1 - r_2|^2 + |g_1 - g_2|^2 + |b_1 - b_2|^2).

      Man kann also sicherlich noch ein wenig bei den Metriken tauschen, wenn einem die Nähe nicht gefällt.

      Zum Thema kann ich aber nix sagen :)

      Bis die Tage,
      Matti

      1. Hallo,

        Fasst man den RGB Farbraum als Teilmenge des R^3 auf (jede Farbe ist also ein Vektor (r,g,b) mit r,g,b aus [0,255], ggf. noch geschnitten N), so kann man noch einige andere Metriken definieren als die Manhattan- bzw. Mannheim-Distanz, welche du beschreibst.

        Berühmte weitere Vertreter sind die durch die supremums-Norm induzierte Metrik
        d(x_1, x_2) = max { |r_1 - r_2|, |g_1 - g_2|, |b_1 - b_2| }

        die euklidische Distanz
        d(x_1, x_2) = sqrt(|r_1 - r_2|^2 + |g_1 - g_2|^2 + |b_1 - b_2|^2).

        Man kann also sicherlich noch ein wenig bei den Metriken tauschen, wenn einem die Nähe nicht gefällt.

        das mag ja vielleicht alles richtig sein, was du da erzählst, aber ich verstehe kein Wort ...

        Zum Thema kann ich aber nix sagen :)

        Na immerhin. ;-)

        Ciao,
         Martin

        --
        Man gewöhnt sich an allem, sogar am Dativ.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Tach auch.

          Fasst man den RGB Farbraum als Teilmenge des R^3 auf (jede Farbe ist also ein Vektor (r,g,b) mit r,g,b aus [0,255], ggf. noch geschnitten N), so kann man noch einige andere Metriken definieren als die Manhattan- bzw. Mannheim-Distanz, welche du beschreibst.

          das mag ja vielleicht alles richtig sein, was du da erzählst, aber ich verstehe kein Wort ...

          Du schreibst, dass für die Differenz zweier Farben die Beträge der Differenzen der einzelnen Farbwerte (R, G, B) zu addieren seien. Dies ist eine bestimmte Metrik (eine metrik ist so etwas wie eine "Abstandsfunktion". Und wie vieles andere auch haben Mathematiker diese generalisiert.

          Ich habe oben zwei weitere solche Metriken gezeigt, welche eben gleiche Eigenschaften aufweisen, aber bei denen die einzelnen Abstände anders aussehen.

          Nimm als Beispiel mal einen Kreis. Ein Kreis ist die Menge aller Punkte, welche gleichweit von einem Punkt (dem Mittelpunkt) entfernt sind. Wechselst du die Metrik, sehen Kreis halt unterschiedlich aus.

          Mit der euklidischen Metrik ist er rund, mit der Mannheim-Distanz (Summe der Beträge) ist ein Kreis ungefähr eine Raute, und mit der Supremums-Distanz ist ein Kreis ein Quadrat.

          Bis die Tage,
          Matti