Forum: PC-Programmierung RGB Pixel Färben (Einfärben) - Algorithmus


von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vllt. kennt ihr unter Gimp oder anderen Programmen die Funktion
"Färben" oder "Einfärben".
Mit dieser kann man ein Pixel in eine andere Farbe umfärben.

Diese Funktion benötige ich für mein µC Projekt um ein Bild (Graustufen) 
dynamisch mit einer Farbe einzufärben.
Ich benötige zwar nur den Farbverlauf von Rot über Gelb nach Grün,
aber das Verfahren sollte ja gleich sein.

Für eine Vollfarbe (z.B. Grün = 0x00ff00) habe ich es hinbekommen,
mit (Gelb = 0xffff00) funktioniert es auch...
aber für 0xff6400 sieht die Geschichte schon etwas schwerer aus, da hat 
das Grün auch noch ein eigenes Intervall.

Was ich bis jetzt habe (für Vollfarbe)
hier lediglich am Bsp. mit Grün:
1
uint32_t color = 0x00ff00;  // mit dieser Farbe einfärben
2
uint32_t pixel = 0x969696;  // diesen Grauton einfärben
3
uint32_t tmp;
4
5
// Grauwert Grenze = 128, hier mit Blau geprüft
6
// da bei Grau immer alle Werte gleich sind.
7
if (pixel & 0x80)
8
{
9
   // Neuen Wert für R, B berechnen
10
   tmp = (pixel & 0xff);
11
   tmp = tmp - (255 - tmp);
12
13
   // Neue Farbe zusammensetzen
14
   pixel  = color;
15
   pixel |= (tmp << 16) | tmp;
16
}
17
else
18
{
19
   tmp = (pixel & 0xff);
20
   pixel = (tmp * 2) << 8;
21
}

Im oberen Bereich (hell) stimmen die Werte mit der Grafik überein,
für den unteren Bereich (RGB < 127) ist das Grün angenährt +- 2 ca.

Habt ihr evtl. eine Idee wo ich was finden könnte?
Hab nach verschiedenen Wörtern gesucht, aber das große G liefert nicht 
wirklich was brauchbares zu diesem Thema.

Falls es doch eher unter Mikrocontroller / Display fällt, dann gerne 
verschieben.

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wenn Helligkeit zu Farbe konvertiert werden soll ist die Verwendung des 
HSV-Farbmodelles nicht ganz unclever, weil man dort Farbe (Hue), 
Sättigung (Saturation) und Helligkeit (Value) zunächt getrennt vorliegen 
hat und getrennt beeinflussen kann. Erst für die Ausgabe wird dann nach 
RGB konvertiert, weil die allermeisten Geräte RGB-Werte brauchen.

Für dein eingefärbtes Graustufenbild belegst du H und S mit festen 
Werten und V übernimmst du direkt (bzw. skaliert/gemapt) aus den 
Grauwerten des Bildes. Durch eine Änderung von H kannst du beliebige 
Farbskalen einstellen, auch kannst du ja anteilig den V-Wert auch auf H 
wirken lassen und du erhältst "Falschfarbenbilder" wie z.B. aus einer 
Thermokamera ...

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Frank E. schrieb:
> Wenn Helligkeit zu Farbe konvertiert werden soll ist die Verwendung des
> HSV-Farbmodelles nicht ganz unclever, weil man dort Farbe (Hue),
> Sättigung (Saturation) und Helligkeit (Value) zunächt getrennt vorliegen
> hat und getrennt beeinflussen kann.

ja das war auch erst meine idee....
problem war, das "ulead photoimpact" hat meine vorlage  falsch gefärbt 
und ich kam zu keinem ergebnis.
kaum hab ich es mit gimp probiert, stimmte die vorlage mit der theorie, 
aber dann hab ich es gar net mehr mit HSV probiert.

aber werd ich gleich mal ausprobieren.

ich nutze zum OLED halt RGB565 und da muss ich jeden pixel jetz schon in 
RGB888
umrechnen und verarbeiten, wollte mir die Umrechnung in HSV sparen.
Aber ich werd es probieren... Die 1 ms mehr oder weniger 😉

