Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.65
publicStaticVoid
Сообщений: n/a
#1

Конвертирование RGB в CIE Lab - C++

12.04.2008, 13:36. Просмотров 4706. Ответов 0
Метки нет (Все метки)

Я нашёл как конвертировать rgb в lab. Сначала конвертирую rgb в xyz, а потом xyz в lab. Всегда когда я конвертирую у меня получается, что l != 0, a = 0, b = 0. Может ли быть такое? Вот исходники:
Я наткнулся на сайте http://www.easyrgb.com/math.php?MATH=M2 как конвертировать. Вот оттуда пример
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Это 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
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 )
Для этих преобразований я написал класс, вот его методы:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2008, 13:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конвертирование RGB в CIE Lab (C++):

Преобразование из YCbCr в RGB - C++
ЧЯДнТ? Формула? Код? Цветовое пространство? :help: #define BYTE uchar void MainWindow::yuv_rgb(BYTE* array, BYTE Y) { BYTE...

Массив пикселей RGB в JPEG - C++
Всем доброго времени суток! Пишу программу под МК на С/С++. На входе имею массив пикселей в формате RGB565 (2 байта/пиксель). На...

Необходимо протестировать костыль. Конвертирование Glib::ustring в sf::String - C++
Есть строка Glib::ustring, пытался её конвертировать в sf::String, и вроде бы всё работает без особых костылей, но как добрался до...

Как выделить определенный диапазон цвета RGB на картинке bmp? - C++
всем доброго времени суток!помогите,пожалуйста, в написании кода.есть картинка bmp. Надо разложить ее на цвета rgb. определить диапазон...

Помагите с Instrument LAB (ILAngularGauge и Sroll Bar)! - C++ Builder
Здраствуёте дорогие программисты!!! Начил работать с графикой в С++ Builder и вот значит такой вопрос : У меня есть Установленный индикатор...

Из colordialog в RGB - C++ Builder
Возникла некоторая проблема, как можно из компонента colordialog вместо 16го кода, который сохраняется в переменной color, получить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2008, 13:36
Привет! Вот еще темы с ответами:

RGB в INT - C++ Builder
Как перевести значение цвета RGB(100,100,100) в INT ? Чтобы потом это INT использовать для задания цвета пикселю... Пробовал int...

Стего в RGB!!! - C++ Builder
Товарищи, помогите спрятать текстовик (TXT) в картинке (BMP)!!! я конечно кое-что написал, но что-то не уверен. и до конца не сделал ((( ...

RGB в INT - C++ Builder
Как перевести значение цвета RGB(100,100,100) в INT ? Чтобы потом это INT использовать для задания цвета пикселю...

Конвертирование Ansistring в char[100] - C++ Builder
n.Desc = *FEnterPoint->leDesc->Text.c_str(); FEnterPoint->leDesc->Text - текстовое поле n.Desc - это char Desc; результат: E2277...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru