Hello, Guest the thread was called932 times and contains 22 replays

last post from Retrofan at the

Die "ideale" Farbpalette

  • Aus "GoDot Infos (Programierkurs ...)" kopiert:


    Was mir hier wieder auffiel: Diese automatisch erzeugten Farbpaletten, wie die vom Plus4 oder auch Atari VCS, nutzen die Möglichkeiten der Farbanzahl überhaupt nicht aus. Zu viele Farben sind sich zu ähnlich (oder sogar gleich). Da wird viel Potential verschenkt. Bei der TED-Palette sind etwa doppelt so viele Farben (nahezu) identisch, wie der C64 überhaupt nur hat.


    Ich hatte schon mal vor Jahren angefangen, darüber nachzudenken, wie man eine "ideale" Farbpalette, z.B. für 32 oder 64 Farben, erzeugen könnte. Das war die Zeit, als ich eine virtuelle Retro-Plattform (ähnlich dem später entstandenen Pico-8) konzipieren wollte (hier aber keine Mitstreiter fand). Ich denke, der Weg zum Ziel führt über den LAB-Farbraum (über den ich beim CoCo-Projekt viel dazugelernt habe). Da dort die Farbabstände Wahrnehmungs-orientiert angelegt sind (im Gegensatz zum ansonsten ähnlichen XYZ-Farbraum), müsste man dort eigentlich mit einem geschickten Algorithmus z.B. 64 Farben finden, die sich maximal von einander unterscheiden, um eine möglichst große Ausbeute zu bekommen.


    Ich denke, ich mache irgendwann mal einen getrennten Thread zum Thema auf. (was hiermit geschehen ist)

  • Damit man hier nicht im komplett luftleeren Raum operiert:


    https://en.wikipedia.org/wiki/…omputer_hardware_palettes
    https://en.wikipedia.org/wiki/…deo_game_console_palettes


    Dort kann man erst einmal eine große Anzahl vorhandener Paletten anschauen und lesen, wie sie zustande kommen.


    Bei Paletten mit mehr als 16 Farben (meist handoptimiert) hat man das Problem, dass sich viele Farben ähneln (oder sogar identisch sind), während man nach anderen vergeblich sucht. Beispielsweise findet man in der VCS-PAL-Palette eine Menge doppelte Grautöne, dafür kein einziges brauchbares Gelb. Oder schon beim CPC mit seinen 27 Farben: Viele ähnliche Grüntöne, dafür vielleicht zu wenig Grau.


    Ich denke, die echten Doubletten könnte man sehr einfach vermeiden, bei ähnlichen Farben ist das aber schon schwerer, weil da natürlich unsere Wahrnehmung mit reinspielt.



    Ziel des Threads: Überlegungen anstellen, wie man bei einer sehr begrenzten Anzahl von Farben (z.B. 32 oder 64) eine Farbpalette findet, die optimal (vorwiegend für Spiele) nutzbar wäre. Kann man das algorithmisch lösen oder muss man doch per Hand/Auge (nach-)sortieren?


    Wofür? Erst einmal geht es nur um die Theorie. Aber vielleicht wären Ergebnisse für Retro-Games mit begrenzter Farbpalette auf PC, Konsole oder Mobile nutzbar.

  • Da hat niemand bei den VCS Farben gedacht: oh, soviele, das mache ich nicht von Hand.

    Das ist richtig. Es geht mir hier aber nicht um Kritik an vorhandenen, eh nicht mehr zu ändernden, Farbpaletten. Daher ist z.B. auch nicht unbedingt relevant, in welchem Farbraum sie z.B. angelegt waren oder wie sie generiert wurden. Es geht mir hier darum, NEUE Farbpaletten zu entwickeln, die optimalen Gebrauch einer begrenzen Anzahl von Farben machen. Die alten Paletten sollen nur dokumentieren, dass das Problem nicht trivial ist und man nicht einfach 16 Farben in 8 Helligkeiten abstufen kann – und fertig ist die "beste Palette der Welt". Wir wollen aus den alten Paletten etwas lernen und dafür müssen wir sie nicht unbedingt "rechtfertigen" (die Entstehung berücksichtigen).


    Viele der Paletten ändern z.B. innerhalb eines Farbstreifens nur die Helligkeit – weniger gesättigte Farben bekommt man also nur in heller oder dunkler – aber nicht bei mittlerer Helligkeit. Es gibt eine Menge Stellschrauben, and denen man drehen kann und es wäre sehr interessant, zu sehen, welche Paletten beim jeweiligen Verfahren ausgespuckt werden.


    Und da wir nicht an technischen Einschränkungen bzgl. der Generierung scheitern müssen, sondern mehr oder weniger frei über den sRGB-Farbraum verfügen können (solange unsere Displays den darstellen können), haben wir sehr viel bessere Möglichkeiten als früher – bei der Darstellung aber auch bei der Auswahl der Farben.


    Auch bei handoptimierten Paletten sind interessante Sachen zu beobachten. Wieviel Wert wurde z.B. darauf gelegt, bestimmte Oberflächen darzustellen? Gibt es einen Haut-Farbton, gibt es Brauntöne (z.B. für Baumstämme), usw.? Da zeigt sich teilweise, auf was bei der Entwicklung geachtet wurde. Über die Entstehung der C64-Farben gibt es ja z.B. Erzählungen, die müssen wir hier nicht unbedingt wiederholen. Bei 16 Farben wird gerne noch handoptimiert – aber will das auch jemand bei 32 (oder mehr) Farben machen? Wurde das gemacht?


    Ich experimentiere hier gerade als Modell mit einem Doppelkegel, der auf der mittleren Kreisebene die Grundfarben RGB und CMY liegen hat und zu den Spitzen hin schwarz und weiß wird. Zur Mitte hin nimmt die Sättigung ab, sodass ich dort eine Grau-Achse zwischen schwarz und weiß habe. Jetzt suche ich bestimmte Winkel und Abstände, um mit möglichst wenigen Farbtönen möglichst viel darstellen zu können. Ich weiß, das ist von LAB noch ganz gut entfernt – aber es ist ein Modell, das ich mir vor dem geistigen Auge gut vorstellen kann.


    Und was zudem spannend ist: wie erreicht man möglichst genau eine Farbanzahl, die ein Mehrfaches von 8 darstellt, weil das einfach am Besten für Computer zu verwalten ist. (Ja, ich weiß, man kann auch 3 Kanäle hoch 3 Intensitäten = 27 Farben, wie beim CPC, erzeugen – aber die meisten Farb-Anzahlen in Paletten sind halt durch 8 teilbar.)

  • Mein erster Gedanke:
    Den Lab-Würfel mit 32 Punkten füllen und die verschieben, bis die Quadratsummen ihrer Abstände maximal sind. Anschliessend skalieren, bis nichts mehr über sRGB hinausgeht. Falls es zum Verteilen keinen Algorithmus gibt (würde mich sehr wundern), dann halt was genetisches mit viel Zufall und viel probieren.


    Aber der zweite Gedanke war dann, dass größte Abstände nicht die einzig wahre Bedingung sein kann. Einen hübschen Grauverlauf wird man ganz sicher brauchen, und typischerweise wird man noch andere hübsche Verläufe einigermaßen einheitlicher Farbe haben wollen, und die Helligkeiten sollten sich dazu noch mit dem Grauverlauf ergänzen.


    Eventuell 2 Spiralen, die sich um die Grauachse von Schwarz nach Weiß winden, Helligkeit gleichmäßig ansteigend, dabei die 6 Farben durchlaufend, eine mit hoher, eine mit niedriger Sättigung?

  • Aber der zweite Gedanke war dann, dass größte Abstände nicht die einzig wahre Bedingung sein kann.

    Richtig. Zumindest nicht auf einer äußeren Hülle – das Volumen muss auch gefüllt sein, sonst hat man nur Extremwerte (woran meines Erachtens z.B. die CPC-Palette ein wenig leidet). Es stellt sich ohnehin die Frage, wie weit man in die Sättigung geht, denn wer braucht schon reines RGB-rot, -blau oder -grün? Die wirklich sinnvollen Farben werden irgendwo näher "am Kern" bzw. der Grau-Achse liegen.

  • Eventuell 2 Spiralen, die sich um die Grauachse von Schwarz nach Weiß winden, Helligkeit gleichmäßig ansteigend, dabei die 6 Farben durchlaufend, eine mit hoher, eine mit niedriger Sättigung?

    Auch nicht schlecht, wobei ich eher auf konzentrische Kreise (oder Sechsecke oder ähnliches) setzen würde, denn auf Spiralen. Da hat man dann eindeutige Stufen (man muss die Farben ja später auch irgendwie sortieren). Was ich auch anders machen würde, als bei den klassischen Tabellen à la Atari VCS, ist, zum Dunklen und Hellen hin weniger Farben zu nehmen, weil die Unterscheidung kurz vor schwarz und weiß dem Auge schwer fällt. Wenn man bei maximaler Sättigung auf meinetwegen 16 Farbtöne setzt, dann reichen an den Enden auch 6 oder 8.

  • müsste so eine Palette eher gedeckte Farben enthalten

    Ja, das ist grundsätzlich auch meine Vorstellung. Wobei es auch nicht zu gedeckt sein darf, denn in Games will man schon etwas mehr "Bums" in den Farben haben. Aber reine Primärfarben, wie sie in vielen alten Paletten vorkommen, machen auch meines Erachtens eher wenig Sinn. Es ist halt spannend, zu sehen, ob man mittels Algorithmus zu einem brauchbaren Ergebnis bei z.B. 32 Farben kommen kann oder ob man vielleicht auch eine Kombination benötigt, also z.B. 24 generisch entstandenen Farben plus 8 manuelle, mit denen man Lücken (vielleicht bei Hauttönen) schließt.


    (was man auch im Hinterkopf behalten kann, ist, dass man notfalls Sättigung reduzieren kann, indem man Farben z.B. schachbrettmusterartig mischt – MEHR Sättigung kann man aber nicht ermischen)

  • Interessantes Thema!


    Zunächst mal sollte man sich, meine ich, über die Randbedingungen klar werden: möchte man bestimmte Farben (ist sicher oft ein Thema), möchte man mehrere Luminanzstufen einer Chromatizität, ...?


    Daraus ergeben sich bereits einige Einträge, teils von anderen abhängend.


    Dann könnte man versuchen den Raum (Lab, weil perzeptuell motiviert) gleichförmig abzutasten. Interessanter wäre aber vielleicht ein datengetriebener Ansatz: man nehme viele Bilder, berechne aus deren Pixelwerten (man beachte den Gamut des Displays) erst XYZ (geräteunabhängig), dann Lab (oder anderer perzeptueller Farbraum). Damit hat man eine große Menge Datenpunkte, die man per Clustering (z.B. k-means, weil es von vornherein die Anzahl der Cluster festlegt) die Farben. Es lassen sich auch einfach die vorab festgelegten Farben (fixe Zentroide) berücksichtigen.


    Das ist aber nur ein erster Schritt, zu einer besonders "schönen" Farbpalette. Man könnte auch noch Displaygröße, -gamut, -Gamma, Auflösung etc. bei der Darstellung berücksichtigen und wenn Dithering verwendet werden soll (wobei man bei Paletten ja ausgehen dann), dann käme man zur Kontrastsensitivitätsfunktion (separat für Luminanz und Chroma) auf die man optimieren könnte. Das hat aber glaube ich noch niemand gemacht...

  • Noch ein Gedanke:
    Es gibt ja dieses SmallbandwithTV, das Filme von Musik-Kasette abspielen kann.
    Deren Farben werden nciht aus 3, sondern nur aus 2 Kanälen zusammengesetzt, Helligkeit + Farbachse von Orange zu Blau. Grün liegt von der Farbe her weitab, das Fehlen fällt aber gar nicht so sehr auf.

  • Dann könnte man versuchen den Raum (Lab, weil perzeptuell motiviert) gleichförmig abzutasten

    "Gleichmäßig" würde aber evtl. bedeuten, dass es von weniger gesättigten Farben ähnlich viele gäbe, wie von stark gesättigten Farben, man dies aber weniger gut unterscheiden könnte (und damit unnötig wären).


    Interessanter wäre aber vielleicht ein datengetriebener Ansatz: man nehme viele Bilder, berechne aus deren Pixelwerten (man beachte den Gamut des Displays) erst XYZ (geräteunabhängig), dann Lab

    Das würde aber bedeuten, dass überproportional verwendete Farben stark bevorzugt würden. Die Frage ist halt, ob viel verwendeten Farben wirklich unbedingt stärker in einer Palette vertreten sein müssen?


    wenn Dithering verwendet werden soll (wobei man bei Paletten ja ausgehen dann)

    Das hängt natürlich von der Auflösung ab. Oberhalb bestimmter Auflösungen kann man Farben nicht mehr per Dithering mischen. Wir sollten mögliche Mischfarben durch Rasterung vielleicht erstmal außen vor lassen. Darüber könnte man sich auch Grautöne sparen, weil man sie per Mischung aus Komplementärfarben erzeugen könnte. Bei Retro-Games könnte aber absichtlich eine Auflösung verwendet werden, die Farbmischung durch Dithering schwierig macht.


    Das hat aber glaube ich noch niemand gemacht...

    Ich glaube, dass wir uns hier insgesamt in einem Neuland bewegen. Natürlich je nachdem, welche Verfahren wir einsetzen.


    Es gibt ja dieses SmallbandwithTV, das Filme von Musik-Kasette abspielen kann. Deren Farben werden nciht aus 3, sondern nur aus 2 Kanälen zusammengesetzt

    OK – aber wie hilft uns das bei der Ermittlung besonders guter Farbpaletten?

  • Das würde aber bedeuten, dass überproportional verwendete Farben stark bevorzugt würden. Die Frage ist halt, ob viel verwendeten Farben wirklich unbedingt stärker in einer Palette vertreten sein müssen?

    Wenn wir uns vorstellen, man nehme als Input TrueColor-Bilder, dann würden in Bereichen des Farbraums die stärker belegt sind am Ende mehr Cluster liegen und solche Schattierungen besser aufgelöst werden (natürlich immer beeinflusst durch die wahrgenommene Farbdistanz aufgrund von Lab).


    Ich denke das macht Sinn, die schwierigere Frage ist die noch den Eingabedaten -- da kommt Bias her!



    Oberhalb bestimmter Auflösungen kann man Farben nicht mehr per Dithering mischen.

    Du meinst bei zu niedrigen Auflösungen funktioniert Dithering nicht mehr (siehe auf Kontrastsensitivität, CSF). Bei hohen Auflösungen funktioniert Dithering super, weil das Auge die einzelnen Farben nicht mehr auflöst.


    Nur zur Sicherheit: mit Mischen meinst Du Dithering oder temporales Mischen?



    An wie viele Farben in der Palette hast Du denn eigentlich gedacht? Wenn die Zahl zu gering ist, wird es viele (nahezu) gleich gute Paletten geben, die total unterschiedlich aussehen werden. Eine genügend große Zahl (hunderte? tausende?) wird man vermutlich brauchen.

  • OK – aber wie hilft uns das bei der Ermittlung besonders guter Farbpaletten?

    EIn Teil der Frage ist ja auch, ob bestimmte Farben besonders "nützlich" sind, und für den radikalen Fall eines 2D-Farbraums hat sich da schon jemand Gedanken gemacht. blau/türkis für schöne Himmel, Orange für schöne Haut.

  • Grade bei kleineren Paletten muss man doch sowieso manuell ran. Wäre es dann nicht einfach, Grafiker der jeweiligen Quellsysteme zu fragen, welche Farben sie immer vermisst haben, bzw. welche sie gut fanden.
    Dann die guten zusammenpacken und evtl. ausmisten, fettich die Laube.


    Die Speccies vermissen ja immer lautstark Brauntöne, beim C64 könnte z.Bsp. das existierende Rot vielleicht gegen zwei Rot-Varianten gewechselt werden.

  • Wenn wir uns vorstellen, man nehme als Input TrueColor-Bilder

    Ich weiß nicht, ob es das Problem wirklich löst. Denn Farben, die quantitativ viel vorkommen, benötigen nicht zwingend eine hohe Repräsentation in der Palette. Für ein Videospiel reicht ein Hellblau, selbst wenn du viele Fotos mit Himmel in deiner Database hast. Manche Farben werden sich in Bildern hingegen nur selten finden, wie z.B. ein Reinweiß – aber gerade das würde beim Pixeln sehr fehlen. Ich denke, man kann den Ansatz trotzdem ausprobieren – nur ich persönlich hege wenig Hoffnungen auf eine besonders sinnvolle Palette. Aber wie gesagt: einfach ausprobieren und gucken, was passiert. Das ist ja das spannende hier – wir sind völlig frei im Lösungs-Ansatz, einzig das Ergebnis zählt. Wenn jemand mit Zufallszahlen eine tolle Palette hinbekommt: Klasse!


    Bei hohen Auflösungen funktioniert Dithering super, weil das Auge die einzelnen Farben nicht mehr auflöst.

    Richtig, nichts anderes habe ich gesagt. Aber bezogen auf ein mögliches Retro-System kann man davon ausgehen, dass die Auflösung zu gering sein könnte.


    mit Mischen meinst Du Dithering

    Ja.


    An wie viele Farben in der Palette hast Du denn eigentlich gedacht?

    Steht oben. Z.B. 32 oder 64 Farben. Meinetwegen auch 16 oder 128. Aber bei mehr wird es egal, wieviele Plätze man in der Palette unachtsam verschenkt.


    Grade bei kleineren Paletten muss man doch sowieso manuell ran.

    Je kleiner, desto eher. Ich würde mich sehr wundern, wenn jemand eine gute, rein berechnete, 16-Farben-Palette zeigen könnte. Aber: ich lasse mich gerne überraschen! ;)


    Wäre es dann nicht einfach, Grafiker der jeweiligen Quellsysteme zu fragen, welche Farben sie immer vermisst haben, bzw. welche sie gut fanden.

    Das wäre auch ein Ansatz. Für den C64 könnte ich gleich was beisteuern: Mir persönlich fehlt oft ein Dunkelgrün. Das Rot könnte kräftiger sein, das Orange heller und kräftiger, das Gelb reiner, die Grautöne weiter auseinander. Ansonsten ist die Palette für nur 16 Farben schon ganz gut gewählt. Beim CPC fehlen gedeckte Farben und vor allem Grautöne, beim Specci eine ganze Menge.


    Dann die guten zusammenpacken und evtl. ausmisten, fettich die Laube.

    Es wird aber nicht ganz einfach, aus den Paletten vom Specci, CPC und C64 plus Fehlende eine einheitliche Palette hinzubekommen, weil z.B. die Sättigungen nicht wirklich zusammenpassen. Da muss man eine ganze Menge Anpassungsarbeit leisten. Wer Lust hat, kann das ja mal probieren.

  • Ich glaube, 64 Farben sind ein guter Anfang. Vielleicht kann man die reduzieren auf 32. Wie komm ich drauf?


    Meine Grundidee ist der Farbkreis, den man als erstes im Kunstunterricht in der Schule beigebracht kriegt. Der besteht aus drei Grundfarben (rot, gelb, blau, das sind die, die sich subtraktiv nicht mischen lassen), den jeweiligen Mischungen, dazwischen im Kreis (wieder drei, die Komplementärfarben grün, violett, orange). Sind sechs Farben. Die Mischungen daraus nehmen wir auch noch dazu, sind 12 Farben. Wenn wir die in fünf Abstufungen definieren, haben wir 60 Farben, plus schwarz, weiß und zwei Grau, sind 64. Zur Veranschaulichung mal ein Farbkreisbild (allerdings hab ich da RGB als Grundlage genommen, wir sind hier ja auf Computerpfaden, also Rot, Grün und Blau als Ausgangsfarben). Das kommt dabei heraus:



    Bisschen wenig Grau, bisschen sehr wenig Braun, bisschen wenig Rot, viel zu viel Purpur, viel Blau, viel Grün. Kaum unterscheidbare helle Farben. Da kann man doch dran rumoptimieren, oder? Die reinen Farben sind im breitesten Ring in der Mitte (nach RGB definiert), alle anderen Farben hab ich daraus abgeleitet, aber nach HSL, die Luminanzen sind 25%, 33%, 50% (mittlerer Ring), 67% und 87%. Weiß in der Mitte, Schwarz rechts oben, die drei Graus haben 33%, 67% und 87% Luminanz.


    Viele gedeckte Farben. Die wenigen Graus sind schon mal ein Nachteil.


    Arndt

  • Meine Grundidee ist der Farbkreis, den man als erstes im Kunstunterricht in der Schule beigebracht kriegt. Der besteht aus drei Grundfarben (rot, gelb, blau, das sind die, die sich subtraktiv nicht mischen lassen), den jeweiligen Mischungen, dazwischen im Kreis (wieder drei, die Komplementärfarben grün, violett, orange).

    Farbkreis ist nicht schlecht aber in der Schule wird nicht immer die "reine" Lehre verbreitet. Die drei subtraktiven Grundfarben (mit denen man am meisten andere Töne erzeugen kann) sind magenta (nicht rot), cyan (nicht blau) und gelb (das stimmt). Im modernen Farbkreis liegen die additiven Grundfarben (rot, grün und blau (RGB)) jeweils dazwischen. Man ist deswegen aber nicht unbedingt gezwungen, aus diesem Kreis 6 oder 12 Farben auszuwählen. Genauso zielführend kann es sein, 8 oder 10 oder meinetwegen 13 Farben zu wählen – es gibt dort keine festen Stufen.


    Wenn wir die in fünf Abstufungen definieren, haben wir 60 Farben, plus schwarz, weiß und zwei Grau, sind 64.

    64 Farben sind schön, neben 32 mein Favorit. Dein Modell hat aber noch den Nachteil, dass gefühlt grün überproportional viel vorkommt (das hat mit unserer Wahrnehmung zu tun), dass zum schwarz hin viele Farben noch einen weiten Weg haben (blau nicht – aber gelb schon), innerhalb einer Helligkeit keine weniger gedeckten Farben vorhanden sind und gerade bei den hellsten Töne viele überflüssig sind, weil man sie eh kaum unterscheiden kann.


    Es ist natürlich ein Ausgangspunkt (der sich aber prinzipiell wenig von der Atari- oder Plus4-Palette unterscheidet). Es werden noch zu viele Farbfelder verschenkt und manche Farben sind gefühlt in der Unterzahl. Genau das wollen wir hier versuchen, zu beheben.


    Ich denke, man muss noch stärker in 3D-Farbräumen denken, um wirklich möglichst viele "sinnvolle" Farben zu erwischen.

  • Ich hatte mir damals fuer Heimat Games meine 16 Farben aus einer 9bit-RGB-Palette gewaehlt (also jede Grundfarbe 3 Bit). Die einzige Farbe, die ich dort nicht finden konnte, war ein fuer meinen Geschmack passendes Braun, daher habe ich hier eine Ausnahme gemacht und was eigenes zusammengemischt.



    Das ist jetzt mit Sicherheit nicht die beste Palette der Welt, aber ich habe versucht keine Palette zu waehlen, die jetzt nur zum Spiel passt, sondern eine, die trotzdem relativ "allgemein" gelten koennte, also auch fuer andere Spiele. Mit Sicherheit ist aber auch sie nicht passend fuer gar alles. Aber vielleicht hilft es ja dem ein oder anderen hier weiter ;)


    EDIT: Drei Farben daraus wurden uebrigens im Spiel ueberhaupt nicht verwendet, naemlich Lila, Dunkelblau und Dunkelgrau.