Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3279 / 440 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 1:

Основные понятия. Представление цвета в машинной графике

Цветовая модель HLS

Цветовая модель HLS (от англ. Нue, Lightness, Saturation - тон, светлота, насыщенность) схожа с моделью HSV. Снова рассмотрим цилиндрические координаты в трехмерном евклидовом пространстве, H - угол в горизонтальной плоскость от оси Ox, S - радиус в горизонтальной плоскости (расстояние до оси Oz ), L - высота (по оси Oz ). Все цветовое пространство представляет из себя две соединенные основаниями шестигранные пирамиды (см. рис. 1.14). На рис. 1.14 для наглядности вырезан один из шести секторов.

Цветовая модель HLS.

Рис. 1.14. Цветовая модель HLS.

Как видно на рис. 1.14, эта модель получена из HSV вытягиванием вдоль вертикальной оси. Понятия H и S остались теми же, только по вертикальной оси теперь L вместо V. Концептуальное различие состоит в том, что в этой модели считается, что движение от чистых цветов (у которых L = 0,5, S = 1 ) как в направлении белого, так и черного (а не только черного, как в HSV) одинаково приводит к уменьшению информации в H (вплоть до того, что в вершинах H не определено (как впрочем, и на всей вертикальной оси S = 0 )) и сужению диапазона S.

Алгоритмы преобразования из RGB в HLS и обратно приведены ниже.

{
   // H - в градусах
   maxVal = maximum(R,G,B);
   minVal = minimum(R,G,B);
   L = (maxVal + minVal) / 2;

   if( maxVal == minVal )
   {
      S = 0;
      H = UNDEFINED;
   }
   else
   {
   if( L <= 0.5 )
      S = (maxVal - minVal)/(maxVal + minVal);
   else
      S = (maxVal - minVal)/(2 - (maxVal + minVal));

   if( R == maxVal )
      H = (G - B)/(maxVal - minVal);
   else if( G == maxVal )
      H = 2 + (B - R)/(maxVal - minVal);
   else if( B == maxVal )
      H = 4 + (R - G)/(maxVal - minVal);

      H = H * 60;
      if( H < 0 )
         H = H + 360;
   }
}
Листинг 1.9. Переход от RGB к HLS
{
   // H - в градусах

   if( S == 0 )
   {
      // находимся на оси симметрии - оттенки серого
      R = L;
      G = L;
      B = L;
   }
   else
   {
      if( L <= 0.5 )
         M2 = L * (L + S);
      else
         M2 = (L + S) - L * S;
      M1 = 2 * L - M2;

      // x mod y возвращает остаток от деления x на y

      R = Value(M1,M2,(H + 120) mod 360);
      G = Value(M1,M2,H);
      B = Value(M1,M2,(H - 120) mod 360);
   }
}

// Вспомогательная функция Value

Value( N1, N2, Hue )
{
   if( Hue < 60 )
      return N1 + (N2 - N1)*Hue / 60;
   else if( Hue < 180 )
      return N2;
   else if( Hue < 240 )
      return N1 + (N2 - N1)*(240 - Hue) / 60;
   else
      return N1;
}
Листинг 1.10. Переход от HLS к RGB