RGB nach HSV und HSV nach RGB

HSL und HSB (auch HSV genannt) sind Transformationen der RGB-Werte, hinter denen einfache Formeln stehen. HSL und HSB sind im Grunde genommen RGB-Farbmodelle mit anderen Koordinaten.

HSB ist nur ein anderer Name für HSV, aber HSL ist etwas anders aufgebaut.

Man kann lange darüber diskutieren, ob sich nun HSB oder HSL besser an das menschliche Verständnis von Farbe anlehnen, allenfalls könnte man ins Feld führen, dass HSL Sättigung und Helligkeit besser trennt.

Anwendungen wie Photoshop und der Farbwähler von Mac OS benutzen HSB, das W3C hat für die Notation von Farben in CSS (Stylesheets) HSL als Option eingeführt.

RGB
HSL (WEB)
HSB (Photoshop)
background
#
#

HSL und HSB (auch HSV genannt) sind nicht-lineare Transformationen des RGB-Farbraums. Die Farbwerte werden nicht über einen Lab-Farbraum umgerechnet.

Für die Transformation von RGB nach HSV bzw. nach HSV und zurück gibt es keine Matrix, aber Algorithmen:

// r,g,b-Werte zwischen 0 und 1
// h = [0,360], s = [0,1], v = [0,1]
// Wenn s == 0, dann h = -1 (undefined)
void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v) {
   float min, max, delta;
   min = MIN( r, g, b );
   max = MAX( r, g, b );
   *v = max;                        // v
   delta = max - min;
   if( max != 0 ) *s = delta / max;
   else {                           // r = g = b = 0
      *s = 0; *h = -1; return;
   }
   if (max == min) {                // hier ist alles Grau
      *h = 0; *s = 0; return;
   }
   if( r == max )
      *h = ( g - b ) / delta;       // zwischen Gelb und Magenta
   else if( g == max )
      *h = 2 + ( b - r ) / delta;   // zwischen Cyan und Gelb
   else
      *h = 4 + ( r - g ) / delta;   // zwischen Magenta und Zyan
      *h *= 60;                     // degrees
   if( *h < 0 )
      *h += 360;
}

void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v) {
   int i;
   float f, p, q, t;
   if( s == 0 ) { // achromatisch (Grau)
      *r = *g = *b = v;
      return;
   }
   h /= 60;           // sector 0 to 5
   i = floor( h );
   f = h - i;         // factorial part of h
   p = v * ( 1 - s );
   q = v * ( 1 - s * f );
   t = v * ( 1 - s * ( 1 - f ) );
   switch( i ) {
      case 0: *r = v; *g = t; *b = p; break;
      case 1: *r = q; *g = v; *b = p; break;
      case 2: *r = p; *g = v; *b = t; break;
      case 3: *r = p; *g = q; *b = v; break;
      case 4: *r = t; *g = p; *b = v; break;
      default:  // case 5:
         *r = v; *g = p; *b = q; break;
   }
}
			

RGB nach ITU Rec 709 (International Televisision Union – HDTV)

  R709        3.2404 –1.5371 –0.4985       X
[ G709 ] = [ -0.9692  1.8759  0.0415 ] • [ Y ]
  B709        0.0556 –0.2040  1.0573       Z
			
  X        0.4124  0.3575  0.1804       R709
[ Y ] = [  0.2126  0.7151  0.0721 ] • [ G709 ]
  Z        0.0193  0.1191  0.9502       B709
			

RGB Rec 709 nach RGB SMPTE 240M

  R709        0.9395  0.0501  0.0102       R240M
[ G709 ] = [  0.0177  0.9657  0.0164 ] • [ R240M ]
  B709       -0.0016  0.0043  1.0059       R240M
			

EBU 3213 nach Rec. 709

  R709        1.0440 –0.0440  0.0          REBU
[ G709 ] = [  0.0     1.0     0.0    ] • [ REBU ]
  B709        0.0     0.0117  0.9882       REBU