VC编程实现色彩空间XYZ与LAB相互转换

VC编程实现色彩空间XYZ与LAB相互转换

tian_110 2015-05-08 09:55:28 3024 收藏

文章VC编程实现色彩空间RGB与XYZ相互转换已经介绍了RGB与XYZ色彩空间的转换算法以及实际的VC源代码,在上一篇文章已经提到,在PhotoShop中经常使用有RGB(红色、绿色、蓝色)、CMYK(青色、洋红、黄 色、黑色)、HSB(色相、饱和度、亮度)和Lab4中色彩空间。我们用到XYZ色彩空间的目的是进行RGB与LAB色彩空间转换的中介,承接前文,本文将介绍XYZ与LAB色彩空间之间的转换方法,并列出具体的算法公式和VC源代码。

1. 色彩空间XYZ转LAB(CIE L*a*B*)

1.1. 理论公式

XYZ转LAB的算法公式

XYZ色彩空间转LAB色彩空间的公式
XYZ色彩空间转LAB色彩空间公式

 

1.2. VC实例代码:

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

//REF_X 、REF_Y 、REF_Z 是参照白点CIE XYZ三色刺激值

staticdouble REF_X=96.4221;        

staticdouble REF_Y=100.000;

staticdouble REF_Z=82.5221;

// 类似Gamma函数的校正函数,XYZ转LAB时用

doubleCColorUtility::revise(doublex){

    if(x>pow(6.0/29.0,3))

        x=pow(x,1.0/3.0);

    else

        x=(1.0/3.0)*(29.0/6.0)*(29.0/6.0)*x+(16.0/116.0);

    returnx;

}

boolCColorUtility::_cie_xyz2lab(constdouble xyz[3],double(&lab)[3]){

    doublex=xyz[0]/REF_X;

    doubley=xyz[1]/REF_Y;

    doublez=xyz[2]/REF_Z;

 

    x=revise(x);

    y=revise(y);

    z=revise(z);

 

    lab[0]=(116.0*y)-16.0;

    lab[1]=500.0*(x-y);

    lab[2]=200.0*(y-z);

     

    returntrue;

}

到此,便使用VC编程实现了色彩空间XYZ到LAB的转换,下面我们来看看其逆变换,即LAB转XYZ的具体理论和实现:

2.色彩空间LAB(CIE L*a*B*)转XYZ

2.1. 理论公式

色彩空间LAB转XYZ理论计算公式
其中:色彩空间LAB转XYZ计算公式

 

2.2. VC实例代码:

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

// 类似Gamma函数的校正函数的反函数,LAB转XYZ时用

doubleCColorUtility::r_revise(doublex){

    if(x>6.0/29.0)

        x=pow(x,3.0);

    else

        x=(x-16.0/116.0)*3*pow(6.0/29.0,2);

    returnx;

}

boolCColorUtility::_cie_lab2xyz(constdouble lab[3],double(&xyz)[3]){

    doubley=(lab[0]+16.0)/116.0;

    doublex=y+lab[1]/500.0;

    doublez=y-lab[2]/200.0;

 

    y=r_revise(y);

    x=r_revise(x);

    z=r_revise(z);

 

    xyz[0]=x*REF_X;

    xyz[1]=y*REF_Y;

    xyz[2]=z*REF_Z;

 

    returntrue;

}

REF_X 、REF_Y 、REF_Z 是参照白点CIE XYZ三色刺激值,与色彩空间XYZ转LAB的取值一样。到此,便使用VC编程实现了色彩空间LAB到XYZ的转换,本文介绍了LAB色彩空间与XYZ色彩空间的正变换和逆变换,结合前文,便实现了RGB->XYZ->LAB色彩空间的变换,同样也可以实现LAB->XYZ->RGB逆变换。为方便读者理解,给出了具体的计 算公式和实际源码。VC图形图像处理编程博大精深,有任何建议欢迎留言讨论,后续文章我们将继续介绍VC编程实现其它色彩空间之间的相互转换。

本系列程序均在Win7+VS2008测试通过,并且结果与PS3的运算结果一致。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值