Forum: Mikrocontroller und Digitale Elektronik RGB -> HSV, HSV -> RGB verlustfrei umrechnen


von Meier (Gast)


Lesenswert?

Hallo,

gibt es eine Möglichkeit, bei der Rundungsfehler am besten nicht ins 
Gewicht fallen. Die Werte können wenn nötig auch im 16Bit vorliegen.

Wichtig wäre mir, das ich mir keine doofen Rundungsfehler einschleuse 
bei der Berechnung von Sättigung und Helligkeit.

von W.A. (Gast)


Lesenswert?

Meier schrieb:
> gibt es eine Möglichkeit, bei der Rundungsfehler am besten nicht ins
> Gewicht fallen.

Das kommt auf deinen Maßstab drauf an. Probiers mal mit 
Festkommaarithmetik.

von Georg (Gast)


Lesenswert?

Meier schrieb:
> Wichtig wäre mir, das ich mir keine doofen Rundungsfehler einschleuse

Das ist mathematisch nicht möglich. Wenn du eine Festkommazahl mit 
Multiplikation/Division in eine andere Festkommazahl umrechnest und das 
Ganze zurück, kann nicht garantiert werden, dass die ursprüngliche Zahl 
herauskommt. Besonders wenn der Wertebereich nur 0..255 ist.

Du müsstest deine Farbwerte immer als Gleitkommazahl führen (HDR) und 
nur bei der Ausgabe an entsprechende Geräte in RGB usw. umrechnen.

Georg

von Karl H. (kbuchegg)


Lesenswert?

W.A. schrieb:
> Meier schrieb:
>> gibt es eine Möglichkeit, bei der Rundungsfehler am besten nicht ins
>> Gewicht fallen.
>
> Das kommt auf deinen Maßstab drauf an.

Hätte ich jetzt auch gesagt.
Wenn man die RGB Werte im Zahlenraum 0 bis 255 als ganze Zahl benutzt 
und auch für HSV entsprechende Zahlenrräume benutzt (H 0 bis 360, S und 
V 0 bis 255) dann ist es relativ simpel eventuelle float 
Kummulierungsfehler durch eine Rundungskorrektur vor dem Niedercasten 
auf int loszuwerden. Einfach 0.5 addieren.

Ansonsten:
so gross sind die Wertebereiche dann auch wieder nicht, dass man den AVR 
mal ein paar Minuten damit beschäftigen kann, alle möglichen 
Kombinationen von RGB nach HSV und wieder zurück wandeln zu lassen und 
mit den Ausgangswerten zu vergleichen. Dann hat man die Gewähr, dass das 
für alle vorkommenden Kombinationen auch tatsächlich einwandfrei 
funktioniert, weil man es ja getestet hat
1
   for( R = 0; R < 255; R++ ) {
2
     for( G = 0; G < 255; G++ ) {
3
       for( B = 0; B < 255; B++ ) {
4
5
         rgbToHsv( R, G, B, H, S, V );
6
         hsvToRgb( H, S, V, R1, G1, B1 );
7
8
         if( R != R1 || G != G1 || B != B1 ) {
9
10
           Fehler! Auf LCD anzeigen, LED aufleuchten lassen
11
           Sirene einschalten, per UART die RGB Werte ausgeben lassen,
12
           die NSA benachrichtigen, auf Facebook und Twitter posten (ach
13
           nee, die NSA hatten wir ja schon), ....
14
         }
15
       }
16
     }
17
   }
18
19
   "alles ok" ausgeben

das mag vielleicht ein wenig dauern, aber so ein Computer hat ja Zeit. 
Überhaupt in der Nacht, während du schläfst.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Georg schrieb:
> Du müsstest deine Farbwerte immer als Gleitkommazahl führen (HDR) und
> nur bei der Ausgabe an entsprechende Geräte in RGB usw. umrechnen.

Gleitkommazahlen braucht man, wenn man einen großen Dynamikbereich 
abdecken muss oder zu faul ist, den Wertebereich der in der Rechnung 
auftretenden Zahlen vorher mal abzuschätzen. Wenn man nicht gerade eine 
FPU auf dem µC hat, ist hier auch aus Performancegründen 
Festkommaarithmetik deutlich geeigneter. Das was einem bei einer 
Gleitkommazahl für den Exponenten an Bits verloren geht, hat man bei 
gleicher Genauigkeit bei Verwendung von Festkommazahlen als zusätzlichen 
Dynamikbereich.

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.