Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

универсальные цветовые координаты LAB.

548
08 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Люди, такой вопрос, как определить к какой области или точке в видимом спектре относится изображение в универсальных цветовых координатах LAB. И как можно построить такой линейный график: по оси ординат - эта область относительно цветового спектра, по оси абсцисс - время.
391
08 апреля 2008 года
Archie
562 / / 03.02.2005
Какое еще время?
548
09 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Идёт реальное время.
1.9K
09 апреля 2008 года
andriano
474 / / 10.01.2008
И как оно связано с цветом?
548
10 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Сформулирую вопрос по-другому.
как определить к какой области или точке в видимом спектре относится изображение в (указать в универсальных цветовых координатах LAB в цветовом кубе). И как можно указать эту точку на прямой.
1.9K
10 апреля 2008 года
andriano
474 / / 10.01.2008
Если ты хочешь преобразованием координат из LAB получить RGB, то так просто это не получится, т.к. они связаны через профиль конкретного цветовоспроизводящего устройства.
Да и единого стандарта на LAB не существует.
Если хочешь чего-то другого, то попытайся сформулировать свою мысль более отчетливо.
И, заодно, о какой именно прямой ты ведешь речь.
548
10 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Я не так написал, уже отредактировал. Насчёт lab - CIE Lab.
548
10 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
По поводу прямой - нужно представить lab не в виде куба, а в виде координатной прямой.
1.9K
11 апреля 2008 года
andriano
474 / / 10.01.2008
Мне трудно представить, как трехмерное пространство можно без потерь свести к одномерному.
Боюсь, то, чего ты хочешь, в принципе невозможно.
Или ты опять что-то не так сформулировал.
548
12 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
А что с первой частью вопроса.
548
12 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Я нашёл как конвертировать rgb в lab. Сначала конвертирую rgb в xyz, а потом xyz в lab. Всегда когда я конвертирую у меня получается, что l != 0, a = 0, b = 0. Может ли быть такое? Вот исходники:
Я наткнулся на сайте http://www.easyrgb.com/math.php?MATH=M2 как конвертировать. Вот оттуда пример
Код:
Это RGB -> XYZ
var_R = ( R / 255 )        //Where R = 0 ч 255
var_G = ( G / 255 )        //Where G = 0 ч 255
var_B = ( B / 255 )        //Where B = 0 ч 255

if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
else                   var_R = var_R / 12.92
if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
else                   var_G = var_G / 12.92
if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
else                   var_B = var_B / 12.92

var_R = var_R * 100
var_G = var_G * 100
var_B = var_B * 100

//Observer. = 2°, Illuminant = D65
X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505



Код:
XYZ -> CIE Lab
var_X = X / ref_X          //ref_X =  95.047  Observer= 2°, Illuminant= D65
var_Y = Y / ref_Y          //ref_Y = 100.000
var_Z = Z / ref_Z          //ref_Z = 108.883

if ( var_X > 0.008856 ) var_X = var_X ^ ( 1/3 )
else                    var_X = ( 7.787 * var_X ) + ( 16 / 116 )
if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
else                    var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )
if ( var_Z > 0.008856 ) var_Z = var_Z ^ ( 1/3 )
else                    var_Z = ( 7.787 * var_Z ) + ( 16 / 116 )

CIE-L* = ( 116 * var_Y ) - 16
CIE-a* = 500 * ( var_X - var_Y )
CIE-b* = 200 * ( var_Y - var_Z )


Для этих преобразований я написал класс, вот его методы:
Код:
double a, b, l;

TCieLabColor::TCieLabColor(int red, int green, int blue)
{
    double x = 0, y = 0, z = 0;
    ConvertRGBToXYZ(red, green, blue, x, y, z);
    ConvertXYZToLab(x, y, z);
}

inline
double TCieLabColor::ConvertRGBComponentToXYZ(double component)
{
    if (component > 0.04045)
    {
        component = pow((component + 0.055 ) / 1.055, 2.4);
    }
    else
    {
        component = component / 12.92;
    }
    return component;
}

inline
void TCieLabColor::ConvertRGBToXYZ(double &red, double &green, double &blue, double &x, double &y, double &z)
{
    double r = red / 255;
    double g = green / 255;
    double b = blue / 255;
    r = ConvertRGBComponentToXYZ(r);
    g = ConvertRGBComponentToXYZ(g);
    b = ConvertRGBComponentToXYZ(b);
    r *= 100;
    g *= 100;
    b *= 100;
    x = r * 0.4124 + g * 0.3576 + b * 0.1805;
    y = r * 0.2126 + g * 0.7152 + b * 0.0722;
    z = r * 0.0193 + g * 0.1192 + b * 0.9505;
}

inline
void TCieLabColor::ConvertXYZToLab(double &x, double &y, double &z)
{
    double xComponent = x / 95.047;
    double yComponent = y / 100.000;
    double zComponent = z / 108.883;
    xComponent = ConvertXYZComponentToLab(xComponent);
    yComponent = ConvertXYZComponentToLab(yComponent);
    zComponent = ConvertXYZComponentToLab(zComponent);
    l = (116 * yComponent) - 16;
    a = 500 * (xComponent - yComponent);
    b = 200 * (yComponent - zComponent);
}

inline
double TCieLabColor::ConvertXYZComponentToLab(double component)
{
    if (component > 0.008856)
    {
        component = pow(component, 1 / 3 );
    }
    else
    {
        component = (7.787 * component) + (16 / 116);
    }
    return component;
}

double TCieLabColor::GetL()
{
    return l;
}

double TCieLabColor::GetA()
{
    return a;
}

double TCieLabColor::GetB()
{
    return b;
}



Второй вопрос: Как определить к какой области (точке) цветовых координат lab относится изображение?
1.9K
12 апреля 2008 года
andriano
474 / / 10.01.2008
1. Я уже писал, что взаимно-однозначного соответствия между LAB и RGB быть не может, т.к. они связаны через профиль конкретного цветовосроизводящего устройства. Соответственно, любой алгоритм, не учитывающий этого факта, неверен по определению. Собственно, что мы и имеем: взяли неверный алгоритм и получили неверный результат. Все закономерно.

2. Что такое "область цветовых координат"?

PS. Нельзя ли все-таки изъясныться по-русски?
548
12 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
А как всё-таки можно получить координаты lab TBitmap'a, и что именно неправильно в этом алгоритме.
1.9K
12 апреля 2008 года
andriano
474 / / 10.01.2008
Цитата: Maximillian_Cavalera
А как всё-таки можно получить координаты lab TBitmap'a,

А что у тебя для этого есть?

Цитата:
и что именно неправильно в этом алгоритме.

Разбираться в заведомо неверном алгоритме, извини, желания нет.

548
12 апреля 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
А можешь показать верный алгоритм перевода RGB в CIE Lab.
1.9K
12 апреля 2008 года
andriano
474 / / 10.01.2008
Верного алгоритма не знаю.
Зато знаю некоторые критерии, по которым можно отличить часть заведмо неверных алгоритмов.
В частности, алгоритм обязательно должен учитывать цветовой профиль конкретного устройства.
Поэтому и о переводе RGB-LAB тоже можно говорить лишь для одного конкретного устройства. Для другого устройства алгоритм (по крайней мере, константы) будет другим.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог