VC程式設計實現色彩空間XYZ與LAB相互轉換-----改正版
阿新 • • 發佈:2019-02-04
文章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的演算法公式](http://vcsos.com/ckfinder/userfiles/images/image015.png)
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;
double
f;
//
類似Gamma函式的校正函式,XYZ轉LAB時用
double CColorUtility::revise( double x){
if (x> pow (6.0/29.0,3))
f = pow (x*1.0,1.0/3.0);
//x*1.0,否則報錯
else
f =(1.0/3.0)*pow((29.0/6.0),2)*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的運算結果一致。