使用ICC配置文件将L*a*b*转换为RGB

3
我希望在Android/iPhone移动设备上显示正确的颜色,所以我为每个设备创建了一个ICC配置文件。我的颜色以L*a*b*(CIELAB)格式给出。从L*a*b*到RGB的转换通过XYZ颜色空间进行,并且我使用Bruce Lindbloom网站上的数学方法。
问题是,将XYZ转换为RGB的算法(不仅仅是Lindbloom网站上的),会直接将其转换为sRGB配置文件。然后我从sRGB转换为我的设备的ICC配置文件(我使用来自www.color.org的'SampleICC'库)。是否有一种方法可以直接将XYZ值转换为我的设备配置文件并跳过sRGB,最好使用SampleICC库,或者是否有任何其他应用ICC配置文件的C/C++库?...带有文档和/或示例。我希望可以获得更高的精度。
编辑: 根据@Nikita Nemkin的建议,我尝试了Little 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);

这个算法与我之前使用SampleICC库的算法(Lab -> XYZ -> sRGB -> RGB,带有自定义ICC配置文件)得到了略微不同的结果,特别是对于较暗的颜色。然而,这部分原因是因为我在第一个算法中没有调整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%可靠的软件来检查我的值?


我不确定我理解你想要什么。你想将XYZ转换为RGB而不是sRGB吗?你应该能够在许多地方找到执行此操作的公式,例如维基百科。这应该是一个两步过程,即XYZ -> RGB -> sRGB,所以如果它直接从XYZ到sRGB,我会感到惊讶。 - user2088790
顺便说一句,这是一个很棒的链接(Bruce Lindbloom的链接)。 - user2088790
现在我有线性RGB值,但它们的ICC配置文件是什么?我需要输入数据的ICC配置文件,是CIERGB.icc吗? - shelll
1个回答

2

Little CMS是一款流行的开源(MIT许可证)颜色管理库。它应该能够满足您的需求。


我使用Little CMS库编辑了我的问题,并在其中描述了其他问题的结果。 - shelll
1
尝试将 cmsFLAGS_BLACKPOINTCOMPENSATION 标志作为最后一个参数传递给 cmsCreateTransform,以启用LittleCMS中的黑点补偿。 这不是默认设置。 我不知道该信任谁。 至少LittleCMS是开源的,您可以清楚地看到内部发生的情况。 - Nikita Nemkin
1
有了那个标志,Little CMS 给出了 RGB 值(42、56、0),这些值非常接近 Photoshop 的值,所以我现在会信任它。谢谢。 - shelll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接