danke erstmal.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

was mir jedoch aufgefallen ist,
ein HSV wert kann bis zu 2-3 unterschiedliche RGB werte beinhalten.
das wäre ja etwas ungenau.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Adam P. schrieb:
> was mir jedoch aufgefallen ist,
> ein HSV wert kann bis zu 2-3 unterschiedliche RGB werte beinhalten.
> das wäre ja etwas ungenau.

HSV ist ein Farbmodell, kein Farbraum, deshalb theoretisch unbegrenzt.


Hue wird in Grad angegeben (wegen des Farbkreises, alle 60 Grad eine der 
Grundfarben), S und V entweder in Prozent oder 0...255. Diese 
"Auflösung" hängt von der konkreten Implementierung ab, z.B. ob Int oder 
Double und welche interne Bitbreite/Genauigkeit.

von Adam P. (adamap)


Lesenswert?

Frank E. schrieb:
> Hue wird in Grad angegeben (wegen des Farbkreises, alle 60 Grad eine der
> Grundfarben), S und V entweder in Prozent oder 0...255.

Das war mir bewusst.... nur der zusammenhang der umrechnung nicht.

die infos helfen mir erstmal, ich werd mal versuchen eine funktion zu 
erstellen.

... ich meld mich.

von Ralf G. (ralg)


Lesenswert?

Adam P. schrieb:
> Diese Funktion benötige ich für mein µC Projekt um ein Bild (Graustufen)
> dynamisch mit einer Farbe einzufärben.
> Ich benötige zwar nur den Farbverlauf von Rot über Gelb nach Grün,
> aber das Verfahren sollte ja gleich sein.

Für mich liest sich das so:
- Vorlage ein Graustufenbild
- Ergebnis weiß-> rot, schwarz -> grün, grau -> je nach Helligkeit von 
orange  über gelb nach lindgrün
Ist das so richtig? - Da wäre dann allerdings nicht das, was dein Bild 
im Eingangspost aussagt.

Adam P. schrieb:
> "ulead photoimpact" hat meine vorlage  falsch gefärbt

Das ist schon richtig gefärbt ;-) Eventuell hast du einen falschen 
Filter ausgewählt. Falls meine obige Annahme richtig ist, dann ist das 
so speziell, da gibt's dann wahrscheinlich keinen fertigen Filter in 
einem Bildbearbeitungsprogramm.

(HSV-Modell an der Stelle ist eine Sackgasse.)

von c-hater (Gast)


Lesenswert?

Ralf G. schrieb:

> (HSV-Modell an der Stelle ist eine Sackgasse.)

Kommt drauf an, was genau als Ziel gewünscht ist. So richtig klar konnte 
der TO sich da ja bisher nicht ausdrücken...

Das Übliche wäre: Mapping von Graustufen auf einen möglichst 
kontrastreichen Farbverlauf konstanter Helligkeit. Dafür ist NATÜRLICH 
HSV das am Besten passende Modell, sowohl für die Quelle als auch für 
das Ziel. Das Mapping ist sehr simpel: Map(Quelle.V)->Ziel.H (mit 
Ziel.S=max, Ziel.V=const)

Generell arbeitet es sich bei der Bildbearbeitung im HSV-Modell 
praktisch immer sehr viel einfacher als im RGB-Modell.

von Adam P. (adamap)


Lesenswert?

Ralf G. schrieb:
> Adam P. schrieb:
>> "ulead photoimpact" hat meine vorlage  falsch gefärbt
>
> Das ist schon richtig gefärbt ;-)

ich schick dir ein Bsp., weil es linear abnehmen sollte, und ich extra 
ein 255 pixel breites fenster genommen habe...... da war mit photoimpact 
bei 106 pixel schluss... obwohl es 127 sein sollten, so wie es gimp 
gemacht hat.

ich schreib morgen mal meine vorgehensweise auf, aber es gab ein 
unterschied und gimp hat es der theorie nach richrig gemacht, wie im 
anhang zu sehen....

