从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的范围也存在类似的问题。
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的范围也存在类似的问题。
解决方案 »
- WTL BEGIN_MSG_MAP宏的讨论
- 谈谈工作,谈谈钱
- 当了版主,大家有空多捧场
- 用Socket可以在服务器端主动建立TCP/IP连接嘛?
- 怎样将vc里得flash得显示窗口调大呢?急!在线等!!请各位帮帮忙
- 关于CListCtrl控件可以添加注释的问题。
- 请你来帮我确定
- 动态修改程序的程序应该怎么写?
- 如何在onselectchange的时候得到CComboBox的当前选择的项的字符串值?
- 如何在控制台程序中(此时VBVC的向导都用不上),使用ACTIVEX控件??
- [转]一个学IT人看到日美软件后感到震撼,深深感受到了差距,这个差距真的要用50年来做比较(认识自己才能发展)
- 请推荐一本比较好的介绍MFC的书
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)同
对这句话还是不太明白,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 可以私底下再交流
现在就是吃不准XnYnZn到底应该怎么取值,有知道的帮忙解释一下啊,真的很急
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
#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不知会不会有误差