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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Adam P. (adamap)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
uint32_t color = 0x00ff00;  // mit dieser Farbe einfärben
uint32_t pixel = 0x969696;  // diesen Grauton einfärben
uint32_t tmp;

// Grauwert Grenze = 128, hier mit Blau geprüft
// da bei Grau immer alle Werte gleich sind.
if (pixel & 0x80)
{
   // Neuen Wert für R, B berechnen
   tmp = (pixel & 0xff);
   tmp = tmp - (255 - tmp);

   // Neue Farbe zusammensetzen
   pixel  = color;
   pixel |= (tmp << 16) | tmp;
}
else
{
   tmp = (pixel & 0xff);
   pixel = (tmp * 2) << 8;
}

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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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ß.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.