大家好,又见面了,我是你们的朋友全栈君。
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实例代码:
示例:
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三色刺激值 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实例代码:
示例:
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时用 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的运算结果一致。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151193.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...