Forum: Mikrocontroller und Digitale Elektronik RGB Kanäle berechnen


von Marco (Gast)


Lesenswert?

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

von Johannes M. (johannesm)


Lesenswert?

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. ;-)

von Sven B. (scummos)


Lesenswert?

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
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Marco (Gast)


Lesenswert?

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.

von Marco (Gast)


Lesenswert?

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.

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Marco (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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

von Maxx (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.