Hallo. Wenn man ein RGB System hat, bei dem jeder Kanal mit 4 Bit repräsentiert wird, hat man ja nachher zum Beispiel folgendes: F00, zum Beispiel Rot, FF0, Gelb. Oder FC0, ein Orange. Oder CCC, ein Grau. Will man nun zum Beipsiel das CCC heller oder dunkler machen, also Richtung schwarz oder weiß, ziehe ich bei allen 3 Farbwerten einfach in gleichem Maße ab. Zum Beispiel addiere ich jeweils 1 bei R, G und B ab. Dann käme ich auf DDD, ein etwas helleres Grau. Aber was macht man bei FC0? Würde ich das heller machen wollen, und bei jedem Kanal 1 dazu addieren, hätte ich schon das Maximum vom roten Kanal überschritten. Was macht man also? Schneidet man dann einfach ab, und lässt den Kanal, der schon am Maximum ist, einfach da? Also würde dann aus FC0 ein FD1 werden? Oder muss man irgenwie mit einem Übertrag rechnen, so dass das, was nicht mehr auf den Roten Kanal gepasst hat, dann bei B und/oder G auch noch mit drauf kommt? Beste Grüße
Im RGB Farbraum entspricht der höchste Wert von Rot, Grün und Blau der aktuellen Helligkeit. Ist einer der Anteile bereits beim Maximum, kann man die Helligkeit nicht bei gleichem Farbton erhöhen. Wichtig ist, dass man die Verhältnisse zwischen den Farbanteilen bei behält, wenn man bei gleichbleibendem Farbton die Helligkeit verändern möchte. Mit der Helligkeit als Faktor für die Farbanteile und einer Überwachung der Wertebereiche lässt sich das recht simpel umsetzen. Jetzt darfst du wieder weitergrübeln. ;-)
In RGB irgendwas rumaddieren um hellere oder dunklere Farbtöne zu kriegen ist leider nicht besonders toll. Die Änderung des Grüntons hat ungefähr fünfmal so viel Effekt wie die des Blautons, und egal wie du deinen Algorithmus einstellst wird man immer bei einigen Farben einen zu großen und bei anderen einen zu kleinen Effekt haben. Was ich immer mache ist die Farbe in Y'UV umrechnen ( https://de.wikipedia.org/wiki/YUV-Farbmodell ); dann macht man einfach das Y' größer und rechnet wieder zurück und hat eine Farbe, die tatsächlich gleichmäßig heller erscheint als die alte. Leider sind die Umrechnungen nicht ganz trivial. Vielleicht hilft das ja.
:
Bearbeitet durch User
Marco schrieb: > Aber was macht man bei FC0? > Würde ich das heller machen wollen, und bei jedem Kanal 1 dazu addieren, > hätte ich schon das Maximum vom roten Kanal überschritten. Bei 4 bit pro Farbe kannst du da nicht viel machen, bzw. was du auch machst, die Farbe ändert sich - wird zwar heller, aber nicht mehr Orange. Und wenn du eine bestimmte Farbe heller oder dunkler machen willst, nimmst du das Verhältnis der Farben zueinander und addierst oder subtrahierst den entsprechenden Wert. Vereinfacht gesagt, wenn du 4-2-1 heller machen willst, gehst du folgendermassen: 4-2-1 8-4-2 12-6-3 und das geht schon nicht mehr: 16-8-4, aber 15-8-4 wäre auch kein grosser unterschied. Dass die Farben aber nicht dem entsprechen, was du erwartest, muss dir klar sein. Warum sollte aber jemand mit 4bit arbeiten ?
:
Bearbeitet durch User
Hi. Marc Vesely schrieb: > Marco schrieb: >> Aber was macht man bei FC0? >> Würde ich das heller machen wollen, und bei jedem Kanal 1 dazu addieren, >> hätte ich schon das Maximum vom roten Kanal überschritten. > > Bei 4 bit pro Farbe kannst du da nicht viel machen, bzw. was du auch > machst, die Farbe ändert sich - wird zwar heller, aber nicht mehr > Orange. > Und wenn du eine bestimmte Farbe heller oder dunkler machen willst, > nimmst du das Verhältnis der Farben zueinander und addierst oder > subtrahierst den entsprechenden Wert. > Vereinfacht gesagt, wenn du 4-2-1 heller machen willst, gehst du > folgendermassen: > 4-2-1 8-4-2 12-6-3 und das geht schon nicht mehr: 16-8-4, > aber 15-8-4 wäre auch kein grosser unterschied. Dass die Farben aber > nicht dem entsprechen, was du erwartest, muss dir klar sein. > Warum sollte aber jemand mit 4bit arbeiten ? Ok, also nicht addieren/subtrahieren, sondern mit einem Faktor rechnen. 4 bit ist vielleicht eine ungewöhnliche Größe, aber eigentlich stehen noch weniger Farben zur Verfügung. Jeder Kanal R,G,B, hat nur 6 mögliche Werte, nämlich 0,3,6,9,C und F. Dann kommt man auf eine Palette von 216 Farben. Dazu gibts dann noch eine Grautreppe und die Standard-VGA Farben. Der Rest ist dann frei definierbar. Von 24 Bit RGB rechne ich erst mal auf 12 Bit runter, indem ich einfach jeweils die 4 niedrigsten Bits verwerfe. Das verbliebene Nibble für R,G, B werden dann auf Werte von 0,3,6,9,C, und F gerundet. Von da aus kann ich dann per Vergleich auf die Farbtabelle die Farbnummer finden. Rechnungen, um das Bild aufzuhellen oder abzudunkeln wollte ich erst im letzten Schritt machen, bevor dann die Farbnummer aus der Tabelle gesucht wird.
Die 216 Farben und die Grautreppe mit 14 Abstufungen und die 16 Standard VGA Farben sind vorgegeben und nicht änderbar. Frei definierbar mit 24 Bit sind nur 10 Farben. Der Farbkreis von rot über Gelb Grün Blau bis Violett hat 30 Werte.
Hier mal der von mir erstellte Farbkreis unter Berücksichtigung der möglichen Werte. Allerdings würde ich diesen Farbkreis gerne heller und dunkler machen, jeweils bis auf weiß oder schwarz und unter Ausnutzung der 216 möglichen Palettenfarben. Die Standard VGA Farben werden von mir nur für Textausgabe benutzt, nicht zur Grafikdarstellung.
Marco schrieb: > Hier mal der von mir erstellte Farbkreis unter Berücksichtigung der > möglichen Werte. Autsch. Das ist ja 1-Punkt RGB, meiner Meinung nach kannst du das alles mit heller und dunkler vergessen. Meiner Meinung nach.
:
Bearbeitet durch User
Hallo. Ich hab die Farbverlaufstabelle mal weiter gemacht, damit ihr seht wie ich das meine. Alle Felder mit 0 sind ungültig oder noch nicht vorhanden. Allerdings muss irgendwo auch ein Fehler drin sein, vollständig ausgefüllt würde die Farbverlaufstablle nur 150 statt 216 Farben enthalten. Man muss sich den Farbverlauf wie eine Kugel vorstellen. Am Äquator die 30 Farbfelder. Nordpol weiß, Südpol schwarz. Vom Äquator zu den Polen hin werden die Farben entsättigt. Alle Farben aus der Farbverlaufstabelle werden dann in in die Color Lookup Table eingetragen, zusätzlich zu der Grautreppe und den 16 Standard VGA Farben. Der Farbverlauf der 216 Farben soll in alle Richtungen möglichst sanft sein, aber es dürfen eben nur 6*6*6 Farben mit fester Wertabstufung auf den Kanälen (0,3,6,9,C,F) benutzt werden.
Marco schrieb: > Aber was macht man bei FC0? > Würde ich das heller machen wollen, und bei jedem Kanal 1 dazu addieren, > hätte ich schon das Maximum vom roten Kanal überschritten. Nun, heller als das Maximum geht eben nicht. Die Farbe wird sich zwangsläufig ändern. Es überstrahlt quasi. > Was macht man also? Schneidet man dann einfach ab, und lässt den Kanal, > der schon am Maximum ist, einfach da? Kommt drauf an, wofür du das nutzt. > Ok, also nicht addieren/subtrahieren, sondern mit einem Faktor rechnen. Sozusagen. Wenn du z.B. 2,6,10 hast und den rot-Teil um 1 erhöhst, muß grün um 3 und blau um 5 erhöht werden, damit der Farbton der gleiche bleibt. Da du nur ganze Zahlen hast und enstprechend runden mußt, wird das aber meistens nicht aufgehen, und damit ändert sich der Farbton. Bei 2,5,9 zum Beispiel müßte ja 3,7.5,13.5 rauskommen. Du kannst dann z.B. 3,8,14 draus machen. Wenn du dann aber mit dieser Farbe weiterrechnest, wird sich der Farbton mit hoher Wahrscheinlichkeit wieder ändern. > Rechnungen, um das Bild aufzuhellen oder abzudunkeln wollte ich erst im > letzten Schritt machen, bevor dann die Farbnummer aus der Tabelle > gesucht wird. Ich denke, es wäre besser, wenn du das davor machst, zu einem Zeitpunkt, wo du noch mehr Bits pro Farbe zur Verfügung hast, zumindest wenn es mehr als nur genau eine einzelne Rechnung ist.
Marco schrieb: > Der Farbverlauf der 216 Farben soll in alle Richtungen möglichst sanft > sein, aber es dürfen eben nur 6*6*6 Farben mit fester Wertabstufung auf > den Kanälen (0,3,6,9,C,F) benutzt werden. Sven B. schrieb: > Was ich immer > mache ist die Farbe in Y'UV umrechnen ( > https://de.wikipedia.org/wiki/YUV-Farbmodell ); dann macht man einfach > das Y' größer und rechnet wieder zurück und hat eine Farbe, die > tatsächlich gleichmäßig heller erscheint als die alte. Leider sind die > Umrechnungen nicht ganz trivial. ich denke es wurde alles gesagt, evtl. noch das hier: http://www.mikrocontroller.net/articles/LED-Fading
Marco schrieb: > Rechnungen, um das Bild aufzuhellen oder abzudunkeln wollte ich erst im > letzten Schritt machen, bevor dann die Farbnummer aus der Tabelle > gesucht wird. Das wäre eigentlich der erste Schritt. Mit den 24 Bit zu rechnen vermeidet Rundungsfehler. Und danach dann der Floyd-Steinberg-Algorithmus
Marco schrieb: > Allerdings würde ich diesen Farbkreis gerne heller und dunkler machen, > jeweils bis auf weiß oder schwarz und unter Ausnutzung der 216 möglichen > Palettenfarben. Dann nutz doch einfach den Farbraum definiert über Farbwinkel, Helligkeit, Sättigung. Da du auf der Y Achse den Farbwinkel schon änderst, brauchst du auf der X Achse nur die Helligkeit bei konstanter Sättigung ändern. Dann das ganze in RGB Umwandeln und soviele LSB abknipsen, bis du bei deiner gewünschten 4 Bit bist. http://de.wikipedia.org/wiki/HSV-Farbraum
Marco schrieb: > Der Farbverlauf der 216 Farben soll in alle Richtungen möglichst sanft > sein, aber es dürfen eben nur 6*6*6 Farben mit fester Wertabstufung auf > den Kanälen (0,3,6,9,C,F) benutzt werden. Also, ich habe es mal so gemacht (für Ambilight und Lightshow). Es sind zwar immer noch 24Bit, aber Werte werden aus einer 256Byte Tabelle genommen, brauchte nur 1 Byte pro Wert zu übertragen.
Marco schrieb: > Von 24 Bit RGB rechne ich erst mal auf 12 Bit runter, Was, genau, willst du eigentlich machen? Was ist das Ziel? > Rechnungen, um das Bild aufzuhellen oder abzudunkeln wollte ich erst im > letzten Schritt machen, bevor dann die Farbnummer aus der Tabelle > gesucht wird. Das ist meistens keine gute Idee. Bildmanipulationen willst du möglichst früh im Prozess haben, wenn du noch über den kompletten Farbraum verfügst. Wenn es darum geht, dass du ein 24-Bit RGB Bild auf einer begrenzten Farbhardware darstellen musst, dann könnte man auch überlegen, ob man nicht zu Techniken wie "Dithering" (dein Stichwort bei Google) greift. Im Prinzip ersetzt man die fehlenden Farbmöglichkeiten dadurch, dass man zb. ein Quadrat aus 4 Pixeln zu einem logischen Superpixel zusammennimmt. Da man die 4 Pixel dann einzeln andere Farben geben kann, kriegt man bei genügend hoher Pixelauflösung den Eindruck, dass man mehr Farben darstellen kann, weil man aus genügend großer Entfernung die einzelnen Pixel nicht mehr sieht. Zb. Schwarz/Weiß Laser Drucker kriegen mit so einer Technik dann auch Graustufen hin. Aber grundsätzlich willst du deine Bildinformation so lange behalten wie du kannst und die entscheidenden abspcekenden Schritte (Farbbits reduzieren, Pixelanzahl für Breite/Höhe reduzieren) erst so spät wie möglich im Prozess haben. Denn dabei wirfst du Information weg. Und weggeworfene Information ist unwiederbringlich verloren.
Marc Vesely schrieb: > Also, ich habe es mal so gemacht (für Ambilight und Lightshow). > Es sind zwar immer noch 24Bit, aber Werte werden aus einer 256Byte > Tabelle genommen Das Konzept stammt schon aus Urzeiten der PC-Grafik (Karten mit 256 Farben). Da man aber sowieso die dargestellten 256 Farben aus einer Tabelle nimmt, besteht garkein Grund, für die Farben selbst weniger als 3 x 8 Bit zu verwenden: dann können eben 256 Farben angezeigt werden, die man aus 4 Mio. Farben beliebig wählen kann. Georg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.