Farbähnlichkeit zweier RGB-Werte ermitteln
Farbähnlichkeit zweier RGB-Werte ermitteln
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.
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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

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.
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.
Sehr gute Idee, das werde ich gleich mal umsetzen.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.

Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
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.
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.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.
Die Schwierigkeit ist, das die Palette nur 32 Farben hat.

Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

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:
die größte Differenz (1.00) tritt bei Komplementärfarben auf, wobei hingegen Helligkeiten relativ geringe unterschieden haben ...
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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Ja, die Farben sind fest. Es geht dabei um den Import von Charakterportrais in ein altes DOS-Spiel.Batze hat geschrieben:Hast du 32 Feste Farben?
Dann wäre es ja vielleicht zu überlegen per Hand die passenden Bereiche anzugeben.
Gleich mal Stargates Variante ausprobieren.

Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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?
... 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Stargate: Du bist mein Held!
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.

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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
