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