On Thursday 21 June 2007 08:42, Ian McGonigal wrote:
> Hi,
>
> I am trying to build a profile that I can use in photoshop to imitate a
> LUT that I use in Shake. I use the forward sampler to go from RGB to
> LAB, converting each RGB sample by calling a function to apply the lut
> to that value then converting to LAB. The code looks something like this:
>
> int forward(unsigned short *in, unsigned short *out, void *lut) {
>
>   transformValue(lut, in);
>
>   float rgb[3] = {float(in[0])/65535, float(in[1])/65535,
> float(in[2])/65535};
>   float lab[3];
>
>   rgb2lab(rgb, lab);
>
>   cmsCIELab cmsLab;
>   cmsLab.L = lab[0];
>   cmsLab.a = lab[1];
>   cmsLab.b = lab[2];
>
>   cmsFloat2LabEncoded(out, &cmsLab);
>
>   return 0;
>
> }
>
> The calculation I use to convert from RGB to LAB comes from
> http://www.easyrgb.com/math.php . When I 'burn in' the input profile to
> an image using tifficc most colours get very close to what the Shake LUT
> does but some are still not quite there. I'm wondering if there is a
> correct calculation to use, or a better way of using lcms to get closer.
>
> One other issue is that when I convert from LAB to RGB in the reverse
> sampler, the majority of RGB values are out of gamut. This is
> unsurprising since LAB has a much larger gamut than RGB but it means
> that only a small number of samples are actually contributing which
> further reduces the accuracy. Is there a better way to do this that will
> allow more, or all, samples to contribute?
>
> Any hints or tips appreciated!
>
> Thanks,
> Ian

Some observations but I don't know if these will help.

I assume that your RGB to Lab conversion first does an RGB to XYZ conversion 
and then converts from XYZ to Lab using the algorithms from the web site.  
The RGB to XYZ conversion algorithm given on that web page assumes the 
following about the RGB values:

1. sRGB gamma curve
2. D65 white point
3. 8 bits per channel

It is basically a matrix conversion with some added logic to linearize the 
gamma, and also corrects for the fact that sRGB uses a compound gamma curve, 
before applying the matrix.  If the above are not true the conversion will 
give incorrect results.  Therefore unless what is returned by the call to 
transformValue(lut, in) is in the sRGB color space the conversion is not 
valid.

In addition, I assume you are doing the conversion in the call to rgb2lab(rgb, 
lab) but you did not include that code.  The algorithm from the web site 
normalizes the RGB values to a 0.0 to 1.0 range (var_R = (R/255)) before 
converting the gamma to linear and then renormalizes to a 0.0 to 100.0 range 
before applying the conversion matrix.  But I see in your code that you are 
normalizing to a 0.0 .. 1.0 range before calling rgb2lab(rgb, lab).   Could 
this be an issue?

I am not sure why you are hand coding the XYZ to Lab conversion (of course 
since I can't see the code I am not sure your are either) since this is 
available off the self in lcms.  In addition, the lcms function allows you to 
specify the white point to be used for the conversion.

The reverse transform would be converting to an sRGB color space since this is 
the assumed input to the forward transform.   In theory, if the forward 
transform is actually working correctly it should not create any values in 
the Lab space that are outside of the input colors spaces gamut and applying 
the reverse transform to any values that are the result of the forward 
transform should only return values that are in gamut.  Of course, some 
quantitization error will exist and some of the values from the return trip 
will likely fall just out side of the starting gamut but by a very small 
amount.

I also see some things you have written that indicate that you may not 
understand of how this works at a fairly basic level.  Specifically "This is 
unsurprising since LAB has a much larger gamut than RGB..."  Much larger than 
the gamut of which RGB color space?  This is certainly true for sRGB (perhaps 
this is what you intended to write) in which case we are talking about a 
specific well characterized RGB color space.  But there are other RGB color 
spaces that are much larger than sRGB that are used by at least some users.  
One example is ProPhotoRGB which is almost as large as the Lab space.  In 
addition, although it might not be useful, it would be possible to define an 
arbitrary RGB color space that is much larger than the Lab color space.  In 
other words unless we are talking about specific well characterized color 
spaces terms like larger and smaller are meaningless.

Hal

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Lcms-user mailing list
Lcms-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lcms-user

Reply via email to