Преобразование L * a * b * в RGB с помощью профиля ICC

Я хочу отображать правильные цвета на мобильном устройстве Android / iPhone, поэтому я создал профиль ICC для каждого устройства. Мои цвета в формате L * a * b * (CIELAB). Преобразование из L * a * b * в RGB происходит через цветовое пространство XYZ, и я использую математику из Брюса Линдблума Интернет.

Проблема в том, что алгоритм преобразования XYZ в RGB (во всем Интернете, а не только в сети Lindbloom) преобразуется непосредственно в профиль sRGB. Затем я конвертирую из sRGB в профиль ICC моего устройства (я использую библиотеку SampleICC с сайта www.color.org). Есть ли способ преобразовать значения XYZ непосредственно в профиль моего устройства и пропустить sRGB, предпочтительно с использованием библиотеки SampleICC, или есть ли какая-либо другая библиотека C / C ++ для применения профилей ICC? ... с документацией и / или примерами. Я хочу это для большей точности.

РЕДАКТИРОВАТЬ: Основываясь на совете @Nikita Nemkin, я попробовал небольшую CMS, где я использовал встроенный профиль Lab и создал такое преобразование:

cmsHPROFILE outProfile = cmsOpenProfileFromFile("my_profile.icm", "r");
// Lab to RGB with custom ICC profile
g_LcmsTransform = cmsCreateTransform(cmsCreateLab4Profile(cmsD50_xyY()), TYPE_Lab_DBL, outProfile, TYPE_RGB_DBL, INTENT_RELATIVE_COLORIMETRIC, 0);

Это дает мне немного другие результаты, чем мой предыдущий алгоритм (Lab -> XYZ -> sRGB -> RGB с настраиваемым профилем ICC) с использованием библиотеки SampleICC, особенно для более темных цветов. Это частично, потому что я не адаптирую более темные цвета в преобразовании Lab -> XYZ в моем первом алгоритме. Действительно плохо, что оба этих преобразования дают разные результаты, чем преобразование в Photoshop. Например:

Lab (18, -30, 70) is sRGB (0, 54, 0)
SampleICC RGB (39, 57, 24)
SampleICC RGB with proper dark colors handling (45, 57, 24)
LittleCMS RGB (39, 54, 0)
Photoshop RGB (45, 55, 0)

все преобразования выполняются с относительным колориметрическим намерением, и в Photoshop я использовал компенсацию черной точки и движок Adobe. Какому номеру я должен доверять? Есть ли 100% надежное программное обеспечение для проверки моих ценностей?


person shelll    schedule 06.06.2013    source источник
comment
Я не уверен, что понимаю, что вы хотите. Вы хотите преобразовать XYZ в RGB, а не в sRGB? Вы должны найти формулу для этого во многих местах, например в Википедии. В любом случае это должен быть двухэтапный процесс XYZ - ›RGB -› sRGB, поэтому я был бы удивлен, если бы он сразу перешел с XYZ на sRGB.   -  person    schedule 06.06.2013
comment
Отличная ссылка (ссылка Брюса Линдблума) Кстати.   -  person    schedule 06.06.2013
comment
Теперь у меня есть линейные значения RGB, но каков их профиль ICC? Мне нужен ICC-профиль входных данных, это CIERGB.icc?   -  person shelll    schedule 06.06.2013


Ответы (1)


Little CMS - популярная библиотека управления цветом с открытым исходным кодом (лицензия MIT). Он должен уметь делать то, что вы хотите.

person Nikita Nemkin    schedule 06.06.2013
comment
Я отредактировал свой вопрос с результатами с помощью библиотеки Little CMS, где описал другие проблемы ... - person shelll; 07.06.2013
comment
Попробуйте передать cmsFLAGS_BLACKPOINTCOMPENSATION флаг в качестве последнего параметра в cmsCreateTransform, чтобы включить компенсацию черной точки в LittleCMS. Это не по умолчанию. Я понятия не имею, кому доверять. По крайней мере, LittleCMS имеет открытый исходный код, и вы можете точно увидеть, что происходит внутри. - person Nikita Nemkin; 07.06.2013
comment
с этим флагом Little CMS дает мне значения RGB (42, 56, 0), которые очень похожи на значения Photoshop, так что пока я буду доверять ему. Спасибо. - person shelll; 10.06.2013