1. 程式人生 > >VC程式設計實現色彩空間XYZ與LAB相互轉換-----改正版

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. 理論公式

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三色刺激值 staticdoubleREF_X=96.4221;         staticdoubleREF_Y=100.000; staticdoubleREF_Z=82.5221; double  f; // 類似Gamma函式的校正函式,XYZ轉LAB時用 doubleCColorUtility::revise(doublex){ 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);
returnx; } boolCColorUtility::_cie_xyz2lab(constdoublexyz[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(constdoublelab[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的運算結果一致。