RGB -> HSV, HSV -> RGB verlustfrei umrechnen

Gast #4384233
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.
Gast
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
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.