Klaus Karcher wrote:
I admit that the following findings might be moot, but I was surprised by the fact two entirely accurate profiles can result in a very inaccurate device link and I wonder if this issue might have negative effects in practical applications.
When I build a device link with this profiles, I get warnings as the primaries of the XYZ profile are not representable in Lab:collink -r33 -ir -or xyz.icc test5.icc xyz_test5_link.icc collink: Warning - Colorant Tag Lab value was clipped collink: Warning - Colorant Tag Lab value was clippedAnyway, I'd expect that values inside the Lab encoding range should be tolerably accurate. But that's not the case:icclu xyz_test5_link.icc 0.013713 0.022217 0.005603 [XYZ] -> Lut -> 0.116039 0.154045 0.079172 [RGB] icclu -ir -ff -pl test5.icc 0.116039 0.154045 0.079172 0.116039 0.154045 0.079172 [RGB] -> MatrixFwd -> 10.613593 -6.702353 9.566141 [Lab] # round-trip error (Delta E) = 16.4
Hi Klaus, the thing is that collink isn't smart enough to create custom per channel curves during link. It uses the per channel curves provided with the profiles, and at best modifies the obviously linear light ones with an L* like curve (ie. for matrix profiles). So you give it an XYZ cLUT base profile (xyz.icc), and it simply assumes that the curves that come with it are optimal for indexing into the cLUT. In this particular case they are not when the cLUT contains non-unity values. [Note that the warning messages "collink: Warning - Colorant Tag Lab value was clipped" apply to the colorant tag, not the table data. The device link will cope with values outside the L*a*b* range.] Now I can add a specific workaround to this to not trust XYZ cLUT per channel curves and to substitute an L* like curve that changes the scale as well to improve the cLUT table efficiency, and this improves your particular example. (I've uploaded it to <http://www.argyllcms.com/Argyll_dev_src.zip> if you wish to try it out.) Graeme Gill.