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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ GNU в Windows http://www.cyberforum.ru/cpp/thread7289.html
Всем привет! Подскажите как можно собирать (скомпилировать) библиотеки gnu в windows. Последние три часа бьюсь с libgcrypt . В readme нашел такое: To build libgcrypt for Microsoft Windows, you need to have the mingw32 cross-building toolchain installed. Instead of running a plain configure you use
C++ Скорость выполнения запросов в SQLite Здравствуйте! Собственно, мне нужно осуществлять динамическую запись в журнал происходящих в программе изменений. Делаю это с помощью базы данных SQLite. Пишу на С++, используя исходные тексты на С - sqlite-source-3_3_15. Хотелось бы оптимизировать скорость выполнения записи в таблицу. Так как вставка записей в таблицу (INSERT) происходит очень часто (несколько сотен в секунду), то программа... http://www.cyberforum.ru/cpp/thread7070.html
C++ Запуск файла на исполнение
Нужна функция (или кусок кода позволяющий это делать). Проблема такова, необходимо запускать 5-6 программ из програмулены написанной на С++, но как это сделать непонятно, нужна функция позволяющая делать это, MSDN чет ничего толкового мне не выдал, решил спросить тут.
Cоздание WAVE-файла C++
Здравствуйте. Пишу программу по созданию WAVE-файла, кодирующую строку текста каким-нибудь видом модуляции (амплитудная, частотная). Не подскажите как это сделать?
C++ Система информирования http://www.cyberforum.ru/cpp/thread6841.html
Люди Помогите советом Нужно создать систему, выбирающую по ключевым словам из отчета о новинках информацию, необходимую для определенных специалистов и рассылает им на email или sms. Новые отчеты поступают раз в квартал. И потом возможно нужно будет добавить функцию поиска в архиве. Сказали, что в С++ сложно сделать, в Delphi легче. Но я знаю только С на нач уровне. Может подскажите...
C++ Своя файловая система (диск пару mb) Имеется устройство с флэш-памятью на несколько мегабайт. Нужно написать файловую систему, дабы хранить на нем файло, писать и читать с него. Устройство под управлением микроконтроллера, так что команд совсем немного: чтение по 64 байта за фрейм и запись по 32 байта за фрейм. Вот сижу придумываю, но затык на фрагментации. Порылся в нэте — что-то ничего толкового не увидел. Поможите люди добрые,... подробнее

Показать сообщение отдельно
publicStaticVoid
Сообщений: n/a

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

12.04.2008, 13:36. Просмотров 4692. Ответов 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; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru