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