RGB -> HSV, HSV -> RGB verlustfrei umrechnen

Gast #4384320
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
#4384323
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.
Gast #4384519
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.