Seite 1 von 3

Farbähnlichkeit zweier RGB-Werte ermitteln

Verfasst: 20.09.2008 20:51
von Thorium
Kennt jemand einen Weg die Farbähnlichkeit zwischen 2 RGB-Werten zu ermitteln? Am besten wäre es, wenn die Farbähnlichkeit als Zahl ermittelt wird, desdo höher die Zahl, desdo unähnlicher sind sich die Farben, bei Null liegen 2 exakt gleiche Farben vor.

Ich brauche das, da ich eine automatische Konvertierung von Bildern auf eine fixe Farbpalette in einem meiner Programme benötige.

Mein Ansatz war jetzt erstmal die Differenz der einzelnen Kanäle zueinander zu ermitteln und die Differenzen der 3 Kanäle (RGB) dann zusammenzurechnen. Desdo höher der Wert desdo unähnlicher sind sich die Farben. Ist im Prinzip auch nicht falsch aber suboptimal. Es geht dabei ja um den optischen Eindruck.

Kleines Beispiel wo es hakt: Ich habe einen Pixelfarbwert von 50,60,40 vorliegen. Nun ist es so das mehrere Farbwerte die gleiche Farbähnlichkeit haben. z.B. 40,50,30 hätte Farbähnlichkeit 30 und 80,60,40 ebenfalls 30. Aber ersterer Wert würde im Bild besser aussehen, da es die gleiche Farbe fürs Betrachterauge ist, nur etwas dunkler. Wobei die andere Farbe mehr ins Rot geht.

Hoffe ihr versteht was ich meine, wenn nicht einfach nochmal nachfragen. Ich brauch nicht unbedingt einen fertigen Code, nur einen Lösungsweg der halbwegs elegant ist.

Verfasst: 20.09.2008 20:58
von gnasen
du könntest die quadratische Abweichung berechnen. Wenn ein einzelner Wert stärker abweicht, fällt dieser damit auch stärker ins Gewicht.

50,60,40
40,50,30 -> -10-10-10 -> 30
80,60,40 -> +30+0+0 -> 30

50,60,40
40,50,30 -> -10²-10²-10² -> 300
80,60,40 -> +30²+0+0 -> 900

Differenz beim zweiten ist größer.

Verfasst: 20.09.2008 21:17
von Thorium
gnasen hat geschrieben:du könntest die quadratische Abweichung berechnen. Wenn ein einzelner Wert stärker abweicht, fällt dieser damit auch stärker ins Gewicht.

50,60,40
40,50,30 -> -10²-10²-10² -> 300
80,60,40 -> +30²+0+0 -> 900

Differenz beim zweiten ist größer.
Sehr gute Idee, das werde ich gleich mal umsetzen. :allright:

Verfasst: 20.09.2008 21:20
von NicTheQuick
Du könntest auch alle RGB-Farben zuerst in das HSV-Farbmodell umrechnen
und diese dann vergleichen. Da kann man dann besser entscheiden, ob man
Farbton, Sättigung oder Hellwert stärker ins Gewicht fallen lässt.

Verfasst: 20.09.2008 22:36
von Thorium
NicTheQuick hat geschrieben:Du könntest auch alle RGB-Farben zuerst in das HSV-Farbmodell umrechnen
und diese dann vergleichen. Da kann man dann besser entscheiden, ob man
Farbton, Sättigung oder Hellwert stärker ins Gewicht fallen lässt.
Hm, ja werde ich wohl nicht drumm rumm kommen. Das Ergebnis ist zwar mit gnasens Idee schon merkbar besser. Aber es gibt noch ein paar unschöne Effekte. Bei einem Bild z.b. wird ein Braun durch ein Blau ersetzt. Das macht zwar tatsächlich Sinn von den Zahlen her, sieht aber natürlich Mist aus. Da gibts passendere Töne in der Palette. Muss mich wohl noch eingehender mit dem Thema beschäftigen.

Die Schwierigkeit ist, das die Palette nur 32 Farben hat. :mrgreen: Also viel mit Variationen ist da nicht und deshalb liegt der Algo auch manchmal so blöd daneben.

Verfasst: 20.09.2008 23:03
von Batze
Hast du 32 Feste Farben?
Dann wäre es ja vielleicht zu überlegen per Hand die passenden Bereiche anzugeben.

Verfasst: 20.09.2008 23:28
von STARGÅTE
da die RGB-Farben ja einen Raum darstellen (Würfel 255*255*255) würde ich auch den Farbunterschied als (normierten) Abstand in diesem Farbwüfel nehmen, also:

Code: Alles auswählen

Procedure.f DistanceRGB(Color1, Color2)
 ProcedureReturn Sqr( Pow(Red(Color1)-Red(Color2),2) + Pow(Green(Color1)-Green(Color2),2) + Pow(Blue(Color1)-Blue(Color2),2) ) / Sqr(255*255*3)
EndProcedure

; Komplementärfarben
Debug DistanceRGB($000000, $FFFFFF) ; schwarz - weiß (~1.00)
Debug DistanceRGB($00FF00, $FF00FF) ; grün - violett (~1.00)

; Farbarten
Debug DistanceRGB($FF0000, $00FF00) ; blau - grün    (~0.82)

; Kontranstunterschied
Debug DistanceRGB($FF0000, $808080) ; blau - grün    (~0.50)

; Helligkeitsunterschied
Debug DistanceRGB($FF0000, $800000) ; blau - grün    (~0.29)
die größte Differenz (1.00) tritt bei Komplementärfarben auf, wobei hingegen Helligkeiten relativ geringe unterschieden haben ...

Verfasst: 20.09.2008 23:37
von Thorium
Batze hat geschrieben:Hast du 32 Feste Farben?
Dann wäre es ja vielleicht zu überlegen per Hand die passenden Bereiche anzugeben.
Ja, die Farben sind fest. Es geht dabei um den Import von Charakterportrais in ein altes DOS-Spiel.

Gleich mal Stargates Variante ausprobieren. :D

Verfasst: 20.09.2008 23:42
von Kaeru Gaman
also die 16 grundfarben plus 16 grautöne?

... da würde ich vielleicht noch eher konkret spezialisieren anstatt groß zu vergleichen.
du hast da ja im grunde nur die sechs spektralfarben in zwei helligkeiten, und der rest sind grautöne, oder?

wenn deine Pics mehr als 32² groß sind, solltest du wohl auch eher dithern...

gibts für genau so nen zweck - import von bildern auf die alten 32 farben -
nicht vielleicht irgendwelche werkzeuge auf DOS-freaks seiten oder so?

Verfasst: 20.09.2008 23:51
von Thorium
Stargate: Du bist mein Held! :allright:
Mit deiner Methode sieht das Bild super aus! Ich würde sogar sagen absolut optimal! Vielen vielen Dank dafür, das hat mir jetzt ordentlich Zeit gespart. Ich mach grad mal noch ein paar Screenshots, das ihr seht worum es geht.