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.
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 ?
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.
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