从RGB到CIELAB的转换公式为
L* = 116 * (Y/Yn)^(1/3) - 16    for Y/Yn > 0.008856
L* = 903.3 * Y/Yn             otherwisea* = 500 * ( f(X/Xn) - f(Y/Yn) )
b* = 200 * ( f(Y/Yn) - f(Z/Zn) )
    where f(t) = t^(1/3)      for t > 0.008856
              f(t) = 7.787 * t + 16/116    otherwise
按照这组公式计算的话L的范围在0-100,a的范围应该是500*(1-16/116)=431(正负)
但网上一些资料说a范围是-120~+120,不知可不可信,还是我对上面公式理解有问题?
b的范围也存在类似的问题。

解决方案 »

  1.   

    主要是看f(t)之间的差值,假设t > 0.008856
        where f(t) = t^(1/3)  可以从0.20689到无穷
    而实际上X/Xn的范围是P+a /500
    Y/Yn的范围是P,所以f(X/Xn) - f(Y/Yn) = a*500
    由a的范围决定,以此类推 f(Y/Yn) - f(Z/Zn)同
      

  2.   

    即实际上X/Xn  Y/Yn Z/Zn 都是有一定范围的,反过来限制a*
      

  3.   

    “实际上X/Xn  Y/Yn Z/Zn 都是有一定范围的,反过来限制a*”
     对这句话还是不太明白,XYZ和RGB之间这样转换
       [ X ] = [  0.412453  0.357580  0.180423 ]   [ R ] 
       [ Y ] = [  0.212671  0.715160  0.072169 ] * [ G ]
       [ Z ] = [  0.019334  0.119193  0.950227 ]   [ B ]
    一般RGB 0-255,那么XYZ也是0-255,而Xn, Yn and Zn are the tristimulus
     values of the reference white,应该都是255吧。所以X/Xn完全由RGB的值决定,
    应该在0-1吧,其他类似。
    我的qq:39664054 可以私底下再交流
      

  4.   


    现在就是吃不准XnYnZn到底应该怎么取值,有知道的帮忙解释一下啊,真的很急
      

  5.   

    http://www.opensource.apple.com/darwinsource/10.2.8/cups-32.1/filter/image-colorspace.c会对于结果进行微调
      if (ciea < -127.0)
        val[1] = 128;
      else if (ciea < 0.0)
        val[1] = (int)(ciea + 256.5);
      else if (ciea > 127.0)
        val[1] = 127;
      else
        val[1] = (int)(ciea + 0.5);Xn Yn Zn的值见以下图,默认使用D65
    http://cizhnet.cn/tupian/jsfw/bzwx/0402277.jpg
      

  6.   

    非常感谢!其实关于XnYnZn的取值程序里已经给了,用的是相对值
    #define D65_X (0.412453 + 0.357580 + 0.180423)
    #define D65_Y (0.212671 + 0.715160 + 0.072169)
    #define D65_Z (0.019334 + 0.119193 + 0.950227)
    转换完后,L、a、b的范围都是0-255。和通常所说的L0-100 a、b -120--+120不太一样。
    如果想求两种颜色在色度空间的距离的话直接用上面方法求出的LAB代入公式
    ((L1-L2)^2+(A1-A2)^2+(B1-B2)^2)^1/2不知会不会有误差