首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VC编程实现色彩空间XYZ与LAB相互转换[通俗易懂]

VC编程实现色彩空间XYZ与LAB相互转换[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-06 10:52:29
发布2022-09-06 10:52:29
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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

文章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. 理论公式
1.2. VC实例代码:

示例:

代码语言:javascript
代码运行次数:0
运行
复制
//REF_X 、REF_Y 、REF_Z 是参照白点CIE XYZ三色刺激值

         static

          double

          REF_X=96.4221;        

         static

          double

          REF_Y=100.000;

         static

          double

          REF_Z=82.5221;

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

         double

          CColorUtility::revise(

         double

          x){

          

             

         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)*x+(16.0/116.0);

             

         return

          x;

         }

         bool

          CColorUtility::_cie_xyz2lab(

         const

          double

          xyz[3],

         double

          (&lab)[3]){

          

             

         double

          x=xyz[0]/REF_X;

             

         double

          y=xyz[1]/REF_Y;

             

         double

          z=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);

              

             

         return

          true

         ;

         }

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

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

2.1. 理论公式

其中:

2.2. VC实例代码:

示例:

代码语言:javascript
代码运行次数:0
运行
复制
 // 类似Gamma函数的校正函数的反函数,LAB转XYZ时用

         double

          CColorUtility::r_revise(

         double

          x){

          

             

         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);

             

         return

          x;

         }

         bool

          CColorUtility::_cie_lab2xyz(

         const

          double

          lab[3],

         double

          (&xyz)[3]){

          

             

         double

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

             

         double

          x=y+lab[1]/500.0;

             

         double

          z=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;
  

             

         return

          true

         ;

         }

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的运算结果一致。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151193.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • VC编程实现色彩空间XYZ与LAB相互转换
    • 1. 色彩空间XYZ转LAB(CIE L*a*B*)
    • 2.色彩空间LAB(CIE L*a*B*)转XYZ
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档