max farbe von grün bis pixel von graustufe 128/127

von Adam P. (adamap)


Lesenswert?

hey c-hater,

ja ok.... ich gebe dir recht.
ich werde es nochmal genauer formulieren,
norgen früh.

kann sein, dass wir einander vorbei reden.

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Kommt drauf an, was genau als Ziel gewünscht ist. So richtig klar konnte
> der TO sich da ja bisher nicht ausdrücken...

Also anbei eine kleine Erklärung...

hoffe es hilft, sonst einfach fragen!
Aber es geht echt nur um die "Einfärbung" von Grauabstufungen.

Werde die vorgeschlagenen Methoden morgen probieren, habe jetz
erstmal die PDF für euch erstellt.

Gruß

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Adam P. schrieb:

> Also anbei eine kleine Erklärung...
>
> hoffe es hilft, sonst einfach fragen!

Ja, hat geholfen. Ganz klar: Hausaufgabe. Lös' sie selber, ist trivial.

Solche Hausaufgaben werden Leuten gestellt, die sie lösen können müßten.

Aber eins möchte ich noch sagen: für genau diese Aufgabe bringt der 
Ausflug in's HSV-System wirklich keinen Vorteil, da hatte Ralf G. schon 
Recht.

Vermutlich hat er die Aufgabe trotz der unvollständigen Angaben schon 
"vorzeitig" erkannt. Könnte sein, dass er sogar der Aufgabensteller war 
und gezielt nach solche Anfragen in den einschlägigen Foren sucht ;o)

Ja, es wird schwieriger, zu bescheißen. Und da ist auch sehr gut so...

von Adam P. (adamap)


Lesenswert?

c-hater schrieb:
> Solche Hausaufgaben werden Leuten gestellt, die sie lösen können müßten.

hausaufgaben?

ja ganz ernsthaft.... vergisst es einfach, wie so oft werde ich diesen 
Post wohl mit meiner eigenen antwort schliessen, weil keiner helfen 
kann.

aber wie schön das c-hater, allwissend ist und trotzdem kein algo. 
liefern kann.....
ich dacht er hätte echt ahnung, durch seine qualifizierten aussagen (ab 
und zu).

ich werds machen, denn

open source 4 life

... keine hausaufgabe..... bin alt genug und will es einfach nur 
wissen..... da wissen einem keiner nehmen kann!

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Adam P. schrieb:

> aber wie schön das c-hater, allwissend ist und trotzdem kein algo.
> liefern kann.....

Der "Algo" nennt sich "Verhältnisgleich" AKA "Dreisatz". Superprimitiver 
Scheiß, den eigentlich jeder so ca. ab 6. Klasse vollständig beherrschen 
sollte.

Der Trick ist für eine beliebige Zielfarbe (also abseits der reinen 
Farben), dass du drei dieser Gleichungen mit drei verschiedenen 
Scaling-Faktoren für die Transformation brauchst. Das ist schon alles.

Tipp: alle üblichen Bildverarbeitungsprogramme können sowas. Nur die 
Namen der entsprechenden Filter unterscheiden sich...

von Adam P. (adamap)


Lesenswert?

c-hater schrieb:
> Dreisatz

leider ist es nicht nur ein dreisatz.... wenn du es dir mal genau 
anschaust.
ja es ist linear, aber 2 geteilt.

je nach ausgangswert verhält es sich anders.
ich hab es schon erkannt, aber nen dreisatz ist es nicht.

und das es jedes prog. kann weiß ich auch.... aber ich brauch halt das 
verfahren.

und wenn es nur nen dreisatz ist... dann hau mal raus die funktion in 
C.....

von Ralf G. (ralg)


Lesenswert?

Jetzt verstehe ich, was du meinst. (Glaube ich.)

Adam P. schrieb:
> und wenn es nur nen dreisatz ist... dann hau mal raus die funktion in
> C.....

Das ist ja wirklich nur (ein) Dreisatz.
'Helligkeit * Farbanteil(r,g,b) / 256 -> angezeigte Farbe(r,g,b)'
Hier läuft das erstmal von schwarz nach 'Farbe'!
Nun willst du ja noch den Glanz berücksichtigen. Dazu legst du einen 
Schwellwert fest, bis zu dem die Farbe gerechnet werden soll (das ist 
vielleicht nicht einmal genau die Mitte, wie in deinem Versuch).
Für Werte <= Schwelle:
  'Helligkeit * Farbanteil(r,g,b) / Schwellwert -> angezeigte 
Farbe(r,g,b)'
Ist die Schwelle überschritten, rechnest du den Rest von 'Farbe' nach 
'weiß'.



------------------------------
Schwellwert ist wahrscheinlich doch in der Mitte, da der nichtlineare 
Helligkeitsverlauf, der bei der Beleuchtung des Zylinders entsteht, ja 
schon in den Grauwerten 'codiert' ist.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Adam P. schrieb:
> Also anbei eine kleine Erklärung...
>
> hoffe es hilft, sonst einfach fragen!

Dein PDF passt nicht zu dem Bild aus dem Ursprungsposting. In ersterem 
wird nämlich aus schwarz grün, während im anderen schwarz so bleibt.

von c-hater (Gast)


Lesenswert?

Adam P. schrieb:

> leider ist es nicht nur ein dreisatz.... wenn du es dir mal genau
> anschaust.

Nö, es sind drei, wie schon gesagt.

> ja es ist linear, aber 2 geteilt.

Unsinn. Es sind einfach drei superprimitive Dreisatze (also ihne 
irgendwelche Offsets), nur mit jeweils einem anderen Faktor für die 
Steigung.

> ich hab es schon erkannt, aber nen dreisatz ist es nicht.

Ja, es ist nicht einer, sondern es sind drei. Wie oft muss das noch 
wiederholt werden, bis du es kapierst?

> und das es jedes prog. kann weiß ich auch.... aber ich brauch halt das
> verfahren.

Einfach mal darüber nachdenken, was diese Programme tun? Oder sogar in 
die Quellen schauen, denn einige davon sind ja OpenSource?

> und wenn es nur nen dreisatz ist... dann hau mal raus die funktion in
> C.....

Das findest du dann im Quelltext eben dieser Programme, wenn du zu blöd 
bist, selber drei einfache lineare Mappings in C umzusetzen. Naja, 
vielleicht nicht unbedingt in C, aber der Scheiß ist so primitiv, dass 
er in jeder Hochsprache doch sehr, sehr ähnlich aussieht...

von Tabellenbuch (Gast)


Lesenswert?

Aus der Frage wird nicht ganz klar, ob nun nur das Graustufen-Bild 
dynamisch ist, oder ob auch der Farbverlauf dynamisch geändert werden 
soll...

Wenn der Farbverlauf fix ist, mach eine schnöde Lookup-Tabelle

8Bit Graustufe -> 16Bit RGB565 Farbwert.

Kannst du meinetwegen mit Gimp anlegen (als 1px × 256px Bild, und im 
build-Prozess dann in dein Projekt mit reinkompilieren)

ist schnell gebaut, in der Laufzeit unschlagbar, und braucht vermutlich 
trotz 512 Byte Table weniger Flash als eine Umrechung über HSV mit 
Double-Precision-Komponenten.


Wenn der Farbverlauf dynamisch wechselbar sein muss, hängt's von der 
Bildgröße und verfügbaren RAM ab. Kann gut sein dass sich dann das 
Vorberechnen einer solchen Tabelle im Arbeitspeicher immer noch lohnt.

von Adam P. (adamap)


Lesenswert?

Hallo zusammen,

danke für die Ideen mit dem HSV Farbraum, damit hat es funktioniert.

H = 120° * Ladezustand_in Prozent / 100;
S & V ergeben sich aus dem Grauwert.
HSV -> RGB konvertieren.

Ja mit HSV ist es wirklich ein Dreisatz.

Danke & Gruß.

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.